UNPKG

webdriverio-automation

Version:

WebdriverIO-Automation android ios project

297 lines (261 loc) 43.2 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); require("source-map-support/register"); var _lodash = _interopRequireDefault(require("lodash")); var _chai = _interopRequireDefault(require("chai")); var _chaiAsPromised = _interopRequireDefault(require("chai-as-promised")); var _2 = _interopRequireWildcard(require("../..")); var _imageElement = require("../../lib/basedriver/image-element"); var _protocol = require("../../lib/protocol/protocol"); var _sinon = _interopRequireDefault(require("sinon")); _chai.default.should(); _chai.default.use(_chaiAsPromised.default); const defRect = { x: 100, y: 110, width: 50, height: 25 }; const defTemplate = 'iVBORasdf'; describe('ImageElement', function () { const driver = new _2.default(); describe('.size', function () { it('should return the width and height of the image el', function () { const el = new _2.ImageElement(defTemplate, defRect); el.size.should.eql({ width: defRect.width, height: defRect.height }); }); }); describe('.location', function () { it('should return the location of the image el', function () { const el = new _2.ImageElement(defTemplate, defRect); el.location.should.eql({ x: defRect.x, y: defRect.y }); }); }); describe('.center', function () { it('should return the center location of the image el', function () { const el = new _2.ImageElement(defTemplate, defRect); el.center.should.eql({ x: defRect.x + defRect.width / 2, y: defRect.y + defRect.height / 2 }); }); }); describe('.asElement', function () { it('should get the webdriver object representation of the element', function () { const el = new _2.ImageElement(defTemplate, defRect); el.asElement('ELEMENT').ELEMENT.should.match(/^appium-image-el/); }); }); describe('.equals', function () { it('should say two image elements with same rect are equal', function () { const el1 = new _2.ImageElement('foo', defRect); const el2 = new _2.ImageElement('bar', defRect); el1.equals(el2).should.be.true; el2.equals(el1).should.be.true; }); it('should say two image elements with different rect are not equal', function () { const el1 = new _2.ImageElement(defTemplate, { ...defRect, x: 0 }); const el2 = new _2.ImageElement(defTemplate, defRect); el1.equals(el2).should.be.false; el2.equals(el1).should.be.false; }); }); describe('.click', function () { it('should reject an invalid tap strategy', async function () { const d = new _2.default(); const el = new _2.ImageElement(defTemplate, defRect); await d.settings.update({ imageElementTapStrategy: 'bad' }); await el.click(d).should.eventually.be.rejectedWith(/Incorrect imageElementTapStrategy/); }); it('should try to check for image element staleness, and throw if stale', async function () { const d = new _2.default(); _sinon.default.stub(d, 'findByImage').throws(); const el = new _2.ImageElement(defTemplate, defRect); await d.settings.update({ checkForImageElementStaleness: true, autoUpdateImageElementPosition: false }); await el.click(d).should.eventually.be.rejectedWith(/no longer attached/); await d.settings.update({ checkForImageElementStaleness: false, autoUpdateImageElementPosition: true }); await el.click(d).should.eventually.be.rejectedWith(/no longer attached/); }); it('should auto-update element position if requested', async function () { const d = new _2.default(); d.performActions = _lodash.default.noop; _sinon.default.stub(d, 'performActions'); const el = new _2.ImageElement(defTemplate, defRect); const newRect = { ...defRect, x: defRect.x + 10, y: defRect.y + 5 }; const elPos2 = new _2.ImageElement(defTemplate, newRect); _sinon.default.stub(d, 'findByImage').returns(elPos2); await d.settings.update({ autoUpdateImageElementPosition: true }); el.rect.should.not.eql(newRect); await el.click(d); el.rect.should.eql(newRect); }); it('should tap the center of an element using w3c actions by default', async function () { const d = new _2.default(); d.performActions = _lodash.default.noop; const actionStub = _sinon.default.stub(d, 'performActions'); const el = new _2.ImageElement(defTemplate, defRect); await d.settings.update({ checkForImageElementStaleness: false }); await el.click(d); const pointerMoveAction = actionStub.args[0][0][0].actions[0]; pointerMoveAction.x.should.equal(el.center.x); pointerMoveAction.y.should.equal(el.center.y); }); it('should fall back to touchactions if w3c actions do not exist on driver', async function () { const d = new _2.default(); d.performTouch = _lodash.default.noop; const actionStub = _sinon.default.stub(d, 'performTouch'); const el = new _2.ImageElement(defTemplate, defRect); await d.settings.update({ checkForImageElementStaleness: false }); await el.click(d); const action = actionStub.args[0][0][0].options; action.x.should.equal(el.center.x); action.y.should.equal(el.center.y); }); it('should use touchactions if requested', async function () { const d = new _2.default(); d.performActions = _lodash.default.noop; const w3cStub = _sinon.default.stub(d, 'performActions'); d.performTouch = _lodash.default.noop; const touchStub = _sinon.default.stub(d, 'performTouch'); const el = new _2.ImageElement(defTemplate, defRect); await d.settings.update({ checkForImageElementStaleness: false, imageElementTapStrategy: 'touchActions' }); await el.click(d); const action = touchStub.args[0][0][0].options; action.x.should.equal(el.center.x); action.y.should.equal(el.center.y); w3cStub.callCount.should.eql(0); }); it('should throw if driver does not implement any type of action', async function () { const d = new _2.default(); const el = new _2.ImageElement(defTemplate, defRect); await d.settings.update({ checkForImageElementStaleness: false }); await el.click(d).should.eventually.be.rejectedWith(/did not implement/); }); }); describe('#execute', function () { const imgEl = new _2.ImageElement(defTemplate, defRect, 'aGFwcHkgdGVzdGluZw=='); const clickStub = _sinon.default.stub(imgEl, 'click'); before(function () { driver._imgElCache.set(imgEl.id, imgEl); clickStub.returns(true); }); after(function () { driver._imgElCache.reset(); clickStub.restore(); }); it('should reject executions on elements not in the cache', async function () { await _2.ImageElement.execute(driver, 'click', 'appium-image-element-foo').should.eventually.be.rejectedWith(/element could not be located/); }); it('should reject executions for unsupported commands', async function () { await _2.ImageElement.execute(driver, 'foobar', imgEl.id).should.eventually.be.rejectedWith(/not yet been implemented/); }); it('should get displayed status of element', async function () { await _2.ImageElement.execute(driver, 'elementDisplayed', imgEl.id).should.eventually.be.true; }); it('should get size of element', async function () { await _2.ImageElement.execute(driver, 'getSize', imgEl.id).should.eventually.eql({ width: defRect.width, height: defRect.height }); }); it('should get location of element', async function () { await _2.ImageElement.execute(driver, 'getLocation', imgEl.id).should.eventually.eql({ x: defRect.x, y: defRect.y }); }); it('should get location in view of element', async function () { await _2.ImageElement.execute(driver, 'getLocation', imgEl.id).should.eventually.eql({ x: defRect.x, y: defRect.y }); }); it('should get rect of element', async function () { await _2.ImageElement.execute(driver, 'getElementRect', imgEl.id).should.eventually.eql(defRect); }); it('should get visual of element', async function () { await _2.ImageElement.execute(driver, 'getAttribute', imgEl.id, 'visual').should.eventually.eql('aGFwcHkgdGVzdGluZw=='); }); it('should get null as visual of element by default', async function () { const imgElement = new _2.ImageElement(defTemplate, defRect); driver._imgElCache.set(imgElement.id, imgElement); await _2.ImageElement.execute(driver, 'getAttribute', imgElement.id, 'visual').should.eventually.eql(null); }); it('should not get other attribute', async function () { await _2.ImageElement.execute(driver, 'getAttribute', imgEl.id, 'content-desc').should.eventually.rejectedWith('Method has not yet been implemented'); }); it('should click element', async function () { await _2.ImageElement.execute(driver, 'click', imgEl.id).should.eventually.be.true; }); }); }); describe('image element LRU cache', function () { it('should accept and cache image elements', function () { const el1 = new _2.ImageElement(defTemplate, defRect); const el2 = new _2.ImageElement(defTemplate, defRect); const cache = (0, _imageElement.makeImageElementCache)(); cache.set(el1.id, el1); el1.equals(cache.get(el1.id)).should.be.true; _lodash.default.isUndefined(cache.get(el2.id)).should.be.true; cache.has(el1.id).should.be.true; cache.has(el2.id).should.be.false; }); it('once cache reaches max size, should eject image elements', function () { const el1 = new _2.ImageElement(defTemplate, defRect); const el2 = new _2.ImageElement(defTemplate, defRect); const cache = (0, _imageElement.makeImageElementCache)(defTemplate.length + 1); cache.set(el1.id, el1); cache.has(el1.id).should.be.true; cache.set(el2.id, el2); cache.has(el2.id).should.be.true; cache.has(el1.id).should.be.false; }); }); describe('getImgElFromArgs', function () { it('should return the image element id from json obj in args', function () { const imgEl = `${_protocol.IMAGE_ELEMENT_PREFIX}foo`; const args = [1, 'foo', imgEl]; (0, _imageElement.getImgElFromArgs)(args).should.eql(imgEl); }); it('should not return anything if image element id not in args', function () { const args = [1, 'foo']; _lodash.default.isUndefined((0, _imageElement.getImgElFromArgs)(args)).should.be.true; }); it('should not find image element id in anything but prefix', function () { const notImgEl = `foo${_protocol.IMAGE_ELEMENT_PREFIX}`; const args = [1, 'foo', notImgEl]; _lodash.default.isUndefined((0, _imageElement.getImgElFromArgs)(args)).should.be.true; }); });require('source-map-support').install(); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvYmFzZWRyaXZlci9pbWFnZS1lbGVtZW50LXNwZWNzLmpzIl0sIm5hbWVzIjpbImNoYWkiLCJzaG91bGQiLCJ1c2UiLCJjaGFpQXNQcm9taXNlZCIsImRlZlJlY3QiLCJ4IiwieSIsIndpZHRoIiwiaGVpZ2h0IiwiZGVmVGVtcGxhdGUiLCJkZXNjcmliZSIsImRyaXZlciIsIkJhc2VEcml2ZXIiLCJpdCIsImVsIiwiSW1hZ2VFbGVtZW50Iiwic2l6ZSIsImVxbCIsImxvY2F0aW9uIiwiY2VudGVyIiwiYXNFbGVtZW50IiwiRUxFTUVOVCIsIm1hdGNoIiwiZWwxIiwiZWwyIiwiZXF1YWxzIiwiYmUiLCJ0cnVlIiwiZmFsc2UiLCJkIiwic2V0dGluZ3MiLCJ1cGRhdGUiLCJpbWFnZUVsZW1lbnRUYXBTdHJhdGVneSIsImNsaWNrIiwiZXZlbnR1YWxseSIsInJlamVjdGVkV2l0aCIsInNpbm9uIiwic3R1YiIsInRocm93cyIsImNoZWNrRm9ySW1hZ2VFbGVtZW50U3RhbGVuZXNzIiwiYXV0b1VwZGF0ZUltYWdlRWxlbWVudFBvc2l0aW9uIiwicGVyZm9ybUFjdGlvbnMiLCJfIiwibm9vcCIsIm5ld1JlY3QiLCJlbFBvczIiLCJyZXR1cm5zIiwicmVjdCIsIm5vdCIsImFjdGlvblN0dWIiLCJwb2ludGVyTW92ZUFjdGlvbiIsImFyZ3MiLCJhY3Rpb25zIiwiZXF1YWwiLCJwZXJmb3JtVG91Y2giLCJhY3Rpb24iLCJvcHRpb25zIiwidzNjU3R1YiIsInRvdWNoU3R1YiIsImNhbGxDb3VudCIsImltZ0VsIiwiY2xpY2tTdHViIiwiYmVmb3JlIiwiX2ltZ0VsQ2FjaGUiLCJzZXQiLCJpZCIsImFmdGVyIiwicmVzZXQiLCJyZXN0b3JlIiwiZXhlY3V0ZSIsImltZ0VsZW1lbnQiLCJjYWNoZSIsImdldCIsImlzVW5kZWZpbmVkIiwiaGFzIiwibGVuZ3RoIiwiSU1BR0VfRUxFTUVOVF9QUkVGSVgiLCJub3RJbWdFbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFB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SUFkLEVBQUFBLEVBQUUsQ0FBQyx5REFBRCxFQUE0RCxZQUFZO0FBQ3hFLFVBQU1nRSxRQUFRLEdBQUksTUFBS0QsOEJBQXFCLEVBQTVDO0FBQ0EsVUFBTXpCLElBQUksR0FBRyxDQUFDLENBQUQsRUFBSSxLQUFKLEVBQVcwQixRQUFYLENBQWI7QUFDQW5DLG9CQUFFK0IsV0FBRixDQUFjLG9DQUFpQnRCLElBQWpCLENBQWQsRUFBc0NsRCxNQUF0QyxDQUE2Q3lCLEVBQTdDLENBQWdEQyxJQUFoRDtBQUNELEdBSkMsQ0FBRjtBQUtELENBZk8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCBjaGFpQXNQcm9taXNlZCBmcm9tICdjaGFpLWFzLXByb21pc2VkJztcbmltcG9ydCBCYXNlRHJpdmVyLCB7IEltYWdlRWxlbWVudCB9IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IG1ha2VJbWFnZUVsZW1lbnRDYWNoZSwgZ2V0SW1nRWxGcm9tQXJncyB9IGZyb20gJy4uLy4uL2xpYi9iYXNlZHJpdmVyL2ltYWdlLWVsZW1lbnQnO1xuaW1wb3J0IHsgSU1BR0VfRUxFTUVOVF9QUkVGSVggfSBmcm9tICcuLi8uLi9saWIvcHJvdG9jb2wvcHJvdG9jb2wnO1xuaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcblxuXG5jaGFpLnNob3VsZCgpO1xuY2hhaS51c2UoY2hhaUFzUHJvbWlzZWQpO1xuXG5cbmNvbnN0IGRlZlJlY3QgPSB7eDogMTAwLCB5OiAxMTAsIHdpZHRoOiA1MCwgaGVpZ2h0OiAyNX07XG5jb25zdCBkZWZUZW1wbGF0ZSA9ICdpVkJPUmFzZGYnO1xuXG5kZXNjcmliZSgnSW1hZ2VFbGVtZW50JywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBkcml2ZXIgPSBuZXcgQmFzZURyaXZlcigpO1xuXG4gIGRlc2NyaWJlKCcuc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgaW1hZ2UgZWwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBlbCA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgICAgZWwuc2l6ZS5zaG91bGQuZXFsKHt3aWR0aDogZGVmUmVjdC53aWR0aCwgaGVpZ2h0OiBkZWZSZWN0LmhlaWdodH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmxvY2F0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW1hZ2UgZWwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBlbCA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgICAgZWwubG9jYXRpb24uc2hvdWxkLmVxbCh7eDogZGVmUmVjdC54LCB5OiBkZWZSZWN0Lnl9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5jZW50ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNlbnRlciBsb2NhdGlvbiBvZiB0aGUgaW1hZ2UgZWwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBlbCA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgICAgZWwuY2VudGVyLnNob3VsZC5lcWwoe1xuICAgICAgICB4OiBkZWZSZWN0LnggKyBkZWZSZWN0LndpZHRoIC8gMixcbiAgICAgICAgeTogZGVmUmVjdC55ICsgZGVmUmVjdC5oZWlnaHQgLyAyXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5hc0VsZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBnZXQgdGhlIHdlYmRyaXZlciBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBlbCA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgICAgZWwuYXNFbGVtZW50KCdFTEVNRU5UJykuRUxFTUVOVC5zaG91bGQubWF0Y2goL15hcHBpdW0taW1hZ2UtZWwvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5lcXVhbHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzYXkgdHdvIGltYWdlIGVsZW1lbnRzIHdpdGggc2FtZSByZWN0IGFyZSBlcXVhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGVsMSA9IG5ldyBJbWFnZUVsZW1lbnQoJ2ZvbycsIGRlZlJlY3QpO1xuICAgICAgY29uc3QgZWwyID0gbmV3IEltYWdlRWxlbWVudCgnYmFyJywgZGVmUmVjdCk7XG4gICAgICBlbDEuZXF1YWxzKGVsMikuc2hvdWxkLmJlLnRydWU7XG4gICAgICBlbDIuZXF1YWxzKGVsMSkuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBzYXkgdHdvIGltYWdlIGVsZW1lbnRzIHdpdGggZGlmZmVyZW50IHJlY3QgYXJlIG5vdCBlcXVhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGVsMSA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIHsuLi5kZWZSZWN0LCB4OiAwfSk7XG4gICAgICBjb25zdCBlbDIgPSBuZXcgSW1hZ2VFbGVtZW50KGRlZlRlbXBsYXRlLCBkZWZSZWN0KTtcbiAgICAgIGVsMS5lcXVhbHMoZWwyKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgICBlbDIuZXF1YWxzKGVsMSkuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmNsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFuIGludmFsaWQgdGFwIHN0cmF0ZWd5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZCA9IG5ldyBCYXNlRHJpdmVyKCk7XG4gICAgICBjb25zdCBlbCA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgICAgYXdhaXQgZC5zZXR0aW5ncy51cGRhdGUoe2ltYWdlRWxlbWVudFRhcFN0cmF0ZWd5OiAnYmFkJ30pO1xuICAgICAgYXdhaXQgZWwuY2xpY2soZCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9JbmNvcnJlY3QgaW1hZ2VFbGVtZW50VGFwU3RyYXRlZ3kvKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHRyeSB0byBjaGVjayBmb3IgaW1hZ2UgZWxlbWVudCBzdGFsZW5lc3MsIGFuZCB0aHJvdyBpZiBzdGFsZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgQmFzZURyaXZlcigpO1xuICAgICAgc2lub24uc3R1YihkLCAnZmluZEJ5SW1hZ2UnKS50aHJvd3MoKTtcbiAgICAgIGNvbnN0IGVsID0gbmV3IEltYWdlRWxlbWVudChkZWZUZW1wbGF0ZSwgZGVmUmVjdCk7XG4gICAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGZvciBzdGFsZW5lc3MgaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQgdG8gZG8gc29cbiAgICAgIGF3YWl0IGQuc2V0dGluZ3MudXBkYXRlKHtcbiAgICAgICAgY2hlY2tGb3JJbWFnZUVsZW1lbnRTdGFsZW5lc3M6IHRydWUsXG4gICAgICAgIGF1dG9VcGRhdGVJbWFnZUVsZW1lbnRQb3NpdGlvbjogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgZWwuY2xpY2soZCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9ubyBsb25nZXIgYXR0YWNoZWQvKTtcblxuICAgICAgLy8gYW5kIGFsc28gaWYgd2UgYXJlIHVwZGF0aW5nIHRoZSBlbGVtZW50IHBvc2l0aW9uXG4gICAgICBhd2FpdCBkLnNldHRpbmdzLnVwZGF0ZSh7XG4gICAgICAgIGNoZWNrRm9ySW1hZ2VFbGVtZW50U3RhbGVuZXNzOiBmYWxzZSxcbiAgICAgICAgYXV0b1VwZGF0ZUltYWdlRWxlbWVudFBvc2l0aW9uOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGVsLmNsaWNrKGQpLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aCgvbm8gbG9uZ2VyIGF0dGFjaGVkLyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBhdXRvLXVwZGF0ZSBlbGVtZW50IHBvc2l0aW9uIGlmIHJlcXVlc3RlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgQmFzZURyaXZlcigpO1xuICAgICAgZC5wZXJmb3JtQWN0aW9ucyA9IF8ubm9vcDtcbiAgICAgIHNpbm9uLnN0dWIoZCwgJ3BlcmZvcm1BY3Rpb25zJyk7XG4gICAgICBjb25zdCBlbCA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgICAgY29uc3QgbmV3UmVjdCA9IHsuLi5kZWZSZWN0LCB4OiBkZWZSZWN0LnggKyAxMCwgeTogZGVmUmVjdC55ICsgNX07XG4gICAgICBjb25zdCBlbFBvczIgPSBuZXcgSW1hZ2VFbGVtZW50KGRlZlRlbXBsYXRlLCBuZXdSZWN0KTtcbiAgICAgIHNpbm9uLnN0dWIoZCwgJ2ZpbmRCeUltYWdlJykucmV0dXJucyhlbFBvczIpO1xuICAgICAgYXdhaXQgZC5zZXR0aW5ncy51cGRhdGUoe1xuICAgICAgICBhdXRvVXBkYXRlSW1hZ2VFbGVtZW50UG9zaXRpb246IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGVsLnJlY3Quc2hvdWxkLm5vdC5lcWwobmV3UmVjdCk7XG4gICAgICBhd2FpdCBlbC5jbGljayhkKTtcbiAgICAgIGVsLnJlY3Quc2hvdWxkLmVxbChuZXdSZWN0KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHRhcCB0aGUgY2VudGVyIG9mIGFuIGVsZW1lbnQgdXNpbmcgdzNjIGFjdGlvbnMgYnkgZGVmYXVsdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgQmFzZURyaXZlcigpO1xuICAgICAgZC5wZXJmb3JtQWN0aW9ucyA9IF8ubm9vcDtcbiAgICAgIGNvbnN0IGFjdGlvblN0dWIgPSBzaW5vbi5zdHViKGQsICdwZXJmb3JtQWN0aW9ucycpO1xuICAgICAgY29uc3QgZWwgPSBuZXcgSW1hZ2VFbGVtZW50KGRlZlRlbXBsYXRlLCBkZWZSZWN0KTtcbiAgICAgIC8vIHNraXAgdGhlIHN0YWxlbmVzcyBjaGVjayBmb3IgdGhpcyB0ZXN0XG4gICAgICBhd2FpdCBkLnNldHRpbmdzLnVwZGF0ZSh7XG4gICAgICAgIGNoZWNrRm9ySW1hZ2VFbGVtZW50U3RhbGVuZXNzOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgZWwuY2xpY2soZCk7XG4gICAgICBjb25zdCBwb2ludGVyTW92ZUFjdGlvbiA9IGFjdGlvblN0dWIuYXJnc1swXVswXVswXS5hY3Rpb25zWzBdO1xuICAgICAgcG9pbnRlck1vdmVBY3Rpb24ueC5zaG91bGQuZXF1YWwoZWwuY2VudGVyLngpO1xuICAgICAgcG9pbnRlck1vdmVBY3Rpb24ueS5zaG91bGQuZXF1YWwoZWwuY2VudGVyLnkpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFsbCBiYWNrIHRvIHRvdWNoYWN0aW9ucyBpZiB3M2MgYWN0aW9ucyBkbyBub3QgZXhpc3Qgb24gZHJpdmVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZCA9IG5ldyBCYXNlRHJpdmVyKCk7XG4gICAgICBkLnBlcmZvcm1Ub3VjaCA9IF8ubm9vcDtcbiAgICAgIGNvbnN0IGFjdGlvblN0dWIgPSBzaW5vbi5zdHViKGQsICdwZXJmb3JtVG91Y2gnKTtcbiAgICAgIGNvbnN0IGVsID0gbmV3IEltYWdlRWxlbWVudChkZWZUZW1wbGF0ZSwgZGVmUmVjdCk7XG4gICAgICAvLyBza2lwIHRoZSBzdGFsZW5lc3MgY2hlY2sgZm9yIHRoaXMgdGVzdFxuICAgICAgYXdhaXQgZC5zZXR0aW5ncy51cGRhdGUoe1xuICAgICAgICBjaGVja0ZvckltYWdlRWxlbWVudFN0YWxlbmVzczogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGVsLmNsaWNrKGQpO1xuICAgICAgY29uc3QgYWN0aW9uID0gYWN0aW9uU3R1Yi5hcmdzWzBdWzBdWzBdLm9wdGlvbnM7XG4gICAgICBhY3Rpb24ueC5zaG91bGQuZXF1YWwoZWwuY2VudGVyLngpO1xuICAgICAgYWN0aW9uLnkuc2hvdWxkLmVxdWFsKGVsLmNlbnRlci55KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHVzZSB0b3VjaGFjdGlvbnMgaWYgcmVxdWVzdGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZCA9IG5ldyBCYXNlRHJpdmVyKCk7XG4gICAgICBkLnBlcmZvcm1BY3Rpb25zID0gXy5ub29wO1xuICAgICAgY29uc3QgdzNjU3R1YiA9IHNpbm9uLnN0dWIoZCwgJ3BlcmZvcm1BY3Rpb25zJyk7XG4gICAgICBkLnBlcmZvcm1Ub3VjaCA9IF8ubm9vcDtcbiAgICAgIGNvbnN0IHRvdWNoU3R1YiA9IHNpbm9uLnN0dWIoZCwgJ3BlcmZvcm1Ub3VjaCcpO1xuICAgICAgY29uc3QgZWwgPSBuZXcgSW1hZ2VFbGVtZW50KGRlZlRlbXBsYXRlLCBkZWZSZWN0KTtcbiAgICAgIC8vIHNraXAgdGhlIHN0YWxlbmVzcyBjaGVjayBmb3IgdGhpcyB0ZXN0XG4gICAgICBhd2FpdCBkLnNldHRpbmdzLnVwZGF0ZSh7XG4gICAgICAgIGNoZWNrRm9ySW1hZ2VFbGVtZW50U3RhbGVuZXNzOiBmYWxzZSxcbiAgICAgICAgaW1hZ2VFbGVtZW50VGFwU3RyYXRlZ3k6ICd0b3VjaEFjdGlvbnMnLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBlbC5jbGljayhkKTtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHRvdWNoU3R1Yi5hcmdzWzBdWzBdWzBdLm9wdGlvbnM7XG4gICAgICBhY3Rpb24ueC5zaG91bGQuZXF1YWwoZWwuY2VudGVyLngpO1xuICAgICAgYWN0aW9uLnkuc2hvdWxkLmVxdWFsKGVsLmNlbnRlci55KTtcbiAgICAgIHczY1N0dWIuY2FsbENvdW50LnNob3VsZC5lcWwoMCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBkcml2ZXIgZG9lcyBub3QgaW1wbGVtZW50IGFueSB0eXBlIG9mIGFjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgQmFzZURyaXZlcigpO1xuICAgICAgY29uc3QgZWwgPSBuZXcgSW1hZ2VFbGVtZW50KGRlZlRlbXBsYXRlLCBkZWZSZWN0KTtcbiAgICAgIC8vIHNraXAgdGhlIHN0YWxlbmVzcyBjaGVjayBmb3IgdGhpcyB0ZXN0XG4gICAgICBhd2FpdCBkLnNldHRpbmdzLnVwZGF0ZSh7XG4gICAgICAgIGNoZWNrRm9ySW1hZ2VFbGVtZW50U3RhbGVuZXNzOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgZWwuY2xpY2soZCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9kaWQgbm90IGltcGxlbWVudC8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnI2V4ZWN1dGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gYUdGd2NIa2dkR1Z6ZEdsdVp3PT0gaXMgJ2hhcHB5IHRlc3RpbmcnXG4gICAgY29uc3QgaW1nRWwgPSBuZXcgSW1hZ2VFbGVtZW50KGRlZlRlbXBsYXRlLCBkZWZSZWN0LCAnYUdGd2NIa2dkR1Z6ZEdsdVp3PT0nKTtcbiAgICBjb25zdCBjbGlja1N0dWIgPSBzaW5vbi5zdHViKGltZ0VsLCAnY2xpY2snKTtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICBkcml2ZXIuX2ltZ0VsQ2FjaGUuc2V0KGltZ0VsLmlkLCBpbWdFbCk7XG4gICAgICBjbGlja1N0dWIucmV0dXJucyh0cnVlKTtcbiAgICB9KTtcblxuICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIGRyaXZlci5faW1nRWxDYWNoZS5yZXNldCgpO1xuICAgICAgY2xpY2tTdHViLnJlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGV4ZWN1dGlvbnMgb24gZWxlbWVudHMgbm90IGluIHRoZSBjYWNoZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IEltYWdlRWxlbWVudC5leGVjdXRlKGRyaXZlciwgJ2NsaWNrJywgJ2FwcGl1bS1pbWFnZS1lbGVtZW50LWZvbycpXG4gICAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL2VsZW1lbnQgY291bGQgbm90IGJlIGxvY2F0ZWQvKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBleGVjdXRpb25zIGZvciB1bnN1cHBvcnRlZCBjb21tYW5kcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IEltYWdlRWxlbWVudC5leGVjdXRlKGRyaXZlciwgJ2Zvb2JhcicsIGltZ0VsLmlkKVxuICAgICAgICAuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9ub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQvKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGdldCBkaXNwbGF5ZWQgc3RhdHVzIG9mIGVsZW1lbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBJbWFnZUVsZW1lbnQuZXhlY3V0ZShkcml2ZXIsICdlbGVtZW50RGlzcGxheWVkJywgaW1nRWwuaWQpXG4gICAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5iZS50cnVlO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZ2V0IHNpemUgb2YgZWxlbWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IEltYWdlRWxlbWVudC5leGVjdXRlKGRyaXZlciwgJ2dldFNpemUnLCBpbWdFbC5pZClcbiAgICAgICAgLnNob3VsZC5ldmVudHVhbGx5LmVxbCh7d2lkdGg6IGRlZlJlY3Qud2lkdGgsIGhlaWdodDogZGVmUmVjdC5oZWlnaHR9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGdldCBsb2NhdGlvbiBvZiBlbGVtZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgSW1hZ2VFbGVtZW50LmV4ZWN1dGUoZHJpdmVyLCAnZ2V0TG9jYXRpb24nLCBpbWdFbC5pZClcbiAgICAgICAgLnNob3VsZC5ldmVudHVhbGx5LmVxbCh7eDogZGVmUmVjdC54LCB5OiBkZWZSZWN0Lnl9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGdldCBsb2NhdGlvbiBpbiB2aWV3IG9mIGVsZW1lbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBJbWFnZUVsZW1lbnQuZXhlY3V0ZShkcml2ZXIsICdnZXRMb2NhdGlvbicsIGltZ0VsLmlkKVxuICAgICAgICAuc2hvdWxkLmV2ZW50dWFsbHkuZXFsKHt4OiBkZWZSZWN0LngsIHk6IGRlZlJlY3QueX0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZ2V0IHJlY3Qgb2YgZWxlbWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IEltYWdlRWxlbWVudC5leGVjdXRlKGRyaXZlciwgJ2dldEVsZW1lbnRSZWN0JywgaW1nRWwuaWQpXG4gICAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5lcWwoZGVmUmVjdCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBnZXQgdmlzdWFsIG9mIGVsZW1lbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBJbWFnZUVsZW1lbnQuZXhlY3V0ZShkcml2ZXIsICdnZXRBdHRyaWJ1dGUnLCBpbWdFbC5pZCwgJ3Zpc3VhbCcpXG4gICAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5lcWwoJ2FHRndjSGtnZEdWemRHbHVadz09Jyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBnZXQgbnVsbCBhcyB2aXN1YWwgb2YgZWxlbWVudCBieSBkZWZhdWx0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW1nRWxlbWVudCA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgICAgZHJpdmVyLl9pbWdFbENhY2hlLnNldChpbWdFbGVtZW50LmlkLCBpbWdFbGVtZW50KTtcbiAgICAgIGF3YWl0IEltYWdlRWxlbWVudC5leGVjdXRlKGRyaXZlciwgJ2dldEF0dHJpYnV0ZScsIGltZ0VsZW1lbnQuaWQsICd2aXN1YWwnKVxuICAgICAgICAuc2hvdWxkLmV2ZW50dWFsbHkuZXFsKG51bGwpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgbm90IGdldCBvdGhlciBhdHRyaWJ1dGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBJbWFnZUVsZW1lbnQuZXhlY3V0ZShkcml2ZXIsICdnZXRBdHRyaWJ1dGUnLCBpbWdFbC5pZCwgJ2NvbnRlbnQtZGVzYycpXG4gICAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5yZWplY3RlZFdpdGgoJ01ldGhvZCBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBjbGljayBlbGVtZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgSW1hZ2VFbGVtZW50LmV4ZWN1dGUoZHJpdmVyLCAnY2xpY2snLCBpbWdFbC5pZClcbiAgICAgICAgLnNob3VsZC5ldmVudHVhbGx5LmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdpbWFnZSBlbGVtZW50IExSVSBjYWNoZScsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCBhY2NlcHQgYW5kIGNhY2hlIGltYWdlIGVsZW1lbnRzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGVsMSA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgIGNvbnN0IGVsMiA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgIGNvbnN0IGNhY2hlID0gbWFrZUltYWdlRWxlbWVudENhY2hlKCk7XG4gICAgY2FjaGUuc2V0KGVsMS5pZCwgZWwxKTtcbiAgICBlbDEuZXF1YWxzKGNhY2hlLmdldChlbDEuaWQpKS5zaG91bGQuYmUudHJ1ZTtcbiAgICBfLmlzVW5kZWZpbmVkKGNhY2hlLmdldChlbDIuaWQpKS5zaG91bGQuYmUudHJ1ZTtcbiAgICBjYWNoZS5oYXMoZWwxLmlkKS5zaG91bGQuYmUudHJ1ZTtcbiAgICBjYWNoZS5oYXMoZWwyLmlkKS5zaG91bGQuYmUuZmFsc2U7XG4gIH0pO1xuICBpdCgnb25jZSBjYWNoZSByZWFjaGVzIG1heCBzaXplLCBzaG91bGQgZWplY3QgaW1hZ2UgZWxlbWVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZWwxID0gbmV3IEltYWdlRWxlbWVudChkZWZUZW1wbGF0ZSwgZGVmUmVjdCk7XG4gICAgY29uc3QgZWwyID0gbmV3IEltYWdlRWxlbWVudChkZWZUZW1wbGF0ZSwgZGVmUmVjdCk7XG4gICAgY29uc3QgY2FjaGUgPSBtYWtlSW1hZ2VFbGVtZW50Q2FjaGUoZGVmVGVtcGxhdGUubGVuZ3RoICsgMSk7XG4gICAgY2FjaGUuc2V0KGVsMS5pZCwgZWwxKTtcbiAgICBjYWNoZS5oYXMoZWwxLmlkKS5zaG91bGQuYmUudHJ1ZTtcbiAgICBjYWNoZS5zZXQoZWwyLmlkLCBlbDIpO1xuICAgIGNhY2hlLmhhcyhlbDIuaWQpLnNob3VsZC5iZS50cnVlO1xuICAgIGNhY2hlLmhhcyhlbDEuaWQpLnNob3VsZC5iZS5mYWxzZTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2dldEltZ0VsRnJvbUFyZ3MnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBpbWFnZSBlbGVtZW50IGlkIGZyb20ganNvbiBvYmogaW4gYXJncycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpbWdFbCA9IGAke0lNQUdFX0VMRU1FTlRfUFJFRklYfWZvb2A7XG4gICAgY29uc3QgYXJncyA9IFsxLCAnZm9vJywgaW1nRWxdO1xuICAgIGdldEltZ0VsRnJvbUFyZ3MoYXJncykuc2hvdWxkLmVxbChpbWdFbCk7XG4gIH0pO1xuICBpdCgnc2hvdWxkIG5vdCByZXR1cm4gYW55dGhpbmcgaWYgaW1hZ2UgZWxlbWVudCBpZCBub3QgaW4gYXJncycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBhcmdzID0gWzEsICdmb28nXTtcbiAgICBfLmlzVW5kZWZpbmVkKGdldEltZ0VsRnJvbUFyZ3MoYXJncykpLnNob3VsZC5iZS50cnVlO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCBub3QgZmluZCBpbWFnZSBlbGVtZW50IGlkIGluIGFueXRoaW5nIGJ1dCBwcmVmaXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgbm90SW1nRWwgPSBgZm9vJHtJTUFHRV9FTEVNRU5UX1BSRUZJWH1gO1xuICAgIGNvbnN0IGFyZ3MgPSBbMSwgJ2ZvbycsIG5vdEltZ0VsXTtcbiAgICBfLmlzVW5kZWZpbmVkKGdldEltZ0VsRnJvbUFyZ3MoYXJncykpLnNob3VsZC5iZS50cnVlO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L2Jhc2Vkcml2ZXIvaW1hZ2UtZWxlbWVudC1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9