index.js 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var component_1 = require('./../common/component.js');
  4. var touch_1 = require('./../mixins/touch.js');
  5. component_1.VantComponent({
  6. mixins: [touch_1.touch],
  7. classes: ['nav-class', 'tab-class', 'tab-active-class', 'line-class'],
  8. relation: {
  9. name: 'tab',
  10. type: 'descendant',
  11. linked: function linked(child) {
  12. this.child.push(child);
  13. this.updateTabs(this.data.tabs.concat(child.data));
  14. },
  15. unlinked: function unlinked(child) {
  16. var index = this.child.indexOf(child);
  17. var tabs = this.data.tabs;
  18. tabs.splice(index, 1);
  19. this.child.splice(index, 1);
  20. this.updateTabs(tabs);
  21. }
  22. },
  23. props: {
  24. color: String,
  25. sticky: Boolean,
  26. animated: Boolean,
  27. swipeable: Boolean,
  28. lineWidth: {
  29. type: Number,
  30. value: -1
  31. },
  32. lineHeight: {
  33. type: Number,
  34. value: -1
  35. },
  36. active: {
  37. type: Number,
  38. value: 0
  39. },
  40. type: {
  41. type: String,
  42. value: 'line'
  43. },
  44. border: {
  45. type: Boolean,
  46. value: true
  47. },
  48. duration: {
  49. type: Number,
  50. value: 0.3
  51. },
  52. zIndex: {
  53. type: Number,
  54. value: 1
  55. },
  56. swipeThreshold: {
  57. type: Number,
  58. value: 4
  59. },
  60. offsetTop: {
  61. type: Number,
  62. value: 0
  63. }
  64. },
  65. data: {
  66. tabs: [],
  67. lineStyle: '',
  68. scrollLeft: 0,
  69. scrollable: false,
  70. trackStyle: '',
  71. wrapStyle: '',
  72. position: ''
  73. },
  74. watch: {
  75. swipeThreshold: function swipeThreshold() {
  76. this.set({
  77. scrollable: this.child.length > this.data.swipeThreshold
  78. });
  79. },
  80. color: 'setLine',
  81. lineWidth: 'setLine',
  82. lineHeight: 'setLine',
  83. active: 'setActiveTab',
  84. animated: 'setTrack',
  85. offsetTop: 'setWrapStyle'
  86. },
  87. beforeCreate: function beforeCreate() {
  88. this.child = [];
  89. },
  90. mounted: function mounted() {
  91. var _this = this;
  92. this.setLine(true);
  93. this.setTrack();
  94. this.scrollIntoView();
  95. this.getRect('.van-tabs__wrap').then(function (rect) {
  96. _this.navHeight = rect.height;
  97. _this.observerContentScroll();
  98. });
  99. },
  100. destroyed: function destroyed() {
  101. this.createIntersectionObserver().disconnect();
  102. },
  103. methods: {
  104. updateTabs: function updateTabs(tabs) {
  105. tabs = tabs || this.data.tabs;
  106. this.set({
  107. tabs: tabs,
  108. scrollable: tabs.length > this.data.swipeThreshold
  109. });
  110. this.setActiveTab();
  111. },
  112. trigger: function trigger(eventName, index) {
  113. this.$emit(eventName, {
  114. index: index,
  115. title: this.data.tabs[index].title
  116. });
  117. },
  118. onTap: function onTap(event) {
  119. var index = event.currentTarget.dataset.index;
  120. if (this.data.tabs[index].disabled) {
  121. this.trigger('disabled', index);
  122. } else {
  123. this.trigger('click', index);
  124. this.setActive(index);
  125. }
  126. },
  127. setActive: function setActive(active) {
  128. if (active !== this.data.active) {
  129. this.trigger('change', active);
  130. this.set({ active: active });
  131. this.setActiveTab();
  132. }
  133. },
  134. setLine: function setLine(skipTransition) {
  135. var _this = this;
  136. if (this.data.type !== 'line') {
  137. return;
  138. }
  139. var _a = this.data,
  140. color = _a.color,
  141. active = _a.active,
  142. duration = _a.duration,
  143. lineWidth = _a.lineWidth,
  144. lineHeight = _a.lineHeight;
  145. this.getRect('.van-tab', true).then(function (rects) {
  146. var rect = rects[active];
  147. var width = lineWidth !== -1 ? lineWidth : rect.width / 2;
  148. var height = lineHeight !== -1 ? "height: " + lineHeight + "px;" : '';
  149. var left = rects.slice(0, active).reduce(function (prev, curr) {
  150. return prev + curr.width;
  151. }, 0);
  152. left += (rect.width - width) / 2;
  153. var transition = skipTransition ? '' : "transition-duration: " + duration + "s; -webkit-transition-duration: " + duration + "s;";
  154. _this.set({
  155. lineStyle: "\n " + height + "\n width: " + width + "px;\n background-color: " + color + ";\n -webkit-transform: translateX(" + left + "px);\n transform: translateX(" + left + "px);\n " + transition + "\n "
  156. });
  157. });
  158. },
  159. setTrack: function setTrack() {
  160. var _this = this;
  161. var _a = this.data,
  162. animated = _a.animated,
  163. active = _a.active,
  164. duration = _a.duration;
  165. if (!animated) return '';
  166. this.getRect('.van-tabs__content').then(function (rect) {
  167. var width = rect.width;
  168. _this.set({
  169. trackStyle: "\n width: " + width * _this.child.length + "px;\n left: " + -1 * active * width + "px;\n transition: left " + duration + "s;\n display: -webkit-box;\n display: flex;\n "
  170. });
  171. var props = { width: width, animated: animated };
  172. _this.child.forEach(function (item) {
  173. item.set(props);
  174. });
  175. });
  176. },
  177. setActiveTab: function setActiveTab() {
  178. var _this = this;
  179. this.child.forEach(function (item, index) {
  180. var data = {
  181. active: index === _this.data.active
  182. };
  183. if (data.active) {
  184. data.inited = true;
  185. }
  186. if (data.active !== item.data.active) {
  187. item.set(data);
  188. }
  189. });
  190. this.set({}, function () {
  191. _this.setLine();
  192. _this.setTrack();
  193. _this.scrollIntoView();
  194. });
  195. },
  196. // scroll active tab into view
  197. scrollIntoView: function scrollIntoView() {
  198. var _this = this;
  199. var _a = this.data,
  200. active = _a.active,
  201. scrollable = _a.scrollable;
  202. if (!scrollable) {
  203. return;
  204. }
  205. Promise.all([this.getRect('.van-tab', true), this.getRect('.van-tabs__nav')]).then(function (_a) {
  206. var tabRects = _a[0],
  207. navRect = _a[1];
  208. var tabRect = tabRects[active];
  209. var offsetLeft = tabRects.slice(0, active).reduce(function (prev, curr) {
  210. return prev + curr.width;
  211. }, 0);
  212. _this.set({
  213. scrollLeft: offsetLeft - (navRect.width - tabRect.width) / 2
  214. });
  215. });
  216. },
  217. onTouchStart: function onTouchStart(event) {
  218. if (!this.data.swipeable) return;
  219. this.touchStart(event);
  220. },
  221. onTouchMove: function onTouchMove(event) {
  222. if (!this.data.swipeable) return;
  223. this.touchMove(event);
  224. },
  225. // watch swipe touch end
  226. onTouchEnd: function onTouchEnd() {
  227. if (!this.data.swipeable) return;
  228. var _a = this.data,
  229. active = _a.active,
  230. tabs = _a.tabs;
  231. var _b = this,
  232. direction = _b.direction,
  233. deltaX = _b.deltaX,
  234. offsetX = _b.offsetX;
  235. var minSwipeDistance = 50;
  236. if (direction === 'horizontal' && offsetX >= minSwipeDistance) {
  237. if (deltaX > 0 && active !== 0) {
  238. this.setActive(active - 1);
  239. } else if (deltaX < 0 && active !== tabs.length - 1) {
  240. this.setActive(active + 1);
  241. }
  242. }
  243. },
  244. setWrapStyle: function setWrapStyle() {
  245. var _a = this.data,
  246. offsetTop = _a.offsetTop,
  247. position = _a.position;
  248. var wrapStyle;
  249. switch (position) {
  250. case 'top':
  251. wrapStyle = "\n top: " + offsetTop + "px;\n position: fixed;\n ";
  252. break;
  253. case 'bottom':
  254. wrapStyle = "\n top: auto;\n bottom: 0;\n ";
  255. break;
  256. default:
  257. wrapStyle = '';
  258. }
  259. // cut down `set`
  260. if (wrapStyle === this.data.wrapStyle) return;
  261. this.set({ wrapStyle: wrapStyle });
  262. },
  263. observerContentScroll: function observerContentScroll() {
  264. var _this = this;
  265. if (!this.data.sticky) {
  266. return;
  267. }
  268. var offsetTop = this.data.offsetTop;
  269. var windowHeight = wx.getSystemInfoSync().windowHeight;
  270. this.createIntersectionObserver().disconnect();
  271. this.createIntersectionObserver().relativeToViewport({ top: -(this.navHeight + offsetTop) }).observe('.van-tabs', function (res) {
  272. var top = res.boundingClientRect.top;
  273. if (top > offsetTop) {
  274. return;
  275. }
  276. var position = res.intersectionRatio > 0 ? 'top' : 'bottom';
  277. _this.$emit('scroll', {
  278. scrollTop: top + offsetTop,
  279. isFixed: position === 'top'
  280. });
  281. _this.setPosition(position);
  282. });
  283. this.createIntersectionObserver().relativeToViewport({ bottom: -(windowHeight - 1 - offsetTop) }).observe('.van-tabs', function (res) {
  284. var _a = res.boundingClientRect,
  285. top = _a.top,
  286. bottom = _a.bottom;
  287. if (bottom < _this.navHeight) {
  288. return;
  289. }
  290. var position = res.intersectionRatio > 0 ? 'top' : '';
  291. _this.$emit('scroll', {
  292. scrollTop: top + offsetTop,
  293. isFixed: position === 'top'
  294. });
  295. _this.setPosition(position);
  296. });
  297. },
  298. setPosition: function setPosition(position) {
  299. var _this = this;
  300. if (position !== this.data.position) {
  301. this.set({ position: position }).then(function () {
  302. _this.setWrapStyle();
  303. });
  304. }
  305. }
  306. }
  307. });
  308. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIk9iamVjdCIsInZhbHVlIiwiY29tcG9uZW50XzEiLCJyZXF1aXJlIiwidG91Y2hfMSIsIm1peGlucyIsImNsYXNzZXMiLCJyZWxhdGlvbiIsIm5hbWUiLCJ0eXBlIiwibGlua2VkIiwiY2hpbGQiLCJ1bmxpbmtlZCIsImluZGV4IiwidGFicyIsInByb3BzIiwiY29sb3IiLCJzdGlja3kiLCJhbmltYXRlZCIsInN3aXBlYWJsZSIsImxpbmVXaWR0aCIsImxpbmVIZWlnaHQiLCJhY3RpdmUiLCJib3JkZXIiLCJkdXJhdGlvbiIsInpJbmRleCIsInN3aXBlVGhyZXNob2xkIiwib2Zmc2V0VG9wIiwiZGF0YSIsImxpbmVTdHlsZSIsInNjcm9sbExlZnQiLCJzY3JvbGxhYmxlIiwidHJhY2tTdHlsZSIsIndyYXBTdHlsZSIsInBvc2l0aW9uIiwid2F0Y2giLCJiZWZvcmVDcmVhdGUiLCJtb3VudGVkIiwiX3RoaXMiLCJyZWN0IiwiZGVzdHJveWVkIiwibWV0aG9kcyIsInVwZGF0ZVRhYnMiLCJ0cmlnZ2VyIiwidGl0bGUiLCJvblRhcCIsImV2ZW50Iiwic2V0QWN0aXZlIiwic2V0TGluZSIsIl9hIiwicmVjdHMiLCJ3aWR0aCIsImhlaWdodCIsImxlZnQiLCJwcmV2IiwiY3VyciIsInRyYW5zaXRpb24iLCJza2lwVHJhbnNpdGlvbiIsInNldFRyYWNrIiwiaXRlbSIsInNldEFjdGl2ZVRhYiIsInNjcm9sbEludG9WaWV3IiwiUHJvbWlzZSIsInRhYlJlY3RzIiwibmF2UmVjdCIsInRhYlJlY3QiLCJvZmZzZXRMZWZ0Iiwib25Ub3VjaFN0YXJ0Iiwib25Ub3VjaE1vdmUiLCJvblRvdWNoRW5kIiwiX2IiLCJkaXJlY3Rpb24iLCJkZWx0YVgiLCJvZmZzZXRYIiwibWluU3dpcGVEaXN0YW5jZSIsInNldFdyYXBTdHlsZSIsIm9ic2VydmVyQ29udGVudFNjcm9sbCIsIndpbmRvd0hlaWdodCIsInd4IiwidG9wIiwicmVzIiwic2Ny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YUFBQTtBQWhMQyxTQUFBO0FBK0xMOEMscUJBQWEsU0FBQSxXQUFBLENBQUEsUUFBQSxFQUFvQjtBQUM3QixnQkFBSTlDLFFBQUosSUFBQTtBQUNBLGdCQUFJSixhQUFhLEtBQUEsSUFBQSxDQUFqQixRQUFBLEVBQXFDO0FBQ2pDLHFCQUFBLEdBQUEsQ0FBUyxFQUFFQSxVQUFYLFFBQVMsRUFBVCxFQUFBLElBQUEsQ0FBc0MsWUFBWTtBQUM5Q0ksMEJBQUFBLFlBQUFBO0FBREosaUJBQUE7QUFHSDtBQUNKO0FBdE1JO0FBbEdhLENBQTFCcEMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBjb21wb25lbnRfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vY29tcG9uZW50XCIpO1xudmFyIHRvdWNoXzEgPSByZXF1aXJlKFwiLi4vbWl4aW5zL3RvdWNoXCIpO1xuY29tcG9uZW50XzEuVmFudENvbXBvbmVudCh7XG4gICAgbWl4aW5zOiBbdG91Y2hfMS50b3VjaF0sXG4gICAgY2xhc3NlczogWyduYXYtY2xhc3MnLCAndGFiLWNsYXNzJywgJ3RhYi1hY3RpdmUtY2xhc3MnLCAnbGluZS1jbGFzcyddLFxuICAgIHJlbGF0aW9uOiB7XG4gICAgICAgIG5hbWU6ICd0YWInLFxuICAgICAgICB0eXBlOiAnZGVzY2VuZGFudCcsXG4gICAgICAgIGxpbmtlZDogZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICB0aGlzLmNoaWxkLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUYWJzKHRoaXMuZGF0YS50YWJzLmNvbmNhdChjaGlsZC5kYXRhKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHVubGlua2VkOiBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuY2hpbGQuaW5kZXhPZihjaGlsZCk7XG4gICAgICAgICAgICB2YXIgdGFicyA9IHRoaXMuZGF0YS50YWJzO1xuICAgICAgICAgICAgdGFicy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5jaGlsZC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUYWJzKHRhYnMpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBwcm9wczoge1xuICAgICAgICBjb2xvcjogU3RyaW5nLFxuICAgICAgICBzdGlja3k6IEJvb2xlYW4sXG4gICAgICAgIGFuaW1hdGVkOiBCb29sZWFuLFxuICAgICAgICBzd2lwZWFibGU6IEJvb2xlYW4sXG4gICAgICAgIGxpbmVXaWR0aDoge1xuICAgICAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICAgICAgdmFsdWU6IC0xXG4gICAgICAgIH0sXG4gICAgICAgIGxpbmVIZWlnaHQ6IHtcbiAgICAgICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgICAgIHZhbHVlOiAtMVxuICAgICAgICB9LFxuICAgICAgICBhY3RpdmU6IHtcbiAgICAgICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgICAgIHZhbHVlOiAnbGluZSdcbiAgICAgICAgfSxcbiAgICAgICAgYm9yZGVyOiB7XG4gICAgICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgZHVyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgICAgIHZhbHVlOiAwLjNcbiAgICAgICAgfSxcbiAgICAgICAgekluZGV4OiB7XG4gICAgICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgICAgICB2YWx1ZTogMVxuICAgICAgICB9LFxuICAgICAgICBzd2lwZVRocmVzaG9sZDoge1xuICAgICAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICAgICAgdmFsdWU6IDRcbiAgICAgICAgfSxcbiAgICAgICAgb2Zmc2V0VG9wOiB7XG4gICAgICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgICAgICB2YWx1ZTogMFxuICAgICAgICB9XG4gICAgfSxcbiAgICBkYXRhOiB7XG4gICAgICAgIHRhYnM6IFtdLFxuICAgICAgICBsaW5lU3R5bGU6ICcnLFxuICAgICAgICBzY3JvbGxMZWZ0OiAwLFxuICAgICAgICBzY3JvbGxhYmxlOiBmYWxzZSxcbiAgICAgICAgdHJhY2tTdHlsZTogJycsXG4gICAgICAgIHdyYXBTdHlsZTogJycsXG4gICAgICAgIHBvc2l0aW9uOiAnJ1xuICAgIH0sXG4gICAgd2F0Y2g6IHtcbiAgICAgICAgc3dpcGVUaHJlc2hvbGQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KHtcbiAgICAgICAgICAgICAgICBzY3JvbGxhYmxlOiB0aGlzLmNoaWxkLmxlbmd0aCA+IHRoaXMuZGF0YS5zd2lwZVRocmVzaG9sZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbG9yOiAnc2V0TGluZScsXG4gICAgICAgIGxpbmVXaWR0aDogJ3NldExpbmUnLFxuICAgICAgICBsaW5lSGVpZ2h0OiAnc2V0TGluZScsXG4gICAgICAgIGFjdGl2ZTogJ3NldEFjdGl2ZVRhYicsXG4gICAgICAgIGFuaW1hdGVkOiAnc2V0VHJhY2snLFxuICAgICAgICBvZmZzZXRUb3A6ICdzZXRXcmFwU3R5bGUnXG4gICAgfSxcbiAgICBiZWZvcmVDcmVhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jaGlsZCA9IFtdO1xuICAgIH0sXG4gICAgbW91bnRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnNldExpbmUodHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0VHJhY2soKTtcbiAgICAgICAgdGhpcy5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICB0aGlzLmdldFJlY3QoJy52YW4tdGFic19fd3JhcCcpLnRoZW4oZnVuY3Rpb24gKHJlY3QpIHtcbiAgICAgICAgICAgIF90aGlzLm5hdkhlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICAgICAgICAgICAgX3RoaXMub2JzZXJ2ZXJDb250ZW50U2Nyb2xsKCk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgZGVzdHJveWVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKS5kaXNjb25uZWN0KCk7XG4gICAgfSxcbiAgICBtZXRob2RzOiB7XG4gICAgICAgIHVwZGF0ZVRhYnM6IGZ1bmN0aW9uICh0YWJzKSB7XG4gICAgICAgICAgICB0YWJzID0gdGFicyB8fCB0aGlzLmRhdGEudGFicztcbiAgICAgICAgICAgIHRoaXMuc2V0KHtcbiAgICAgICAgICAgICAgICB0YWJzOiB0YWJzLFxuICAgICAgICAgICAgICAgIHNjcm9sbGFibGU6IHRhYnMubGVuZ3RoID4gdGhpcy5kYXRhLnN3aXBlVGhyZXNob2xkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlVGFiKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHRyaWdnZXI6IGZ1bmN0aW9uIChldmVudE5hbWUsIGluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLiRlbWl0KGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5kYXRhLnRhYnNbaW5kZXhdLnRpdGxlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25UYXA6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LmluZGV4O1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS50YWJzW2luZGV4XS5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcignZGlzYWJsZWQnLCBpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2NsaWNrJywgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlKGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0QWN0aXZlOiBmdW5jdGlvbiAoYWN0aXZlKSB7XG4gICAgICAgICAgICBpZiAoYWN0aXZlICE9PSB0aGlzLmRhdGEuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdjaGFuZ2UnLCBhY3RpdmUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KHsgYWN0aXZlOiBhY3RpdmUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVUYWIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0TGluZTogZnVuY3Rpb24gKHNraXBUcmFuc2l0aW9uKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS50eXBlICE9PSAnbGluZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLmRhdGEsIGNvbG9yID0gX2EuY29sb3IsIGFjdGl2ZSA9IF9hLmFjdGl2ZSwgZHVyYXRpb24gPSBfYS5kdXJhdGlvbiwgbGluZVdpZHRoID0gX2EubGluZVdpZHRoLCBsaW5lSGVpZ2h0ID0gX2EubGluZUhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuZ2V0UmVjdCgnLnZhbi10YWInLCB0cnVlKS50aGVuKGZ1bmN0aW9uIChyZWN0cykge1xuICAgICAgICAgICAgICAgIHZhciByZWN0ID0gcmVjdHNbYWN0aXZlXTtcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBsaW5lV2lkdGggIT09IC0xID8gbGluZVdpZHRoIDogcmVjdC53aWR0aCAvIDI7XG4gICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IGxpbmVIZWlnaHQgIT09IC0xID8gXCJoZWlnaHQ6IFwiICsgbGluZUhlaWdodCArIFwicHg7XCIgOiAnJztcbiAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IHJlY3RzXG4gICAgICAgICAgICAgICAgICAgIC5zbGljZSgwLCBhY3RpdmUpXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cnIpIHsgcmV0dXJuIHByZXYgKyBjdXJyLndpZHRoOyB9LCAwKTtcbiAgICAgICAgICAgICAgICBsZWZ0ICs9IChyZWN0LndpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgICAgICAgICB2YXIgdHJhbnNpdGlvbiA9IHNraXBUcmFuc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgICAgICAgOiBcInRyYW5zaXRpb24tZHVyYXRpb246IFwiICsgZHVyYXRpb24gKyBcInM7IC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogXCIgKyBkdXJhdGlvbiArIFwicztcIjtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBsaW5lU3R5bGU6IFwiXFxuICAgICAgICAgICAgXCIgKyBoZWlnaHQgKyBcIlxcbiAgICAgICAgICAgIHdpZHRoOiBcIiArIHdpZHRoICsgXCJweDtcXG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBcIiArIGNvbG9yICsgXCI7XFxuICAgICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoXCIgKyBsZWZ0ICsgXCJweCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKFwiICsgbGVmdCArIFwicHgpO1xcbiAgICAgICAgICAgIFwiICsgdHJhbnNpdGlvbiArIFwiXFxuICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0VHJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLmRhdGEsIGFuaW1hdGVkID0gX2EuYW5pbWF0ZWQsIGFjdGl2ZSA9IF9hLmFjdGl2ZSwgZHVyYXRpb24gPSBfYS5kdXJhdGlvbjtcbiAgICAgICAgICAgIGlmICghYW5pbWF0ZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgdGhpcy5nZXRSZWN0KCcudmFuLXRhYnNfX2NvbnRlbnQnKS50aGVuKGZ1bmN0aW9uIChyZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gcmVjdC53aWR0aDtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICB0cmFja1N0eWxlOiBcIlxcbiAgICAgICAgICAgIHdpZHRoOiBcIiArIHdpZHRoICogX3RoaXMuY2hpbGQubGVuZ3RoICsgXCJweDtcXG4gICAgICAgICAgICBsZWZ0OiBcIiArIC0xICogYWN0aXZlICogd2lkdGggKyBcInB4O1xcbiAgICAgICAgICAgIHRyYW5zaXRpb246IGxlZnQgXCIgKyBkdXJhdGlvbiArIFwicztcXG4gICAgICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWJveDtcXG4gICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IHsgd2lkdGg6IHdpZHRoLCBhbmltYXRlZDogYW5pbWF0ZWQgfTtcbiAgICAgICAgICAgICAgICBfdGhpcy5jaGlsZC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0KHByb3BzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBzZXRBY3RpdmVUYWI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmNoaWxkLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogaW5kZXggPT09IF90aGlzLmRhdGEuYWN0aXZlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5pbml0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hY3RpdmUgIT09IGl0ZW0uZGF0YS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXQoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNldCh7fSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLnNldExpbmUoKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXRUcmFjaygpO1xuICAgICAgICAgICAgICAgIF90aGlzLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gc2Nyb2xsIGFjdGl2ZSB0YWIgaW50byB2aWV3XG4gICAgICAgIHNjcm9sbEludG9WaWV3OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5kYXRhLCBhY3RpdmUgPSBfYS5hY3RpdmUsIHNjcm9sbGFibGUgPSBfYS5zY3JvbGxhYmxlO1xuICAgICAgICAgICAgaWYgKCFzY3JvbGxhYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVjdCgnLnZhbi10YWInLCB0cnVlKSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlY3QoJy52YW4tdGFic19fbmF2JylcbiAgICAgICAgICAgIF0pLnRoZW4oZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhYlJlY3RzID0gX2FbMF0sIG5hdlJlY3QgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICB2YXIgdGFiUmVjdCA9IHRhYlJlY3RzW2FjdGl2ZV07XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldExlZnQgPSB0YWJSZWN0c1xuICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMCwgYWN0aXZlKVxuICAgICAgICAgICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjdXJyKSB7IHJldHVybiBwcmV2ICsgY3Vyci53aWR0aDsgfSwgMCk7XG4gICAgICAgICAgICAgICAgX3RoaXMuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogb2Zmc2V0TGVmdCAtIChuYXZSZWN0LndpZHRoIC0gdGFiUmVjdC53aWR0aCkgLyAyXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ub3VjaFN0YXJ0OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhLnN3aXBlYWJsZSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0aGlzLnRvdWNoU3RhcnQoZXZlbnQpO1xuICAgICAgICB9LFxuICAgICAgICBvblRvdWNoTW92ZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YS5zd2lwZWFibGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy50b3VjaE1vdmUoZXZlbnQpO1xuICAgICAgICB9LFxuICAgICAgICAvLyB3YXRjaCBzd2lwZSB0b3VjaCBlbmRcbiAgICAgICAgb25Ub3VjaEVuZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGEuc3dpcGVhYmxlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMuZGF0YSwgYWN0aXZlID0gX2EuYWN0aXZlLCB0YWJzID0gX2EudGFicztcbiAgICAgICAgICAgIHZhciBfYiA9IHRoaXMsIGRpcmVjdGlvbiA9IF9iLmRpcmVjdGlvbiwgZGVsdGFYID0gX2IuZGVsdGFYLCBvZmZzZXRYID0gX2Iub2Zmc2V0WDtcbiAgICAgICAgICAgIHZhciBtaW5Td2lwZURpc3RhbmNlID0gNTA7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgJiYgb2Zmc2V0WCA+PSBtaW5Td2lwZURpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlbHRhWCA+IDAgJiYgYWN0aXZlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlKGFjdGl2ZSAtIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWx0YVggPCAwICYmIGFjdGl2ZSAhPT0gdGFicy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlKGFjdGl2ZSArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0V3JhcFN0eWxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLmRhdGEsIG9mZnNldFRvcCA9IF9hLm9mZnNldFRvcCwgcG9zaXRpb24gPSBfYS5wb3NpdGlvbjtcbiAgICAgICAgICAgIHZhciB3cmFwU3R5bGU7XG4gICAgICAgICAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgICAgICAgICAgd3JhcFN0eWxlID0gXCJcXG4gICAgICAgICAgICB0b3A6IFwiICsgb2Zmc2V0VG9wICsgXCJweDtcXG4gICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgICAgICAgIFwiO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgICAgICAgICB3cmFwU3R5bGUgPSBcIlxcbiAgICAgICAgICAgIHRvcDogYXV0bztcXG4gICAgICAgICAgICBib3R0b206IDA7XFxuICAgICAgICAgIFwiO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB3cmFwU3R5bGUgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGN1dCBkb3duIGBzZXRgXG4gICAgICAgICAgICBpZiAod3JhcFN0eWxlID09PSB0aGlzLmRhdGEud3JhcFN0eWxlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuc2V0KHsgd3JhcFN0eWxlOiB3cmFwU3R5bGUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9ic2VydmVyQ29udGVudFNjcm9sbDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhLnN0aWNreSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBvZmZzZXRUb3AgPSB0aGlzLmRhdGEub2Zmc2V0VG9wO1xuICAgICAgICAgICAgdmFyIHdpbmRvd0hlaWdodCA9IHd4LmdldFN5c3RlbUluZm9TeW5jKCkud2luZG93SGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlcigpLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKVxuICAgICAgICAgICAgICAgIC5yZWxhdGl2ZVRvVmlld3BvcnQoeyB0b3A6IC0odGhpcy5uYXZIZWlnaHQgKyBvZmZzZXRUb3ApIH0pXG4gICAgICAgICAgICAgICAgLm9ic2VydmUoJy52YW4tdGFicycsIGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9wID0gcmVzLmJvdW5kaW5nQ2xpZW50UmVjdC50b3A7XG4gICAgICAgICAgICAgICAgaWYgKHRvcCA+IG9mZnNldFRvcCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBwb3NpdGlvbiA9IHJlcy5pbnRlcnNlY3Rpb25SYXRpbyA+IDAgPyAndG9wJyA6ICdib3R0b20nO1xuICAgICAgICAgICAgICAgIF90aGlzLiRlbWl0KCdzY3JvbGwnLCB7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogdG9wICsgb2Zmc2V0VG9wLFxuICAgICAgICAgICAgICAgICAgICBpc0ZpeGVkOiBwb3NpdGlvbiA9PT0gJ3RvcCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXRQb3NpdGlvbihwb3NpdGlvbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKVxuICAgICAgICAgICAgICAgIC5yZWxhdGl2ZVRvVmlld3BvcnQoeyBib3R0b206IC0od2luZG93SGVpZ2h0IC0gMSAtIG9mZnNldFRvcCkgfSlcbiAgICAgICAgICAgICAgICAub2JzZXJ2ZSgnLnZhbi10YWJzJywgZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICAgIHZhciBfYSA9IHJlcy5ib3VuZGluZ0NsaWVudFJlY3QsIHRvcCA9IF9hLnRvcCwgYm90dG9tID0gX2EuYm90dG9tO1xuICAgICAgICAgICAgICAgIGlmIChib3R0b20gPCBfdGhpcy5uYXZIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSByZXMuaW50ZXJzZWN0aW9uUmF0aW8gPiAwID8gJ3RvcCcgOiAnJztcbiAgICAgICAgICAgICAgICBfdGhpcy4kZW1pdCgnc2Nyb2xsJywge1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3A6IHRvcCArIG9mZnNldFRvcCxcbiAgICAgICAgICAgICAgICAgICAgaXNGaXhlZDogcG9zaXRpb24gPT09ICd0b3AnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgX3RoaXMuc2V0UG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFBvc2l0aW9uOiBmdW5jdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICBpZiAocG9zaXRpb24gIT09IHRoaXMuZGF0YS5wb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KHsgcG9zaXRpb246IHBvc2l0aW9uIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5zZXRXcmFwU3R5bGUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIl0sImZpbGUiOiJpbmRleC5qcyJ9