@genialis/resolwe
Version:
Resolwe frontend libraries
183 lines (181 loc) • 24.7 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
var _ = require("lodash");
var angular = require("angular");
require("angular-mocks");
var mock_1 = require("../api/mock");
var matchers_1 = require("./matchers");
var error_1 = require("../core/errors/error");
var lang_1 = require("../core/utils/lang");
var mock_2 = require("./mock");
require("./matchers");
// Service modules that should be loaded.
require("../core/shared_store/index");
require("../core/components/manager");
/**
* Helper for creating simple shared stores in tests. Also see
* [[SharedStoreProvider.create]].
*
* @param storeId Identifier of the shared store (must be globally unique)
* @param initialState Optional initial state of the shared store
*/
function createSharedStore(storeId, initialState) {
if (initialState === void 0) { initialState = null; }
return {
storeId: storeId,
initialState: initialState,
};
}
exports.createSharedStore = createSharedStore;
/**
* Helper for using shared stores in tests.
*
* @param storeId Identifier of the shared store (must be globally unique)
* @param factory Shared store class
*/
function useSharedStore(storeId, factory) {
return {
storeId: storeId,
factory: factory,
};
}
exports.useSharedStore = useSharedStore;
/**
* Helper function when unit testing components which compiles a component.
*
* @param $compile Compile service
* @param $scope Scope service
* @param template template in the form of a directive, e.g. `'<gen-some-component><gen-some-component>'`
* @returns {ComponentDescriptor} Element and its controller
*/
function getComponent($compile, $scope, template) {
// TODO: instead of having getComponent<T>, we could have getComponent<T extends ComponentBase> and then you would do
// T.asView thus reducing the need for template argument, but looks like typescript does not support that (yet)
// https://github.com/Microsoft/TypeScript/issues/5677
var element = $compile(template)($scope);
$scope.$digest();
var ctrl;
try {
ctrl = $scope['$$childTail'].ctrl;
}
catch (e) {
throw new error_1.GenError("Unable to fetch component controller. Did you load your module in tests?");
}
return {
element: element,
ctrl: ctrl,
};
}
exports.getComponent = getComponent;
/**
* A helper function to ease testing of components. It will take care of mocking the
* usual modules needed for testing components and preparing a module that you can use
* to register test components.
*
* The test case is passed an instance of [[ComponentTester]], which contains some
* useful properties and methods for testing components.
*
* The following modules are automatically loaded:
* * `resolwe.services.shared_store`
*
* If you need to load any additional modules, specify them in the `modules`
* argument.
*
* @param description Test case description
* @param modules List of modules to load for this test
* @param tests Test case body
* @param apiClass Optional mock API class that should be used
* @param baseModules Optional list of modules to load before everything for this test
*/
function describeComponent(description, modules, tests, apiClass, baseModules) {
if (apiClass === void 0) { apiClass = mock_1.MockApi; }
if (baseModules === void 0) { baseModules = []; }
describe(description, function () {
var $compile;
var $scope;
var mockApi;
var moduleName = 'resolwe.tests.' + description.replace(/ /g, '.');
var module = angular.module(moduleName, []);
// Load base modules.
beforeEach(angular.mock.module('resolwe.services.shared_store'));
beforeEach(angular.mock.module('resolwe.services.state_manager'));
baseModules.forEach(function (baseModule) { return beforeEach(angular.mock.module(baseModule)); });
beforeEach(angular.mock.module(function ($provide) {
// Explicitly set root element because tests do not go through usual
// Angular bootstrapping.
$provide.value('$rootElement', angular.element(document.body));
// Replace usual API service with mock API.
$provide.service('api', lang_1.ngCompose([apiClass, mock_2.MockApiService]));
}));
beforeEach(angular.mock.module(moduleName));
// Register any shared stores.
var _a = _.partition(modules, function (m) { return !!m.storeId; }), sharedStores = _a[0], additionalModules = _a[1];
module.config(["sharedStoreManagerProvider", function (sharedStoreManagerProvider) {
_.each(sharedStores, function (descriptor) {
if (descriptor.factory) {
sharedStoreManagerProvider.register(descriptor.storeId, descriptor.factory);
}
else {
sharedStoreManagerProvider.create(descriptor.storeId, descriptor.initialState);
}
});
}]);
_.each(additionalModules, function (additionalModule) {
beforeEach(angular.mock.module(additionalModule));
});
// A container in DOM where we can temporarily append component elements.
var containerElement = null;
function provideRealDOM() {
removeRealDOM();
var body = angular.element(document.body);
containerElement = angular.element('<div id="test-container-element"></div>');
body.append(containerElement);
}
function removeRealDOM() {
if (containerElement) {
containerElement.remove();
containerElement = null;
}
}
beforeEach(function () {
jasmine.addMatchers(matchers_1.ngEqualMatcher);
});
beforeEach(angular.mock.inject(function (_$compile_, _$rootScope_, _api_) {
$compile = _$compile_;
$scope = _$rootScope_.$new();
mockApi = _api_;
if (_.contains(tests.toString(), 'debugger') || _.contains(tests.toString(), ' fit(')) {
provideRealDOM();
mockApi.logUnhandledRequests(true);
}
}));
afterEach(function () {
$scope.$destroy();
removeRealDOM();
});
tests({
module: module,
createComponent: function (template) {
var component = getComponent($compile, $scope, template);
if (containerElement) {
// Append component element to actual DOM. Otherwise, computations like height will not work.
containerElement.append(component.element);
$scope.$digest();
}
return component;
},
digest: function () {
$scope.$digest();
},
api: function () {
return mockApi;
},
scope: function () {
return $scope;
},
provideRealDOM: provideRealDOM,
});
});
}
exports.describeComponent = describeComponent;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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Z0JBQWdCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDM0MsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2lCQUNwQjtnQkFFRCxPQUFPLFNBQVMsQ0FBQztZQUNyQixDQUFDO1lBRUQsTUFBTSxFQUFFO2dCQUNKLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQixDQUFDO1lBRUQsR0FBRyxFQUFFO2dCQUNELE9BQU8sT0FBTyxDQUFDO1lBQ25CLENBQUM7WUFFRCxLQUFLLEVBQUU7Z0JBQ0gsT0FBTyxNQUFNLENBQUM7WUFDbEIsQ0FBQztZQUVELGNBQWMsRUFBRSxjQUFjO1NBQ2pDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQWhIRCw4Q0FnSEMiLCJmaWxlIjoidGVzdHMvY29tcG9uZW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgYW5ndWxhciBmcm9tICdhbmd1bGFyJztcbmltcG9ydCAnYW5ndWxhci1tb2Nrcyc7XG5cbmltcG9ydCB7UmVzb2x3ZUFwaX0gZnJvbSAnLi4vYXBpL2luZGV4JztcbmltcG9ydCB7TW9ja0Jhc2UsIE1vY2tBcGl9IGZyb20gJy4uL2FwaS9tb2NrJztcbmltcG9ydCB7bmdFcXVhbE1hdGNoZXJ9IGZyb20gJy4vbWF0Y2hlcnMnO1xuaW1wb3J0IHtTaGFyZWRTdG9yZUZhY3RvcnksIFNoYXJlZFN0b3JlUHJvdmlkZXJ9IGZyb20gJy4uL2NvcmUvc2hhcmVkX3N0b3JlL2luZGV4JztcbmltcG9ydCB7R2VuRXJyb3J9IGZyb20gJy4uL2NvcmUvZXJyb3JzL2Vycm9yJztcbmltcG9ydCB7bmdDb21wb3NlfSBmcm9tICcuLi9jb3JlL3V0aWxzL2xhbmcnO1xuaW1wb3J0IHtNb2NrQXBpU2VydmljZX0gZnJvbSAnLi9tb2NrJztcbmltcG9ydCAnLi9tYXRjaGVycyc7XG5cbi8vIFNlcnZpY2UgbW9kdWxlcyB0aGF0IHNob3VsZCBiZSBsb2FkZWQuXG5pbXBvcnQgJy4uL2NvcmUvc2hhcmVkX3N0b3JlL2luZGV4JztcbmltcG9ydCAnLi4vY29yZS9jb21wb25lbnRzL21hbmFnZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudERlc2NyaXB0b3I8VD4ge1xuICAgIGVsZW1lbnQ6IGFuZ3VsYXIuSUF1Z21lbnRlZEpRdWVyeTtcbiAgICBjdHJsOiBUO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlZFN0b3JlRGVzY3JpcHRvciB7XG4gICAgc3RvcmVJZDogc3RyaW5nO1xuICAgIGluaXRpYWxTdGF0ZT86IGFueTtcbiAgICBmYWN0b3J5PzogU2hhcmVkU3RvcmVGYWN0b3J5PGFueSwgYW55Pjtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZm9yIGNyZWF0aW5nIHNpbXBsZSBzaGFyZWQgc3RvcmVzIGluIHRlc3RzLiBBbHNvIHNlZVxuICogW1tTaGFyZWRTdG9yZVByb3ZpZGVyLmNyZWF0ZV1dLlxuICpcbiAqIEBwYXJhbSBzdG9yZUlkIElkZW50aWZpZXIgb2YgdGhlIHNoYXJlZCBzdG9yZSAobXVzdCBiZSBnbG9iYWxseSB1bmlxdWUpXG4gKiBAcGFyYW0gaW5pdGlhbFN0YXRlIE9wdGlvbmFsIGluaXRpYWwgc3RhdGUgb2YgdGhlIHNoYXJlZCBzdG9yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2hhcmVkU3RvcmUoc3RvcmVJZDogc3RyaW5nLCBpbml0aWFsU3RhdGU6IGFueSA9IG51bGwpOiBTaGFyZWRTdG9yZURlc2NyaXB0b3Ige1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0b3JlSWQsXG4gICAgICAgIGluaXRpYWxTdGF0ZSxcbiAgICB9O1xufVxuXG4vKipcbiAqIEhlbHBlciBmb3IgdXNpbmcgc2hhcmVkIHN0b3JlcyBpbiB0ZXN0cy5cbiAqXG4gKiBAcGFyYW0gc3RvcmVJZCBJZGVudGlmaWVyIG9mIHRoZSBzaGFyZWQgc3RvcmUgKG11c3QgYmUgZ2xvYmFsbHkgdW5pcXVlKVxuICogQHBhcmFtIGZhY3RvcnkgU2hhcmVkIHN0b3JlIGNsYXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTaGFyZWRTdG9yZShzdG9yZUlkOiBzdHJpbmcsIGZhY3Rvcnk6IFNoYXJlZFN0b3JlRmFjdG9yeTxhbnksIGFueT4pOiBTaGFyZWRTdG9yZURlc2NyaXB0b3Ige1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0b3JlSWQsXG4gICAgICAgIGZhY3RvcnksXG4gICAgfTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gd2hlbiB1bml0IHRlc3RpbmcgY29tcG9uZW50cyB3aGljaCBjb21waWxlcyBhIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0gJGNvbXBpbGUgQ29tcGlsZSBzZXJ2aWNlXG4gKiBAcGFyYW0gJHNjb3BlIFNjb3BlIHNlcnZpY2VcbiAqIEBwYXJhbSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBpbiB0aGUgZm9ybSBvZiBhIGRpcmVjdGl2ZSwgZS5nLiBgJzxnZW4tc29tZS1jb21wb25lbnQ+PGdlbi1zb21lLWNvbXBvbmVudD4nYFxuICogQHJldHVybnMge0NvbXBvbmVudERlc2NyaXB0b3J9IEVsZW1lbnQgYW5kIGl0cyBjb250cm9sbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21wb25lbnQ8VD4oJGNvbXBpbGU6IGFuZ3VsYXIuSUNvbXBpbGVTZXJ2aWNlLCAkc2NvcGU6IGFuZ3VsYXIuSVNjb3BlLCB0ZW1wbGF0ZTogc3RyaW5nKTogQ29tcG9uZW50RGVzY3JpcHRvcjxUPiB7XG5cbiAgICAvLyBUT0RPOiBpbnN0ZWFkIG9mIGhhdmluZyBnZXRDb21wb25lbnQ8VD4sIHdlIGNvdWxkIGhhdmUgZ2V0Q29tcG9uZW50PFQgZXh0ZW5kcyBDb21wb25lbnRCYXNlPiBhbmQgdGhlbiB5b3Ugd291bGQgZG9cbiAgICAvLyBULmFzVmlldyB0aHVzIHJlZHVjaW5nIHRoZSBuZWVkIGZvciB0ZW1wbGF0ZSBhcmd1bWVudCwgYnV0IGxvb2tzIGxpa2UgdHlwZXNjcmlwdCBkb2VzIG5vdCBzdXBwb3J0IHRoYXQgKHlldClcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzU2NzdcblxuICAgIGNvbnN0IGVsZW1lbnQgPSAkY29tcGlsZSh0ZW1wbGF0ZSkoJHNjb3BlKTtcbiAgICAkc2NvcGUuJGRpZ2VzdCgpO1xuXG4gICAgbGV0IGN0cmw6IFQ7XG4gICAgdHJ5IHtcbiAgICAgICAgY3RybCA9ICRzY29wZVsnJCRjaGlsZFRhaWwnXS5jdHJsO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEdlbkVycm9yKFwiVW5hYmxlIHRvIGZldGNoIGNvbXBvbmVudCBjb250cm9sbGVyLiBEaWQgeW91IGxvYWQgeW91ciBtb2R1bGUgaW4gdGVzdHM/XCIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGN0cmw6IGN0cmwsXG4gICAgfTtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZXhwb3NlZCB0byB0ZXN0IGNhc2UgZnVuY3Rpb25zLCB3aGljaCBhcmUgY3JlYXRlZCB1c2luZyBbW2Rlc2NyaWJlQ29tcG9uZW50XV0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50VGVzdGVyIHtcbiAgICAvLy8gQW5ndWxhciBtb2R1bGUsIHdoaWNoIG1heSBiZSB1c2VkIHRvIHJlZ2lzdGVyIHRlc3QgY29tcG9uZW50cyBpbi5cbiAgICBtb2R1bGU6IGFuZ3VsYXIuSU1vZHVsZTtcblxuICAgIC8qKlxuICAgICAqIFNlZSBbW2dldENvbXBvbmVudF1dLlxuICAgICAqL1xuICAgIGNyZWF0ZUNvbXBvbmVudDxUPih0ZW1wbGF0ZTogc3RyaW5nKTogQ29tcG9uZW50RGVzY3JpcHRvcjxUPjtcblxuICAgIC8qKlxuICAgICAqIFJ1bnMgYW4gQW5ndWxhciBkaWdlc3QgY3ljbGUuXG4gICAgICovXG4gICAgZGlnZXN0KCk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtb2NrIHZlcnNpb24gb2YgdGhlIEFQSSwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gc2ltdWxhdGUgdGhlIGJhY2tlbmRcbiAgICAgKiB3aGVuIHRlc3RpbmcgY29tcG9uZW50cy4gVGhlIG1vY2sgQVBJIGlzIGF1dG9tYXRpY2FsbHkgaW5qZWN0ZWQgaW50byBjb21wb25lbnRzXG4gICAgICogYW5kIHJlcGxhY2VzIHRoZSB1c3VhbCBBUEkuXG4gICAgICovXG4gICAgYXBpKCk6IFJlc29sd2VBcGkgJiBNb2NrQmFzZSAmIE1vY2tBcGlTZXJ2aWNlO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2NvcGUuXG4gICAgICovXG4gICAgc2NvcGUoKTogYW5ndWxhci5JU2NvcGU7XG5cbiAgICAvKipcbiAgICAgKiBFbnN1cmVzIHRoYXQgdGhlIHRlc3RlZCBjb21wb25lbnRzIGFyZSBpbnNlcnRlZCBpbnRvIGFuIGFjdHVhbCBET00sIHNvIHRoaW5nc1xuICAgICAqIGxpa2UgaGVpZ2h0IGNhbGN1bGF0aW9ucyB3b3JrIGFzIGV4cGVjdGVkLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZVxuICAgICAqIGFueSBbW2NyZWF0ZUNvbXBvbmVudF1dIGNhbGxzLlxuICAgICAqL1xuICAgIHByb3ZpZGVSZWFsRE9NKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ja0FwaUZhY3Rvcnkge1xuICAgIG5ldyAoLi4uYXJnczogYW55W10pOiBSZXNvbHdlQXBpICYgTW9ja0Jhc2U7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gZWFzZSB0ZXN0aW5nIG9mIGNvbXBvbmVudHMuIEl0IHdpbGwgdGFrZSBjYXJlIG9mIG1vY2tpbmcgdGhlXG4gKiB1c3VhbCBtb2R1bGVzIG5lZWRlZCBmb3IgdGVzdGluZyBjb21wb25lbnRzIGFuZCBwcmVwYXJpbmcgYSBtb2R1bGUgdGhhdCB5b3UgY2FuIHVzZVxuICogdG8gcmVnaXN0ZXIgdGVzdCBjb21wb25lbnRzLlxuICpcbiAqIFRoZSB0ZXN0IGNhc2UgaXMgcGFzc2VkIGFuIGluc3RhbmNlIG9mIFtbQ29tcG9uZW50VGVzdGVyXV0sIHdoaWNoIGNvbnRhaW5zIHNvbWVcbiAqIHVzZWZ1bCBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIGZvciB0ZXN0aW5nIGNvbXBvbmVudHMuXG4gKlxuICogVGhlIGZvbGxvd2luZyBtb2R1bGVzIGFyZSBhdXRvbWF0aWNhbGx5IGxvYWRlZDpcbiAqICogYHJlc29sd2Uuc2VydmljZXMuc2hhcmVkX3N0b3JlYFxuICpcbiAqIElmIHlvdSBuZWVkIHRvIGxvYWQgYW55IGFkZGl0aW9uYWwgbW9kdWxlcywgc3BlY2lmeSB0aGVtIGluIHRoZSBgbW9kdWxlc2BcbiAqIGFyZ3VtZW50LlxuICpcbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUZXN0IGNhc2UgZGVzY3JpcHRpb25cbiAqIEBwYXJhbSBtb2R1bGVzIExpc3Qgb2YgbW9kdWxlcyB0byBsb2FkIGZvciB0aGlzIHRlc3RcbiAqIEBwYXJhbSB0ZXN0cyBUZXN0IGNhc2UgYm9keVxuICogQHBhcmFtIGFwaUNsYXNzIE9wdGlvbmFsIG1vY2sgQVBJIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHVzZWRcbiAqIEBwYXJhbSBiYXNlTW9kdWxlcyBPcHRpb25hbCBsaXN0IG9mIG1vZHVsZXMgdG8gbG9hZCBiZWZvcmUgZXZlcnl0aGluZyBmb3IgdGhpcyB0ZXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNjcmliZUNvbXBvbmVudChkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXM6IGFueVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RzOiAodGVzdGVyOiBDb21wb25lbnRUZXN0ZXIpID0+IHZvaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpQ2xhc3M6IE1vY2tBcGlGYWN0b3J5ID0gTW9ja0FwaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlTW9kdWxlczogc3RyaW5nW10gPSBbXSk6IHZvaWQge1xuICAgIGRlc2NyaWJlKGRlc2NyaXB0aW9uLCAoKSA9PiB7XG4gICAgICAgIGxldCAkY29tcGlsZTogYW5ndWxhci5JQ29tcGlsZVNlcnZpY2U7XG4gICAgICAgIGxldCAkc2NvcGU6IGFuZ3VsYXIuSVNjb3BlO1xuICAgICAgICBsZXQgbW9ja0FwaTogUmVzb2x3ZUFwaSAmIE1vY2tCYXNlICYgTW9ja0FwaVNlcnZpY2U7XG5cbiAgICAgICAgY29uc3QgbW9kdWxlTmFtZSA9ICdyZXNvbHdlLnRlc3RzLicgKyBkZXNjcmlwdGlvbi5yZXBsYWNlKC8gL2csICcuJyk7XG4gICAgICAgIGNvbnN0IG1vZHVsZTogYW5ndWxhci5JTW9kdWxlID0gYW5ndWxhci5tb2R1bGUobW9kdWxlTmFtZSwgW10pO1xuXG4gICAgICAgIC8vIExvYWQgYmFzZSBtb2R1bGVzLlxuICAgICAgICBiZWZvcmVFYWNoKGFuZ3VsYXIubW9jay5tb2R1bGUoJ3Jlc29sd2Uuc2VydmljZXMuc2hhcmVkX3N0b3JlJykpO1xuICAgICAgICBiZWZvcmVFYWNoKGFuZ3VsYXIubW9jay5tb2R1bGUoJ3Jlc29sd2Uuc2VydmljZXMuc3RhdGVfbWFuYWdlcicpKTtcbiAgICAgICAgYmFzZU1vZHVsZXMuZm9yRWFjaCgoYmFzZU1vZHVsZSkgPT4gYmVmb3JlRWFjaChhbmd1bGFyLm1vY2subW9kdWxlKGJhc2VNb2R1bGUpKSk7XG5cbiAgICAgICAgYmVmb3JlRWFjaChhbmd1bGFyLm1vY2subW9kdWxlKCgkcHJvdmlkZTogYW5ndWxhci5hdXRvLklQcm92aWRlU2VydmljZSkgPT4ge1xuICAgICAgICAgICAgLy8gRXhwbGljaXRseSBzZXQgcm9vdCBlbGVtZW50IGJlY2F1c2UgdGVzdHMgZG8gbm90IGdvIHRocm91Z2ggdXN1YWxcbiAgICAgICAgICAgIC8vIEFuZ3VsYXIgYm9vdHN0cmFwcGluZy5cbiAgICAgICAgICAgICRwcm92aWRlLnZhbHVlKCckcm9vdEVsZW1lbnQnLCBhbmd1bGFyLmVsZW1lbnQoZG9jdW1lbnQuYm9keSkpO1xuXG4gICAgICAgICAgICAvLyBSZXBsYWNlIHVzdWFsIEFQSSBzZXJ2aWNlIHdpdGggbW9jayBBUEkuXG4gICAgICAgICAgICAkcHJvdmlkZS5zZXJ2aWNlKCdhcGknLCBuZ0NvbXBvc2UoW2FwaUNsYXNzLCBNb2NrQXBpU2VydmljZV0pKTtcbiAgICAgICAgfSkpO1xuICAgICAgICBiZWZvcmVFYWNoKGFuZ3VsYXIubW9jay5tb2R1bGUobW9kdWxlTmFtZSkpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIGFueSBzaGFyZWQgc3RvcmVzLlxuICAgICAgICBjb25zdCBbc2hhcmVkU3RvcmVzLCBhZGRpdGlvbmFsTW9kdWxlc10gPSBfLnBhcnRpdGlvbihtb2R1bGVzLCAobSkgPT4gISFtLnN0b3JlSWQpO1xuXG4gICAgICAgIG1vZHVsZS5jb25maWcoKHNoYXJlZFN0b3JlTWFuYWdlclByb3ZpZGVyOiBTaGFyZWRTdG9yZVByb3ZpZGVyKSA9PiB7XG4gICAgICAgICAgICBfLmVhY2goc2hhcmVkU3RvcmVzLCAoZGVzY3JpcHRvcjogU2hhcmVkU3RvcmVEZXNjcmlwdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuZmFjdG9yeSkge1xuICAgICAgICAgICAgICAgICAgICBzaGFyZWRTdG9yZU1hbmFnZXJQcm92aWRlci5yZWdpc3RlcihkZXNjcmlwdG9yLnN0b3JlSWQsIGRlc2NyaXB0b3IuZmFjdG9yeSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVkU3RvcmVNYW5hZ2VyUHJvdmlkZXIuY3JlYXRlKGRlc2NyaXB0b3Iuc3RvcmVJZCwgZGVzY3JpcHRvci5pbml0aWFsU3RhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBfLmVhY2goYWRkaXRpb25hbE1vZHVsZXMsIChhZGRpdGlvbmFsTW9kdWxlKSA9PiB7XG4gICAgICAgICAgICBiZWZvcmVFYWNoKGFuZ3VsYXIubW9jay5tb2R1bGUoYWRkaXRpb25hbE1vZHVsZSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBIGNvbnRhaW5lciBpbiBET00gd2hlcmUgd2UgY2FuIHRlbXBvcmFyaWx5IGFwcGVuZCBjb21wb25lbnQgZWxlbWVudHMuXG4gICAgICAgIGxldCBjb250YWluZXJFbGVtZW50OiBhbmd1bGFyLklBdWdtZW50ZWRKUXVlcnkgPSBudWxsO1xuXG4gICAgICAgIGZ1bmN0aW9uIHByb3ZpZGVSZWFsRE9NKCk6IHZvaWQge1xuICAgICAgICAgICAgcmVtb3ZlUmVhbERPTSgpO1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IGFuZ3VsYXIuZWxlbWVudChkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQgPSBhbmd1bGFyLmVsZW1lbnQoJzxkaXYgaWQ9XCJ0ZXN0LWNvbnRhaW5lci1lbGVtZW50XCI+PC9kaXY+Jyk7XG4gICAgICAgICAgICBib2R5LmFwcGVuZChjb250YWluZXJFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHJlbW92ZVJlYWxET00oKTogdm9pZCB7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGphc21pbmUuYWRkTWF0Y2hlcnMobmdFcXVhbE1hdGNoZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBiZWZvcmVFYWNoKGFuZ3VsYXIubW9jay5pbmplY3QoKF8kY29tcGlsZV8sIF8kcm9vdFNjb3BlXywgX2FwaV8pID0+IHtcbiAgICAgICAgICAgICRjb21waWxlID0gXyRjb21waWxlXztcbiAgICAgICAgICAgICRzY29wZSA9IF8kcm9vdFNjb3BlXy4kbmV3KCk7XG4gICAgICAgICAgICBtb2NrQXBpID0gX2FwaV87XG5cbiAgICAgICAgICAgIGlmIChfLmNvbnRhaW5zKHRlc3RzLnRvU3RyaW5nKCksICdkZWJ1Z2dlcicpIHx8IF8uY29udGFpbnModGVzdHMudG9TdHJpbmcoKSwgJyBmaXQoJykpIHtcbiAgICAgICAgICAgICAgICBwcm92aWRlUmVhbERPTSgpO1xuICAgICAgICAgICAgICAgIG1vY2tBcGkubG9nVW5oYW5kbGVkUmVxdWVzdHModHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgJHNjb3BlLiRkZXN0cm95KCk7XG4gICAgICAgICAgICByZW1vdmVSZWFsRE9NKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRlc3RzKHtcbiAgICAgICAgICAgIG1vZHVsZTogbW9kdWxlLFxuXG4gICAgICAgICAgICBjcmVhdGVDb21wb25lbnQ6IGZ1bmN0aW9uPFQ+KHRlbXBsYXRlOiBzdHJpbmcpOiBDb21wb25lbnREZXNjcmlwdG9yPFQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBnZXRDb21wb25lbnQ8VD4oJGNvbXBpbGUsICRzY29wZSwgdGVtcGxhdGUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kIGNvbXBvbmVudCBlbGVtZW50IHRvIGFjdHVhbCBET00uIE90aGVyd2lzZSwgY29tcHV0YXRpb25zIGxpa2UgaGVpZ2h0IHdpbGwgbm90IHdvcmsuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kKGNvbXBvbmVudC5lbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLiRkaWdlc3QoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZGlnZXN0OiBmdW5jdGlvbigpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICAkc2NvcGUuJGRpZ2VzdCgpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXBpOiBmdW5jdGlvbigpOiBSZXNvbHdlQXBpICYgTW9ja0Jhc2UgJiBNb2NrQXBpU2VydmljZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vY2tBcGk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzY29wZTogZnVuY3Rpb24oKTogYW5ndWxhci5JU2NvcGUge1xuICAgICAgICAgICAgICAgIHJldHVybiAkc2NvcGU7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBwcm92aWRlUmVhbERPTTogcHJvdmlkZVJlYWxET00sXG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuIl19
;