|
"contents": "Searching 220 files for \"dataSourcesService\"\n\n/Users/nross/Work/javascript/totem/client/dist/scripts/totem.min.js:\n 5074 ])\n 5075 .service('rsDataAdapter', __webpack_require__(116))\n 5076: .service('dataSourcesService', __webpack_require__(107))\n 5077 .service('dvConfigService', __webpack_require__(108))\n 5078 .constant('aestheticDefaults', __webpack_require__(109))\n ....\n 6612 'use strict';\n 6613 \n 6614: module.exports = function($scope, $q, dataSourcesService) {\n 6615 var ignorablePromise;\n 6616 \n ....\n 6619 $scope.variables = [];\n 6620 \n 6621: dataSourcesService.getDataSources().then(function(dataSources) {\n 6622 $scope.dataSources = dataSources;\n 6623 \n 6624 if ($scope.dataSources && $scope.dataSources.length) {\n 6625: dataSourcesService.currentDataSource = $scope.dataSources[0];\n 6626 }\n 6627 });\n 6628 \n 6629 $scope.dataSourceChange = function() {\n 6630: dataSourcesService.currentDataSource = $scope.selectedDataSource;\n 6631 };\n 6632 \n 6633 $scope.$watch(function() {\n 6634: return dataSourcesService.currentDataSource;\n 6635 }, function(currentDataSource) {\n 6636 if (currentDataSource) {\n ....\n 6639 ignorablePromise.ignore();\n 6640 }\n 6641: ignorablePromise = dataSourcesService.getDimensionsByDataSource(currentDataSource.resourceUrn);\n 6642 ignorablePromise = $q.when(ignorablePromise).ignorify();\n 6643 ignorablePromise.then(function(dataSource) {\n ....\n 7008 };\n 7009 \n 7010: module.exports = function($scope, $q, dataSourcesService, aestheticDefaults, dvConfigService, rsDataAdapter) {\n 7011 $scope.dimensionsByAesthetic = {};\n 7012 $scope.instrument.config = $scope.instrument.config || dvConfigService.createConfig();\n ....\n 7015 if ($scope.instrument.config) {\n 7016 // Wrap the result in a promise if it didn't return one.\n 7017: $q.when(rsDataAdapter.readQuery($scope.instrument.config.source, dataSourcesService))\n 7018 .then(function(dimensionByRefId) {\n 7019 dimensionByRefId = dimensionByRefId || {};\n 7020: var aestheticMappings = getAestheticMappings($scope.instrument.config, dimensionByRefId, dataSourcesService.assignDimensionUrn);\n 7021 $scope.dimensionsByAesthetic = aestheticMappings.dimensionsByAesthetic;\n 7022 $scope.constantByAesthetic = aestheticMappings.constantByAesthetic;\n ....\n 7262 * metadata from Reporting Services. This metadata will be used to add information to the raw dimension\n 7263 * object in the query that doesn't have sufficient metadata.\n 7264: * @param {DataSourcesService} dataSourcesService A service to pull the proper dimension metadata\n 7265 * @param {Object} query The raw Reporting Services query\n 7266 * @return {Promise} Asynchronous promise\n 7267 */\n 7268: var getDimensionMetadataFromConfig = function(dataSourcesService, query) {\n 7269 var uniqueDataStores = [];\n 7270 query.filters.forEach(function(filter) {\n ....\n 7278 if (uniqueDataStores.length) {\n 7279 var defaultDataSource = uniqueDataStores[0];\n 7280: dataSourcesService.getDataSources()\n 7281 .then(function(dataSources) {\n 7282 for (var i = 0; i < dataSources.length; i++) {\n 7283 var dataSource = dataSources[i];\n 7284 if (defaultDataSource === dataSource.resourceUrn) {\n 7285: dataSourcesService.currentDataSource = dataSource;\n 7286 }\n 7287 }\n ....\n 7289 }\n 7290 \n 7291: return dataSourcesService.getDimensionsByDataSources(uniqueDataStores);\n 7292 };\n 7293 \n ....\n 7368 };\n 7369 \n 7370: module.exports = function(source, dataSourcesService) {\n 7371 var query = getQueryFromSource(source);\n 7372 if (query) {\n 7373: return getDimensionMetadataFromConfig(dataSourcesService, query)\n 7374 .then(function(dimensionsByDataStore) {\n 7375: return getRefIdDimensionMap(query, dimensionsByDataStore, dataSourcesService.assignDimensionUrn);\n 7376 });\n 7377 }\n\n/Users/nross/Work/javascript/totem/client/dist/scripts/totem.min.js.map:\n 1: {\"version\":3,\"sources\":[\"webpack:///webpack/bootstrap 6c4786d82bd4d974f2e9\",\"webpack:///./client/scripts/main.js\",\"webpack:///./client/instruments ^\\\\.\\\\/.*(\\\\/editor\\\\/editor|\\\\/renderer\\\\/renderer)$\",\"webpack:///./client/scripts/manage/controllers/manage-ctrl.js\",\"webpack:///./client/scripts/ad-hoc/controllers/ad-hoc-manage-ctrl.js\",\"webpack:///./client/scripts/ad-hoc/controllers/collection-ctrl.js\",\"webpack:///./client/scripts/ad-hoc/controllers/validate-upload-ctrl.js\",\"webpack:///./client/scripts/dashboard/controllers/dashboard-ctrl.js\",\"webpack:///./client/scripts/instrument/controllers/instrument-ctrl.js\",\"webpack:///./client/scripts/common/filters/i18n.js\",\"webpack:///./client/scripts/common/services/post-message.js\",\"webpack:///./client/scripts/common/services/q-all-settled.js\",\"webpack:///./client/scripts/common/services/q-ignorify.js\",\"webpack:///./client/scripts/common/services/exception-handler.js\",\"webpack:///./client/scripts/common/services/sso.js\",\"webpack:///./client/scripts/common/directives/app.js\",\"webpack:///./client/scripts/common/services/dashboard-service.js\",\"webpack:///./client/scripts/common/services/tag-service.js\",\"webpack:///./client/scripts/common/services/tag-enum.js\",\"webpack:///./client/scripts/common/directives/selection-table.js\",\"webpack:///./client/scripts/common/directives/sort-header.js\",\"webpack:///./client/scripts/common/services/ad-hoc-service.js\",\"webpack:///./client/scripts/common/directives/name-editor.js\",\"webpack:///./client/scripts/common/services/dashboard-workspace.js\",\"webpack:///./client/scripts/common/directives/alert.js\",\"webpack:///./client/scripts/common/directives/modal-progress-indicator.js\",\"webpack:///./client/scripts/manage/directives/manage-toolbar.js\",\"webpack:///./client/scripts/manage/directives/dashboard-search.js\",\"webpack:///./client/scripts/manage/views/manage.tpl.html\",\"webpack:///./client/scripts/ad-hoc/views/ad-hoc.tpl.html\",\"webpack:///./client/scripts/ad-hoc/views/collection.tpl.html\",\"webpack:///./client/scripts/ad-hoc/views/validate-upload.tpl.html\",\"webpack:///./client/scripts/dashboard/views/dashboard.tpl.html\",\"webpack:///./client/scripts/instrument/views/instrument.tpl.html\",\"webpack:///./client/scripts/instrument/views/render-instrument.tpl.html\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-manage-toolbar.js\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-search.js\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-capacity.js\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-data-upload.js\",\"webpack:///./client/scripts/dashboard/directives/dashboard-canvas.js\",\"webpack:///./client/scripts/dashboard/directives/dashboard-rail.js\",\"webpack:///./client/scripts/dashboard/directives/responsive-evaluator.js\",\"webpack:///./client/scripts/dashboard/directives/dashboard-instrument-chrome.js\",\"webpack:///./client/scripts/dashboard/directives/media-definition-track.js\",\"webpack:///./client/scripts/dashboard/directives/media-definition-menu.js\",\"webpack:///./client/scripts/dashboard/directives/ruler.js\",\"webpack:///./client/scripts/instrument/directives/instrument.js\",\"webpack:///./client/scripts/instrument/directives/new-instrument-configuration.js\",\"webpack:///./client/scripts/instrument/directives/instrument-editor-bootstrap.js\",\"webpack:///./client/scripts/dashboard/services/event-bus.js\",\"webpack:///./client/scripts/instrument/services/instrument-event-bus.js\",\"webpack:///./client/scripts/common/directives/app.tpl.html\",\"webpack:///./client/scripts/common/services/uuid.js\",\"webpack:///./client/scripts/common/services/dashboard-mixin.js\",\"webpack:///./client/scripts/common/services/sequence.js\",\"webpack:///./client/scripts/common/services/participable-mixin.js\",\"webpack:///./client/instruments ^\\\\.\\\\/.*\\\\/renderer\\\\/renderer$\",\"webpack:///./client/instruments ^\\\\.\\\\/.*\\\\/editor\\\\/editor$\",\"webpack:///./client/scripts/common/directives/steal-focus.js\",\"webpack:///./client/scripts/common/directives/name-editor.tpl.html\",\"webpack:///./client/scripts/common/directives/alert.tpl.html\",\"webpack:///./client/scripts/common/directives/modal-progress-indicator.tpl.html\",\"webpack:///./client/scripts/common/directives/share.js\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-file-upload.js\",\"webpack:///./client/scripts/common/services/debounce.js\",\"webpack:///./client/scripts/common/directives/draggable.js\",\"webpack:///./client/scripts/common/directives/resizeable.js\",\"webpack:///./client/scripts/common/directives/tap.js\",\"webpack:///./client/scripts/dashboard/directives/media-definition-range.js\",\"webpack:///./client/scripts/dashboard/directives/media-definition-rename-popover.js\",\"webpack:///./client/scripts/dashboard/directives/media-definition-delete-popover.js\",\"webpack:///./client/scripts/manage/directives/dashboard-search.tpl.html\",\"webpack:///./client/scripts/manage/directives/manage-toolbar.tpl.html\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-search.tpl.html\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-capacity.tpl.html\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-manage-toolbar.tpl.html\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-data-upload.tpl.html\",\"webpack:///./client/scripts/dashboard/directives/dashboard-canvas.tpl.html\",\"webpack:///./client/scripts/dashboard/directives/dashboard-instrument-chrome.tpl.html\",\"webpack:///./client/scripts/dashboard/directives/dashboard-rail.tpl.html\",\"webpack:///./client/scripts/dashboard/directives/media-definition-track.tpl.html\",\"webpack:///./client/scripts/dashboard/directives/media-definition-menu.tpl.html\",\"webpack:///./client/scripts/instrument/directives/instrument.tpl.html\",\"webpack:///./client/scripts/instrument/directives/new-instrument-configuration.tpl.html\",\"webpack:///./common/dashboard-util.js\",\"webpack:///./client/instruments/demo-html/renderer/renderer.js\",\"webpack:///./client/instruments/dv/editor/editor.js\",\"webpack:///./client/instruments/dv/renderer/renderer.js\",\"webpack:///./client/instruments/key-metric/renderer/renderer.js\",\"webpack:///./client/instruments/starfield/renderer/renderer.js\",\"webpack:///./client/instruments/text/editor/editor.js\",\"webpack:///./client/instruments/text/renderer/renderer.js\",\"webpack:///./client/instruments/twitter-trends/renderer/renderer.js\",\"webpack:///./client/scripts/common/directives/invalid-share-action-alert.js\",\"webpack:///./client/scripts/common/directives/user-search.js\",\"webpack:///./client/scripts/common/directives/share.tpl.html\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-file-upload.tpl.html\",\"webpack:///./client/scripts/common/services/drag-resize-util.js\",\"webpack:///./client/scripts/common/services/auto-scroll.js\",\"webpack:///./client/scripts/dashboard/directives/media-definition-range.tpl.html\",\"webpack:///./client/scripts/dashboard/directives/media-definition-popover.js\",\"webpack:///./client/scripts/dashboard/directives/media-definition-rename-popover.tpl.html\",\"webpack:///./client/scripts/dashboard/directives/media-definition-delete-popover.tpl.html\",\"webpack:///./client/instruments/dv/editor/editor.html\",\"webpack:///./client/instruments/text/editor/editor.html\",\"webpack:///./client/instruments/text/editor/directives/quill.html\",\"webpack:///./client/instruments/text/editor/directives/quill-toolbar.html\",\"webpack:///./client/instruments/text/editor/directives/quill-editor.html\",\"webpack:///./client/instruments/dv/editor/services/data-sources-service.js\",\"webpack:///./client/instruments/dv/editor/services/dv-config-service.js\",\"webpack:///./client/instruments/dv/editor/services/aesthetic-defaults.js\",\"webpack:///./client/instruments/dv/editor/directives/y-aesthetic-configuration.js\",\"webpack:///./client/instruments/dv/editor/directives/variable-configuration.js\",\"webpack:///./client/instruments/dv/editor/directives/dimension-pod.js\",\"webpack:///./client/instruments/dv/editor/controllers/data-panel-ctrl.js\",\"webpack:///./client/instruments/dv/editor/controllers/line-ctrl.js\",\"webpack:///./client/instruments/dv/enum/melt-column.js\",\"webpack:///./client/instruments/dv/editor/adapters/rs/adapter.js\",\"webpack:///./client/scripts/common/directives/invalid-share-action-alert.tpl.html\",\"webpack:///./client/scripts/common/services/user-service.js\",\"webpack:///./client/scripts/common/directives/user-search.tpl.html\",\"webpack:///./client/scripts/dashboard/directives/media-definition-popover.tpl.html\",\"webpack:///./client/instruments/dv/enum/dimension-type.js\",\"webpack:///./client/instruments/dv/editor/directives/y-aesthetic-configuration.tpl.html\",\"webpack:///./client/instruments/dv/editor/directives/variable-configuration.tpl.html\",\"webpack:///./client/instruments/dv/editor/directives/dimension-pod.tpl.html\",\"webpack:///./client/instruments/dv/enum/filter-type.js\",\"webpack:///./client/instruments/dv/editor/adapters/rs/query-reader.js\",\"webpack:///./client/instruments/dv/editor/adapters/rs/query-writer.js\",\"webpack:///./client/instruments/dv/editor/adapters/rs/value-loader.js\"],\"names\":[],\"mappings\":\";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,wC;;;;;;;ACtCA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA0B,YAAY,aAAa,aAAa;AAChE;AACA;AACA,QAAO;AACP;AACA;AACA,QAAO;AACP;AACA,2BAA0B,YAAY,aAAa,aAAa;AAChE;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;;AAEP;;AAEA;AACA,eAAc;AACd,MAAK;AACL,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;;;;;;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAiC,uDAAuD;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrBA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,yCAAwC,gEAAgE;AACxG;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP,gBAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;;;;;;AChFH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;;;;;;AC1CH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAgC,2EAA2E;AAC3G;AACA,UAAS;AACT;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAA+B,wCAAwC;AACvE;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,IAAG;;;;;;;ACjFH;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO,qDAAqD;AAC5D,QAAO,qDAAqD;AAC5D,QAAO,wDAAwD;AAC/D,QAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAoB,qBAAqB;AACzC;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,mBAAkB,8BAA8B;AAChD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAkB,4BAA4B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX,UAAS;AACT,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAgB;AAChB;AACA;AACA;AACA;AACA,mBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;AACA,IAAG;;;;;;;ACrHH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;AACL;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACrHH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,sCAAqC,uCAAuC;AAC5E;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,IAAG;;;;;;;AC9DH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,qDAAoD;AACpD;AACA,6DAA4D;AAC5D;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACjBH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;AC/DH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAoB;AACpB,YAAW;AACX,qBAAoB;AACpB,YAAW;AACX,UAAS;AACT;AACA;AACA,MAAK;AACL,IAAG;;;;;;;ACtBH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,MAAK;AACL,IAAG;;;;;;;ACpEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,IAAG;;;;;;;;ACzBH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;AC5BD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACXH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA,sBAAqB,uBAAuB;AAC5C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA,UAAS;;AAET;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT,QAAO;;AAEP;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT,QAAO;;AAEP;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACrSH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,YAAW;AACX;AACA;AACA,YAAW;AACX;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX,UAAS;AACT;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;AC7FH;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACJH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACxDH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;AC9BH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAuB,wBAAwB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB;AACnB;AACA,kBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACraH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACbH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,wBAAuB,iCAAiC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA,iBAAgB,0BAA0B,EAAE;AAC5C,iBAAgB,qBAAqB,EAAE;AACvC,iBAAgB,gCAAgC;AAChD;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;;AAGH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,EAAC;;;;;;;AC5GD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,YAAW;AACX,UAAS;AACT;AACA;AACA,IAAG;;;;;;;AC1BH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACzBH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,cAAa;AACb,YAAW;AACX;;AAEA;AACA;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;AACb,YAAW;;AAEX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,cAAa;AACb,YAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAAyB,qCAAqC;AAC9D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,0BAAyB,qCAAqC;AAC9D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAAyB,qCAAqC;AAC9D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAAyB,qCAAqC;AAC9D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA,IAAG;;;;;;;ACpNH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACjBH,2/BAA0/B,iBAAiB,yUAAyU,mBAAmB,wVAAwV,oBAAoB,wUAAwU,kBAAkB,wQAAwQ,sBAAsB,kLAAkL,oBAAoB,+0BAA+0B,6IAA6I,uIAAuI,2BAA2B,MAAM,kBAAkB,2EAA2E,6CAA6C,mKAAmK,0CAA0C,qKAAqK,oBAAoB,wPAAwP,2CAA2C,uD;;;;;;ACAx8I,85BAA65B,iBAAiB,6RAA6R,sBAAsB,yPAAyP,uBAAuB,mRAAmR,oBAAoB,kUAAkU,qBAAqB,ysBAAysB,2BAA2B,MAAM,mBAAmB,UAAU,wBAAwB,kKAAkK,iBAAiB,sEAAsE,cAAc,sEAAsE,gCAAgC,qHAAqH,qBAAqB,gBAAgB,oBAAoB,sF;;;;;;ACAz6G,qHAAoH,8BAA8B,gLAAgL,mBAAmB,uNAAuN,iBAAiB,+8CAA+8C,iBAAiB,0OAA0O,wBAAwB,uWAAuW,uBAAuB,6RAA6R,0BAA0B,gRAAgR,qBAAqB,4HAA4H,yBAAyB,uHAAuH,oBAAoB,8HAA8H,uBAAuB,wHAAwH,qBAAqB,oUAAoU,oBAAoB,uOAAuO,gCAAgC,0SAA0S,qBAAqB,gBAAgB,oBAAoB,8PAA8P,mFAAmF,yQAAyQ,iDAAiD,qGAAqG,8BAA8B,qGAAqG,4BAA4B,6gB;;;;;;ACA5oL,kMAAiM,iCAAiC,qLAAqL,mBAAmB,iKAAiK,iBAAiB,kWAAkW,sBAAsB,gOAAgO,+BAA+B,mFAAmF,+BAA+B,+MAA+M,uBAAuB,kmBAAkmB,wCAAwC,oiBAAoiB,qCAAqC,sEAAsE,SAAS,2UAA2U,2BAA2B,qE;;;;;;ACAnrG,mbAAkb,mBAAmB,mIAAmI,iBAAiB,oYAAoY,+BAA+B,6JAA6J,2BAA2B,wIAAwI,iBAAiB,wJAAwJ,eAAe,+JAA+J,qBAAqB,4JAA4J,eAAe,2eAA2e,0BAA0B,sDAAsD,0FAA0F,0hB;;;;;;ACAx+E,yRAAwR,mBAAmB,wHAAwH,iBAAiB,uH;;;;;;ACApb,sQ;;;;;;ACAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA,YAAW;;AAEX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb,YAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,6BAA4B,sCAAsC;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAAyB,sCAAsC;AAC/D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mCAAkC,kBAAkB;AACpD;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;AC1GH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACjBH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,8BAA6B,eAAe;AAC5C;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;;AAEA;AACA,uDAAsD;AACtD;AACA,qDAAoD;AACpD;AACA,6B;AACA,uDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACpCH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;ACdD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,gBAAe;;AAEf,qDAAoD;AACpD,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA,uBAAsB,8CAA8C,EAAE;AACtE,uBAAsB,+CAA+C;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf,cAAa;;AAEb;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA2B,yBAAyB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA,gBAAe;AACf;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA,IAAG;;;;;;;AC1OH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;AClBH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,YAAW;AACX,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA,UAAS;;AAET;AACA;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACtFH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACpCH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAyB,mBAAmB;AAC5C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,0CAAyC;AACzC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0CAAyC;AACzC,0CAAyC;AACzC,0CAAyC;;AAEzC;AACA;AACA;AACA,8BAA6B;;AAE7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,cAAa;AACb,YAAW;AACX;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;AC1MH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACnEH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,wBAAuB,eAAe;AACtC;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,IAAG;;;;;;;AChCH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA,cAAa;;AAEb;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;AChGH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb,YAAW;AACX;AACA;AACA;AACA,IAAG;;;;;;;AC5CH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;;;;;;ACnDH;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;AChBH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,gBAAe,OAAO;AACtB,gBAAe,OAAO;AACtB,gBAAe,cAAc;AAC7B;AACA,gBAAe,cAAc;AAC7B;AACA,gBAAe,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAAyB,0BAA0B;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA,gBAAe,OAAO;AACtB,gBAAe,OAAO;AACtB,gBAAe,SAAS;AACxB;AACA,gBAAe,cAAc;AAC7B;AACA,gBAAe,cAAc;AAC7B;AACA,gBAAe,OAAO;AACtB;AACA,kBAAiB,SAAS;AAC1B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe,cAAc;AAC7B,mBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;;AAEA;AACA,IAAG;AACH;;;;;;;AClHA,sI;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;;;;;;ACTH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,0BAAyB,sBAAsB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAO;AACP;AACA;AACA;AACA,UAAS;AACT,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,oBAAmB;AACnB;AACA;AACA,iEAAgE,gCAAgC,EAAE;AAClG,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,0BAAyB,yBAAyB;AAClD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT,QAAO;AACP;AACA;;AAEA;;AAEA,wBAAuB,yBAAyB;AAChD;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA,YAAW;AACX;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;;AAET;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;;AAEA;AACA,6CAA4C;AAC5C;AACA;;AAEA;AACA;;AAEA;AACA,QAAO;;AAEP;AACA;AACA,kBAAiB,OAAO;AACxB;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA,QAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB,MAAM;AACvB;AACA;AACA,kBAAiB,MAAM;AACvB,kBAAiB,OAAO;AACxB;AACA;AACA,kBAAiB,OAAO;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT,QAAO;;AAEP;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;;;;;;;AChSH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;;;;;;AChBH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,wBAAuB,8BAA8B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,QAAO;AACP;AACA;AACA,wBAAuB,8BAA8B;AACrD;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,wBAAuB,8BAA8B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,UAAS;AACT,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,IAAG;;;;;;;ACtEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAiC,uDAAuD;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAiC,uDAAuD;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACfA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACvBH,gLAA+K,QAAQ,+S;;;;;;ACAvL,sEAAqE,0GAA0G,qVAAqV,QAAQ,kDAAkD,WAAW,iB;;;;;;ACAzkB,2EAA0E,sBAAsB,uF;;;;;;ACAhG;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB,gBAAe;AACf,cAAa;AACb,YAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB,gBAAe;AACf,cAAa;AACb,YAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,+BAA8B,mCAAmC;AACjE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;;;;;;ACrIH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf,cAAa;AACb;AACA;AACA;AACA;AACA,gBAAe;AACf,cAAa;AACb;AACA,cAAa;AACb;AACA,cAAa;AACb,UAAS;AACT;AACA;AACA,IAAG;;;;;;;AC/DH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,EAAC;;;;;;;ACrBD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,+BAA8B,yBAAyB;AACvD;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA,0CAAyC,yBAAyB;AAClE;;AAEA;AACA;AACA,kCAAiC,WAAW;AAC5C;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAiC,uBAAuB;AACxD;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf,cAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf,cAAa;AACb,YAAW;AACX,UAAS;AACT;AACA;AACA,IAAG;;;;;;;AC7JH;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iCAAgC,wCAAwC;AACxE;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb,YAAW;AACX;AACA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA,4CAA2C,wCAAwC;AACnF;;AAEA;AACA;AACA,oCAAmC,wCAAwC;AAC3E;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;;AAEA;AACA;AACA;AACA,oCAAmC,uBAAuB;AAC1D;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf,cAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf,cAAa;AACb,YAAW;AACX,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACnJH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;AACA,cAAa;AACb;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACrBH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,IAAG;;;;;;;ACbH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,0BAAyB;;AAEzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,kCAAiC;AACjC;AACA,cAAa;AACb;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;AC3DH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACrCH,y/D;;;;;;ACAA,4iBAA2iB,mBAAmB,8jBAA8jB,kBAAkB,mTAAmT,iBAAiB,wTAAwT,sBAAsB,opCAAopC,2BAA2B,iTAAiT,iBAAiB,0VAA0V,mBAAmB,6OAA6O,gCAAgC,2BAA2B,sCAAsC,8UAA8U,mBAAmB,oVAAoV,iCAAiC,oJAAoJ,kCAAkC,6HAA6H,iCAAiC,2BAA2B,0BAA0B,8UAA8U,mBAAmB,oVAAoV,kCAAkC,2KAA2K,mCAAmC,gD;;;;;;ACAh9L,s+D;;;;;;ACAA,2FAA0F,8BAA8B,+IAA+I,gCAAgC,wGAAwG,uCAAuC,8B;;;;;;ACAtb,6iBAA4iB,mBAAmB,gSAAgS,gBAAgB,oTAAoT,iBAAiB,4VAA4V,mBAAmB,4TAA4T,kBAAkB,+OAA+O,yBAAyB,2BAA2B,+BAA+B,8UAA8U,mBAAmB,oVAAoV,mCAAmC,4KAA4K,oCAAoC,gD;;;;;;ACA3lG,oSAAmS,kCAAkC,4JAA4J,0CAA0C,+CAA+C,wCAAwC,+CAA+C,uCAAuC,+CAA+C,2CAA2C,+CAA+C,yCAAyC,6L;;;;;;ACA12B,oEAAmE,4CAA4C,w+BAAw+B,+BAA+B,uB;;;;;;ACAtnC,4HAA2H,2DAA2D,8BAA8B,oBAAoB,wyC;;;;;;ACAxO,oUAAmU,2BAA2B,yBAAyB,4CAA4C,KAAK,kBAAkB,wC;;;;;;ACA1b,k0CAAi0C,oS;;;;;;ACAj0C,2GAA0G,oCAAoC,+CAA+C,GAAG,qjBAAqjB,wBAAwB,qMAAqM,+BAA+B,2BAA2B,GAAG,ygBAAygB,iCAAiC,2BAA2B,GAAG,q5BAAq5B,+BAA+B,2C;;;;;;ACA3gF,kRAAiR,wEAAwE,wFAAwF,8BAA8B,iB;;;;;;ACA/c,8RAA6R,qKAAqK,8D;;;;;;ACAlc;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,KAAI;AACJ,IAAG;AACH;AACA,G;;;;;;AChCA;;AAEA;AACA;AACA;AACA;;;;;;;ACLA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;ACtBA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,0BAAyB,kBAAkB;AAC3C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA2B;AAC3B;AACA;AACA;AACA,YAAW;AACX;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;;AAEb;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;;;;;;AC/QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACZA;AACA;AACA;AACA;AACA;;;;;;;ACJA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA,yBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAoC,mBAAmB;AACvD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAoC,mBAAmB;AACvD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB;AACnB,mCAAkC,uCAAuC;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;;;;;;;ACrSA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAsC,qBAAqB;AAC3D;AACA,sDAAqD,YAAY,kBAAkB,YAAY;AAC/F;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;;;;;;ACnCA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA,cAAa;;AAEb;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACpCH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wBAAuB,qBAAqB;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,kBAAiB;AACjB;AACA,kBAAiB;AACjB,gBAAe;AACf;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA,4BAA2B,kBAAkB;AAC7C;AACA;AACA,mCAAkC,WAAW;AAC7C;AACA;;AAEA,4BAA2B,mBAAmB;AAC9C;AACA;AACA,oCAAmC,aAAa;AAChD;AACA;;AAEA;AACA,YAAW;AACX,UAAS;AACT;AACA;AACA,IAAG;;;;;;;AC5GH,qEAAoE,qBAAqB,yhDAAyhD,8BAA8B,wPAAwP,qCAAqC,sHAAsH,kCAAkC,sQAAsQ,uBAAuB,2UAA2U,qCAAqC,41BAA41B,mBAAmB,+dAA+d,mBAAmB,mIAAmI,iBAAiB,gD;;;;;;ACAvsI,gSAA+R,uBAAuB,0DAA0D,kBAAkB,kB;;;;;;ACAlY;AACA;AACA;;AAEA;AACA;AACA,gBAAe,MAAM;AACrB,kBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAe,MAAM;AACrB,kBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAe,MAAM;AACrB,gBAAe,OAAO;AACtB,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAe,MAAM;AACrB,gBAAe,OAAO;AACtB,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;AC7DH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe,OAAO;AACtB;AACA,gBAAe,OAAO;AACtB,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA,gBAAe,mBAAmB;AAClC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAe,MAAM;AACrB;AACA;AACA;AACA;;AAEA;AACA,IAAG;;;;;;;AC3GH,yEAAwE,iDAAiD,wDAAwD,QAAQ,iF;;;;;;ACAzL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA,8CAA6C;AAC7C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA,kBAAiB;AACjB;;AAEA;AACA;AACA,cAAa;AACb,YAAW;AACX;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;AChEH,oUAAmU,yBAAyB,kTAAkT,mBAAmB,kIAAkI,kBAAkB,gE;;;;;;ACArzB,6SAA4S,wBAAwB,wLAAwL,mBAAmB,kIAAkI,mBAAmB,gE;;;;;;ACApqB,mmCAAkmC,eAAe,2cAA2c,iBAAiB,+3K;;;;;;ACA7kD,4G;;;;;;ACAA,uG;;;;;;ACAA,m8G;;;;;;ACAA,iC;;;;;;ACAA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA,YAAW;AACX,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,0DAAyD;AACzD;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,MAAK;;AAEL;AACA;AACA;AACA,iBAAgB,MAAM;AACtB,iBAAgB,0BAA0B,mBAAmB,EAAE;AAC/D;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;AACP,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT,MAAK;;AAEL;;AAEA;AACA;;AAEA;;;;;;;ACxHA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB,OAAO;AACvB;AACA;AACA;AACA,mBAAkB;AAClB,2BAA0B;AAC1B;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC/BA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;AChBD;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;;;;;;;ACZA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;;AAEA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;;;;;;;ACnIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;;;;;;ACbA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;;;;;;AC1CA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT,kCAAiC;AACjC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAmB,wBAAwB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA,oBAAmB;AACnB,qBAAoB;AACpB,kBAAiB;AACjB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,8BAA6B,kBAAkB;AAC/C;;AAEA,iCAAgC;AAChC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,wCAAwC;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB,uBAAuB;AAC9C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA0B;AAC1B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,cAAa;AACb;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;AAEA,8DAA6D;;AAE7D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;AACH;;;;;;;;;ACzcA;AACA;AACA;AACA,EAAC;;AAED;;;;;;;ACLA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACRA,+YAA8Y,WAAW,kB;;;;;;ACAzZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA,IAAG;;;;;;;AC1BH,wZAAuZ,kCAAkC,kG;;;;;;ACAzb,sF;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;;;;;;;ACPA,odAAmd,mBAAmB,+gB;;;;;;ACAte,qEAAoE,iBAAiB,q/BAAq/B,8fAA8f,eAAe,oGAAoG,iOAAiO,kGAAkG,2GAA2G,qBAAqB,SAAS,mGAAmG,oIAAoI,eAAe,oFAAoF,uDAAuD,kEAAkE,kDAAkD,uBAAuB,UAAU,aAAa,cAAc,eAAe,6CAA6C,yDAAyD,uBAAuB,aAAa,wBAAwB,qBAAqB,SAAS,8rBAA8rB,kDAAkD,uBAAuB,UAAU,6BAA6B,aAAa,cAAc,eAAe,qCAAqC,yDAAyD,uBAAuB,aAAa,wBAAwB,yHAAyH,QAAQ,qmBAAqmB,mBAAmB,6gB;;;;;;ACAlnJ,oQAAmQ,oLAAoL,uEAAuE,kBAAkB,6JAA6J,qBAAqB,gPAAgP,0CAA0C,yCAAyC,2BAA2B,MAAM,iBAAiB,e;;;;;;ACAvjC;AACA;AACA;AACA,EAAC;;AAED;;;;;;;ACLA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAY,mBAAmB;AAC/B,aAAY,OAAO;AACnB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,wBAAuB,wBAAwB;AAC/C;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA,aAAY,MAAM;AAClB,aAAY,OAAO;AACnB,aAAY,eAAe;AAC3B,aAAY,OAAO;AACnB;AACA;AACA;AACA,kBAAiB,6BAA6B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;;;;;;;;AClIA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb,YAAW;AACX;AACA;AACA;AACA,0BAAyB,oBAAoB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf,cAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;AC7FA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,+BAA8B,wBAAwB;AACtD;AACA;;AAEA;AACA,MAAK;;AAEL;AACA;AACA\",\"sourcesContent\":[\" \\t// The module cache\\n \\tvar installedModules = {};\\n\\n \\t// The require function\\n \\tfunction __webpack_require__(moduleId) {\\n\\n \\t\\t// Check if module is in cache\\n \\t\\tif(installedModules[moduleId])\\n \\t\\t\\treturn installedModules[moduleId].exports;\\n\\n \\t\\t// Create a new module (and put it into the cache)\\n \\t\\tvar module = installedModules[moduleId] = {\\n \\t\\t\\texports: {},\\n \\t\\t\\tid: moduleId,\\n \\t\\t\\tloaded: false\\n \\t\\t};\\n\\n \\t\\t// Execute the module function\\n \\t\\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\\n\\n \\t\\t// Flag the module as loaded\\n \\t\\tmodule.loaded = true;\\n\\n \\t\\t// Return the exports of the module\\n \\t\\treturn module.exports;\\n \\t}\\n\\n\\n \\t// expose the modules object (__webpack_modules__)\\n \\t__webpack_require__.m = modules;\\n\\n \\t// expose the module cache\\n \\t__webpack_require__.c = installedModules;\\n\\n \\t// __webpack_public_path__\\n \\t__webpack_require__.p = \\\"\\\";\\n\\n \\t// Load entry module and return exports\\n \\treturn __webpack_require__(0);\\n\\n\\n/** WEBPACK FOOTER **\\n ** webpack/bootstrap 6c4786d82bd4d974f2e9\\n **/\",\"'use strict';\\n/* global window: true */\\n\\nangular\\n .module('totem', [\\n 'ui.router',\\n 'ngCoral',\\n require('./manage/controllers/manage-ctrl').name,\\n require('./ad-hoc/controllers/ad-hoc-manage-ctrl').name,\\n require('./ad-hoc/controllers/collection-ctrl').name,\\n require('./ad-hoc/controllers/validate-upload-ctrl').name,\\n require('./dashboard/controllers/dashboard-ctrl').name,\\n require('./instrument/controllers/instrument-ctrl').name,\\n require('./common/filters/i18n').name,\\n require('./common/services/post-message').name,\\n require('./common/directives/app').name,\\n require('./common/services/q-all-settled').name,\\n require('./common/services/q-ignorify').name,\\n require('./common/services/exception-handler').name,\\n require('./common/services/sso').name\\n ])\\n .constant('gridSpacing', window.Totem ? window.Totem.config.gridSpacing : null)\\n .constant('user', window.Totem ? window.Totem.config.user : null)\\n .constant('minMediaDefinitionWidth', window.Totem ? window.Totem.config.minMediaDefinitionWidth : null)\\n .constant('minInstrumentWidth', window.Totem ? window.Totem.config.minInstrumentWidth : null)\\n .constant('minInstrumentHeight', window.Totem ? window.Totem.config.minInstrumentHeight : null)\\n .constant('duplicateInstrumentOffset', window.Totem ? window.Totem.config.duplicateInstrumentOffset : null)\\n .constant('ims', window.Totem ? window.Totem.config.ims : null)\\n .constant('env', window.Totem ? window.Totem.config.env : null)\\n .constant('externalServices', window.Totem ? window.Totem.config.externalServices : null)\\n .config(function(i18nBundleProvider, $controllerProvider, $compileProvider, $provide, $stateProvider, $urlRouterProvider, $httpProvider) {\\n i18nBundleProvider.bundle = window.i18n[window.Totem.config.locale];\\n\\n $stateProvider\\n .state('instrument', {\\n abstract: 'true',\\n url: '/dashboard/{dashboardId}/instrument/{instrumentId}',\\n template: require('./instrument/views/instrument.tpl.html'),\\n controller: 'InstrumentCtrl'\\n })\\n .state('instrument.edit', {\\n url: '/edit'\\n })\\n .state('renderInstrument', {\\n url: '/dashboard/{dashboardId}/instrument/{instrumentId}/render',\\n template: require('./instrument/views/render-instrument.tpl.html'),\\n controller: 'InstrumentCtrl'\\n })\\n .state('manage', {\\n url: '/dashboard/manage',\\n template: require('./manage/views/manage.tpl.html'),\\n controller: 'ManageCtrl'\\n })\\n .state('dashboard', {\\n abstract: true,\\n template: require('./dashboard/views/dashboard.tpl.html'),\\n controller: 'DashboardCtrl',\\n url: '/dashboard'\\n })\\n .state('dashboard.view', {\\n // If this dashboard ID param were on the parent \\\"dashboard\\\" state, it would reload the controller\\n // whenever going from viewing one dashboard to viewing another dashboard.\\n url: '/:dashboardId'\\n })\\n .state('dashboard.edit', {\\n // If this dashboard ID param were on the parent \\\"dashboard\\\" state, it would reload the controller\\n // whenever going from viewing one dashboard to viewing another dashboard.\\n url: '/:dashboardId/edit'\\n })\\n .state('ad-hoc',{\\n url: '/ad-hoc',\\n template: require('./ad-hoc/views/ad-hoc.tpl.html'),\\n controller: 'AdHocManageCtrl'\\n })\\n .state('collection', {\\n url:'/ad-hoc/:collectionId',\\n template: require('./ad-hoc/views/collection.tpl.html'),\\n controller: 'CollectionCtrl'\\n })\\n .state('validate', {\\n url:'/ad-hoc/validate/:pastebinId?collectionId',\\n template: require('./ad-hoc/views/validate-upload.tpl.html'),\\n controller: 'ValidateUploadCtrl'\\n });\\n\\n $urlRouterProvider.otherwise('dashboard/manage');\\n\\n $httpProvider.interceptors.push(function($q, sso) {\\n return {'request': sso.requestInterceptor.bind(sso)};\\n });\\n })\\n .run(function(postMessageService) {\\n // start the postMessage listeners.\\n postMessageService.listen();\\n })\\n;\\n\\n// Initialize instrument renderer and editor code. This should be done before the application is initialized since\\n// some of these instruments create angular directives, services, etc.\\nvar instrumentRequireContext = require.context('../instruments/', true, /^\\\\.\\\\/.*(\\\\/editor\\\\/editor|\\\\/renderer\\\\/renderer)$/);\\ninstrumentRequireContext.keys().forEach(instrumentRequireContext);\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/main.js\\n ** module id = 0\\n ** module chunks = 0\\n **/\",\"var map = {\\n\\t\\\"./demo-html/renderer/renderer\\\": 84,\\n\\t\\\"./dv/editor/editor\\\": 85,\\n\\t\\\"./dv/renderer/renderer\\\": 86,\\n\\t\\\"./key-metric/renderer/renderer\\\": 87,\\n\\t\\\"./starfield/renderer/renderer\\\": 88,\\n\\t\\\"./text/editor/editor\\\": 89,\\n\\t\\\"./text/renderer/renderer\\\": 90,\\n\\t\\\"./twitter-trends/renderer/renderer\\\": 91\\n};\\nfunction webpackContext(req) {\\n\\treturn __webpack_require__(webpackContextResolve(req));\\n};\\nfunction webpackContextResolve(req) {\\n\\treturn map[req] || (function() { throw new Error(\\\"Cannot find module '\\\" + req + \\\"'.\\\") }());\\n};\\nwebpackContext.keys = function webpackContextKeys() {\\n\\treturn Object.keys(map);\\n};\\nwebpackContext.resolve = webpackContextResolve;\\nmodule.exports = webpackContext;\\nwebpackContext.id = 1;\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments ^\\\\.\\\\/.*(\\\\/editor\\\\/editor|\\\\/renderer\\\\/renderer)$\\n ** module id = 1\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.ManageCtrl', [\\n require('../../common/services/dashboard-service').name,\\n require('../../common/services/tag-service').name,\\n require('../../common/services/tag-enum').name,\\n require('../../common/directives/selection-table').name,\\n require('../../common/directives/sort-header').name,\\n require('../directives/manage-toolbar').name,\\n require('../directives/dashboard-search').name,\\n require('../../common/services/post-message').name\\n ])\\n .controller('ManageCtrl', function($scope, dashboardService, tagService, tagEnum, i18nFilter, postMessageService) {\\n var postTitle = function() {\\n postMessageService.post('external.pageTitle', i18nFilter('manageDashboards'));\\n };\\n\\n postTitle();\\n dashboardService.query().then(function(dashboards) {\\n $scope.dashboards = dashboards;\\n });\\n $scope.selectedDashboards = [];\\n $scope.sortPredicate = 'name';\\n $scope.sortReverse = false;\\n\\n $scope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {\\n // If we switch states within manage, make sure the page title remains.\\n if (fromState.name === 'manage' && toState.name !== 'manage') {\\n postTitle();\\n }\\n });\\n\\n $scope.getPluralizedOwners = function(owners) {\\n return i18nFilter('ownersValue', { OWNER: owners[0].entity.displayName, NUM_OWNERS: owners.length});\\n };\\n\\n $scope.getOwners = function(dashboard) {\\n return dashboard.getOwners();\\n };\\n\\n $scope.getFirstOwnerName = function(dashboard) {\\n var owners = dashboard.getOwners();\\n if (owners.length) {\\n return owners[0].entity.displayName;\\n }\\n return '';\\n };\\n\\n $scope.setSort = function(predicate) {\\n if ($scope.sortPredicate === predicate) {\\n $scope.sortReverse = !$scope.sortReverse;\\n } else {\\n $scope.sortReverse = false;\\n }\\n $scope.sortPredicate = predicate;\\n };\\n\\n $scope.isDashboardFavorited = function(dashboard) {\\n return dashboard.getFavoriteTag() != null;\\n };\\n\\n $scope.toggleFavorite = function(dashboard) {\\n var tag = dashboard.getFavoriteTag();\\n if (tag) {\\n dashboard.removeTag(tag);\\n tagService.destroy(tag);\\n } else {\\n tag = {dashboardId: dashboard._id, tag: tagEnum.FAVORITE};\\n dashboard.tags.push(tag);\\n tagService.save(tag);\\n }\\n };\\n\\n $scope.getSortDirection = function(predicate) {\\n if (predicate === $scope.sortPredicate) {\\n return $scope.sortReverse ? 'descending' : 'ascending';\\n }\\n\\n return null;\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/manage/controllers/manage-ctrl.js\\n ** module id = 2\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.AdHocManageCtrl', [\\n require('../../common/services/ad-hoc-service').name,\\n require('../../common/directives/selection-table').name,\\n require('../../common/directives/sort-header').name,\\n require('../directives/ad-hoc-manage-toolbar').name,\\n require('../directives/ad-hoc-search').name,\\n require('../directives/ad-hoc-capacity').name\\n ])\\n .controller('AdHocManageCtrl', function($scope, adHocService) {\\n adHocService.getAll().then(function(response) {\\n $scope.adHocCollections = response;\\n });\\n $scope.selectedAdHocCollections = [];\\n $scope.sortPredicate = 'name';\\n $scope.sortReverse = false;\\n\\n // This is really only used for sorting. Technically, straight up rowCount could be used instead, but if two\\n // different columns (records and capacity) used rowCount as their sort predicate, the sort direction icon on both\\n // columns would be active (showing) when the user sorted either of the rows. We don't want that so we have to\\n // distinguish...and why not distinguish by created a function that provides a true capacity number?\\n $scope.getCapacity = function(collection) {\\n return collection.rowCount / collection.maxRows;\\n };\\n\\n $scope.setSort = function(predicate) {\\n if ($scope.sortPredicate === predicate) {\\n $scope.sortReverse = !$scope.sortReverse;\\n } else {\\n $scope.sortReverse = false;\\n }\\n $scope.sortPredicate = predicate;\\n };\\n\\n $scope.getSortDirection = function(predicate) {\\n if (predicate === $scope.sortPredicate) {\\n return $scope.sortReverse ? 'descending' : 'ascending';\\n }\\n\\n return null;\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/controllers/ad-hoc-manage-ctrl.js\\n ** module id = 3\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.CollectionCtrl', [\\n require('../../common/services/ad-hoc-service').name,\\n require('../directives/ad-hoc-data-upload').name,\\n require('../directives/ad-hoc-capacity').name\\n ])\\n .controller('CollectionCtrl', function($scope, $stateParams, $state, adHocService, eventBus, i18nFilter) {\\n if ($stateParams.collectionId) {\\n adHocService.get($stateParams.collectionId).then(function(collection) {\\n $scope.collection = collection;\\n // make sure we set the current collection for state maintenance\\n adHocService.setCurrentCollection(collection);\\n });\\n } else {\\n if(!$scope.collection) {\\n $scope.collection = adHocService.getCurrentCollection();\\n }\\n }\\n\\n $scope.saveDisabled = false;\\n $scope.showDetails = false;\\n $scope.uploadFileName = null;\\n $scope.forceUploadVisibility = false;\\n\\n // saves collection meta-data\\n $scope.saveCollection = function() {\\n // save states\\n // 1) a file is uploaded and this is a new collection\\n // -> go to validate file and build directives for upload\\n // 2) a file is uploaded and this is an existing collection\\n // -> (validate) Use directives from existing collection\\n // 3) a file is not uploaded and this is an existing collection\\n // -> simply save the meta-data\\n // 4) if a file is not uploaded and this is not an existing collection then we are in a bad state and bail out\\n if(!$scope.collection) {\\n eventBus.publish('processFailed', i18nFilter('adhocCollectionSaveError'));\\n return;\\n }\\n if($scope.collection.id) {\\n if($scope.uploadFileName) {\\n $state.go('validate',{pastebinId:$scope.collection.pastebinId, collectionId:$scope.collection.id});\\n return;\\n } else {\\n adHocService.saveMetaData({\\n name:$scope.collection.name,\\n description:$scope.collection.description\\n },$stateParams.collectionId).then(function() {\\n adHocService.resetCurrentCollection();\\n $state.go('ad-hoc');\\n return;\\n });\\n }\\n } else {\\n if(!$scope.uploadFileName) {\\n eventBus.publish('processFailed', i18nFilter('adhocCollectionSaveError'));\\n adHocService.resetCurrentCollection();\\n $state.go('ad-hoc');\\n return;\\n }\\n if(!$scope.collection.pastebinId) {\\n eventBus.publish('processFailed', i18nFilter('adhocCollectionSaveError'));\\n return;\\n }\\n $state.go('validate', {pastebinId:$scope.collection.pastebinId});\\n return;\\n }\\n };\\n\\n $scope.cancelEditing = function() {\\n adHocService.resetCurrentCollection();\\n $state.go('ad-hoc');\\n };\\n\\n $scope.deleteUpload = function (collection, upload) {\\n adHocService.deleteUpload(collection, upload).then(function(result) {\\n // @todo: success message?\\n }, function(reason) {\\n console.log(reason);\\n });\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/controllers/collection-ctrl.js\\n ** module id = 4\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.ValidateUploadCtrl', [\\n require('../../common/services/ad-hoc-service').name\\n ])\\n .controller('ValidateUploadCtrl', function($scope, $stateParams, $state, adHocService, i18nFilter) {\\n $scope.columnOptions = new Array(\\n {label: i18nFilter('columnTypeText'), value:'string' },\\n {label: i18nFilter('columnTypeInteger'), value:'int' },\\n {label: i18nFilter('columnTypeDecimal'), value:'decimal'},\\n {label: i18nFilter('columnTypeDate'), value:'datetime'}\\n );\\n\\n $scope.selectedTypes = [];\\n $scope.saveDisabled = true;\\n $scope.schemaEditable = !$stateParams.collectionId;\\n\\n // if we don't have a pastebin ID go back to the upload screen, something wrong has happened\\n // we may have had a refresh, in which case we have lost context and need to go back to that\\n // screen anyways\\n var collection = adHocService.getCurrentCollection();\\n var pastebinId = $stateParams.pastebinId || collection.pastebinId;\\n if(!pastebinId) {\\n var params = {};\\n if($stateParams.collectionId) {\\n params.collectionId = $stateParams.collectionId;\\n }\\n $state.go('collection', params);\\n return;\\n }\\n\\n // do a test run on the pastebin data\\n adHocService.preRunFromPastebin(pastebinId, 20, $stateParams.collectionId).then( function(data) {\\n if(!data || data.status) {\\n $scope.uploadError = true;\\n if(data.status == 409) {\\n $scope.uploadErrorMessage = i18nFilter('fileUploadConflict');\\n } else {\\n $scope.uploadErrorMessage = i18nFilter('fileUploadFailure');\\n }\\n } else {\\n $scope.saveDisabled = false;\\n $scope.adHocSchema = data.schema;\\n $scope.adHocDirectives = data.directives;\\n $scope.adHocData = data.data;\\n\\n // I am unable to bind directly to my model for the select so I am creating a proxy\\n // the model will need to be updated from the proxy before uploading\\n for(var i=0;i<data.schema.length;i++) {\\n $scope.selectedTypes[i] = $scope.getSelectedType($scope.adHocSchema[i].type);\\n }\\n }\\n });\\n\\n $scope.getSelectedType = function(type) {\\n var option = $scope.columnOptions[0];\\n for(var i=0;i<$scope.columnOptions.length;i++) {\\n if($scope.columnOptions[i].value == type) {\\n option = $scope.columnOptions[i];\\n }\\n }\\n return option;\\n };\\n\\n $scope.cancelUpload = function() {\\n var params = {};\\n if($stateParams.collectionId) {\\n params.collectionId = $stateParams.collectionId;\\n }\\n $state.go('collection', params);\\n };\\n\\n $scope.saveCollection = function() {\\n // go through the selected types and update the actual model from our proxy object\\n for(var i=0;i<$scope.adHocSchema.length;i++) {\\n if($scope.selectedTypes[i] && $scope.selectedTypes[i].value) {\\n $scope.adHocSchema[i].type = $scope.selectedTypes[i].value;\\n }\\n }\\n var err = verifySchemaAndDirectives($scope.adHocDirectives, $scope.adHocSchema);\\n if(err == null) {\\n $scope.saveDisabled = true;\\n adHocService.createFromPastebin(pastebinId, $scope.adHocDirectives, $scope.adHocSchema, $stateParams.collectionId).then(function(data) {\\n if(!data) {\\n console.log('error processing complete file');\\n }\\n // need to refresh collection cache\\n adHocService.getAll(true).then(function(result) {\\n adHocService.resetCurrentCollection();\\n $state.go('ad-hoc');\\n });\\n });\\n } else {\\n // alert the customer to the error\\n $scope.uploadError = true;\\n $scope.uploadErrorMessage = err.msg;\\n }\\n };\\n\\n /**\\n * return null if valid and an error object if invalid\\n * error = {msg:i18nFilter(\\\"message\\\")}\\n */\\n var verifySchemaAndDirectives = function(directives, schema) {\\n var err = null;\\n // schema\\n for(var i=0;i<schema.length;i++) {\\n if(!schema[i].prettyName) {\\n err = {\\n msg:i18nFilter('allNameFieldsRequiredError')\\n };\\n }\\n }\\n // directives\\n // err = {msg:i18nFilter('badDirective')};\\n return err;\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/controllers/validate-upload-ctrl.js\\n ** module id = 5\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.DashboardEditCtrl', [\\n require('../directives/dashboard-canvas').name,\\n require('../directives/dashboard-rail').name,\\n require('../directives/responsive-evaluator').name,\\n require('../directives/dashboard-instrument-chrome').name,\\n require('../../instrument/directives/instrument').name,\\n require('../../instrument/directives/new-instrument-configuration').name,\\n require('../../common/directives/name-editor').name,\\n require('../directives/media-definition-track').name,\\n require('../directives/media-definition-menu').name,\\n require('../directives/ruler').name,\\n require('../../common/services/dashboard-service').name,\\n require('../services/event-bus').name,\\n require('../../common/services/dashboard-workspace').name,\\n require('../../common/services/post-message').name\\n ])\\n .controller('DashboardCtrl', function($scope, $state, $window, dashboardService, dashboardWorkspaceService, i18nFilter, eventBus, postMessageService) {\\n $scope.editable = false;\\n $scope.showRail = false;\\n $scope.newInstrumentConfigVisible = false;\\n\\n $scope.toggleRail = function() {\\n $scope.showRail = !$scope.showRail;\\n eventBus.publish('resetActiveMediaDefinition');\\n };\\n\\n var updateEditable = function() {\\n $scope.editable = $state.is('dashboard.edit');\\n };\\n\\n var loadDashboard = function(dashboardId) {\\n if (!dashboardWorkspaceService.dashboard || dashboardWorkspaceService.dashboard._id !== dashboardId) {\\n postMessageService.post('external.pageTitle', i18nFilter('dashboard'));\\n dashboardService.get(dashboardId).then(function(dashboard) {\\n dashboardWorkspaceService.pristineDashboard = dashboard;\\n dashboardWorkspaceService.dashboard = angular.copy(dashboard);\\n dashboardWorkspaceService.page = dashboard.pages[0];\\n postMessageService.post('external.pageTitle', dashboard.name);\\n });\\n } else {\\n postMessageService.post('external.pageTitle', dashboardWorkspaceService.dashboard.name);\\n }\\n };\\n\\n $scope.setActiveMediaDefinition = function(mediaDefinition) {\\n dashboardWorkspaceService.mediaDefinition = mediaDefinition;\\n };\\n\\n $scope.saveDashboard = function() {\\n dashboardService.save(dashboardWorkspaceService.dashboard).then(function() {\\n dashboardWorkspaceService.updatePristineCopy();\\n $state.go('dashboard.view', {\\n dashboardId: dashboardWorkspaceService.dashboard._id\\n });\\n });\\n };\\n\\n $scope.cancelEditing = function() {\\n dashboardWorkspaceService.revertChanges();\\n $state.go('dashboard.view', {\\n dashboardId: dashboardWorkspaceService.dashboard._id\\n });\\n };\\n\\n $scope.getRailToggleText = function() {\\n return i18nFilter($scope.showRail ? 'hideDashboardRail' : 'showDashboardRail');\\n };\\n\\n $scope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {\\n // Would love to show the user a prompt asking if they wish to continue their navigation or stay on the\\n // edit screen but this bug prevents it from happening without super-hax:\\n // https://github.com/angular-ui/ui-router/issues/273\\n if (fromState.name === 'dashboard.edit' && toState.name !== 'instrument.edit') {\\n dashboardWorkspaceService.revertChanges();\\n }\\n });\\n\\n $scope.$on('$stateChangeSuccess', function(e, to, toParams) {\\n if (to.name.indexOf('dashboard.') === 0) {\\n updateEditable();\\n loadDashboard(toParams.dashboardId);\\n }\\n });\\n\\n updateEditable();\\n\\n angular.element($window).on('beforeunload', function() {\\n if ($state.is('dashboard.edit') &&\\n !angular.equals(dashboardWorkspaceService.dashboard, dashboardWorkspaceService.pristineDashboard)) {\\n return i18nFilter('unsavedChangesPrompt');\\n }\\n });\\n\\n $scope.$watch(function() {\\n return dashboardWorkspaceService.dashboard;\\n }, function(dashboard) {\\n $scope.dashboard = dashboard;\\n });\\n\\n $scope.getMeasurementsStyle = function() {\\n var largestWidth = 0;\\n\\n // Arbitrary width that provides some room for the the last media definition label.\\n var buffer = 100;\\n\\n if (dashboardWorkspaceService.dashboard) {\\n dashboardWorkspaceService.dashboard.mediaDefinitions.forEach(function(mediaDefinition) {\\n largestWidth = Math.max(largestWidth, mediaDefinition.width);\\n });\\n }\\n\\n return {\\n width: largestWidth + buffer\\n };\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/controllers/dashboard-ctrl.js\\n ** module id = 6\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.InstrumentCtrl', [\\n require('../directives/instrument').name,\\n require('../directives/instrument-editor-bootstrap').name,\\n require('../../common/directives/name-editor').name,\\n require('../services/instrument-event-bus').name\\n ])\\n .controller('InstrumentCtrl', function($scope, $stateParams, $state, $window, dashboardService, dashboardWorkspaceService, instrumentEventBus, i18nFilter) {\\n $scope.instrument = null;\\n\\n var init = function(dashboard) {\\n $scope.dashboard = dashboard;\\n $scope.dashboard.instruments.forEach(function(instrument) {\\n if (instrument._id === $stateParams.instrumentId) {\\n $scope.instrument = angular.copy(instrument);\\n $scope.pristineInstrument = instrument;\\n return false;\\n }\\n });\\n if(!$scope.instrument) {\\n $state.go('dashboard.edit', {dashboardId: $state.params.dashboardId});\\n }\\n };\\n\\n angular.element($window).on('beforeunload', function() {\\n if ($state.is('instrument.edit') &&\\n !angular.equals($scope.instrument, $scope.pristineInstrument)) {\\n return i18nFilter('unsavedChangesPrompt');\\n }\\n });\\n\\n // If the dashboard workspace's active dashboard contains the instrument we want to use it's dashboard copy since it\\n // is the working copy (instead of the pristine dashboard object). This way when the user saves instrument changes\\n // and navigates back to the dashboard view the view is properly updated because it's the same object reference.\\n if (dashboardWorkspaceService.dashboard && dashboardWorkspaceService.dashboard._id === $stateParams.dashboardId) {\\n init(dashboardWorkspaceService.dashboard);\\n } else {\\n dashboardService.get($stateParams.dashboardId).then(function(dashboard) {\\n init(dashboard);\\n });\\n }\\n\\n var navigateToDashboard = function() {\\n $state.go('dashboard.edit', {\\n dashboardId: $scope.dashboard._id\\n });\\n };\\n\\n $scope.cancel = function() {\\n $scope.instrument = angular.copy($scope.pristineInstrument);\\n navigateToDashboard();\\n };\\n\\n $scope.save = function() {\\n angular.copy($scope.instrument, $scope.pristineInstrument);\\n instrumentEventBus.publish({\\n from: $scope.instrument._id,\\n topic: 'configChanged'\\n });\\n dashboardService.save($scope.dashboard).then(navigateToDashboard);\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/instrument/controllers/instrument-ctrl.js\\n ** module id = 7\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.i18n', [])\\n .provider('i18nBundle', function() {\\n this.$get = function() {\\n return this.bundle;\\n };\\n })\\n .filter('i18n', function(i18nBundle) {\\n // If additional arguments are provided, those additional arguments will be replaced into the target string.\\n // For example, if the localized key is \\\"viewingBooks\\\" and the value is \\\"Viewing %s books\\\" then the appropriate\\n // call would be i18nFilter('viewingBooks', 15); to produce \\\"Viewing 15 books\\\".\\n // If the localized key is \\\"authors\\\" and the value is \\\"Authors %1$s and %2$s others\\\" then the appropriate\\n // call would be i18nFilter('authors', 'Bob Marley', 8); to produce \\\"Authors Bob Marley and 8 others\\\".\\n return function(key, replacements) {\\n var formatter = i18nBundle[key];\\n return formatter ? formatter(replacements) : key;\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/filters/i18n.js\\n ** module id = 8\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.postMessageService', [\\n ])\\n .factory('postMessageService', function($window, $rootScope, $location, eventBus) {\\n var listen = function() {\\n var self = this;\\n\\n // Listen for state changes that external applications should know about.\\n $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {\\n switch(toState.name) {\\n case 'dashboard.edit':\\n case 'instrument.edit':\\n case 'collection':\\n case 'validate':\\n self.post('external.hideShell');\\n break;\\n default:\\n self.post('external.showShell');\\n }\\n });\\n\\n $rootScope.$on('$stateChangeSuccess', function() {\\n // For some reason $location.hash() doesn't return anything. I believe it is because\\n // we are using Angular UI's UI-Router which does its own thing.\\n var hash = '#' + $location.absUrl().split('#')[1];\\n self.post('external.stateChange', hash);\\n });\\n\\n // Listen for other post messages that come across the wire.\\n $window.addEventListener('message', function(event) {\\n if (event.origin !== $window.location.origin) {\\n return;\\n }\\n self._handleMessage(event);\\n });\\n };\\n\\n var post = function(type, message) {\\n var packet = { type: type };\\n if (arguments.length > 1) {\\n packet.message = message;\\n }\\n // Need to stringify the post message because <IE10 requires the post message to only be a string\\n // and not an object.\\n // use the window's parent (the iframe parent to post into)\\n $window.parent.postMessage(JSON.stringify(packet), $window.location.origin);\\n };\\n\\n var _handleMessage = function(event) {\\n var packet = JSON.parse(event.data);\\n switch(packet.type) {\\n case 'external.viewportResize': {\\n eventBus.publish('resetActiveMediaDefinition');\\n break;\\n }\\n }\\n };\\n\\n return {\\n listen: listen,\\n post: post,\\n _handleMessage: _handleMessage\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/post-message.js\\n ** module id = 9\\n ** module chunks = 0\\n **/\",\"'use strict';\\n/**\\n * A port of Q's allSettled API. While $q.all is rejected as soon as any child promise is rejected, allSettled will\\n * allow all child promises to settle (be resolved or rejected) before resolving the master promise.\\n * The master promise will be resolved with an array of objects that represent the state of the child promises.\\n * See https://github.com/kriskowal/q/wiki/API-Reference#promiseallsettled fore more information.\\n */\\nmodule.exports = angular.module('qAllSettled', [])\\n .config(function($provide) {\\n $provide.decorator('$q', function($delegate) {\\n var $q = $delegate;\\n $q.allSettled = function(promises) {\\n return $q.all(promises.map(function(promise) {\\n return promise.then(function(value) {\\n return { state: 'fulfilled', value: value };\\n }, function(reason) {\\n return { state: 'rejected', reason: reason };\\n });\\n }));\\n };\\n return $q;\\n });\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/q-all-settled.js\\n ** module id = 10\\n ** module chunks = 0\\n **/\",\"'use strict';\\n/**\\n * A port of Q's allSettled API. While $q.all is rejected as soon as any child promise is rejected, allSettled will\\n * allow all child promises to settle (be resolved or rejected) before resolving the master promise.\\n * The master promise will be resolved with an array of objects that represent the state of the child promises.\\n * See https://github.com/kriskowal/q/wiki/API-Reference#promiseallsettled fore more information.\\n */\\nmodule.exports = angular.module('qIgnorify', [])\\n .config(function($provide) {\\n $provide.decorator('$q', function($delegate) {\\n var defer = $delegate.defer;\\n var when = $delegate.when;\\n var reject = $delegate.reject;\\n var all = $delegate.all;\\n\\n function decoratePromise(promise) {\\n promise.ignorify = function() {\\n promise._ignore = false;\\n promise._then = promise.then;\\n\\n promise.ignore = function() {\\n promise._ignore = true;\\n };\\n\\n promise.then = function(thenFn, errFn, notifyFn) {\\n return promise._then(\\n function() {\\n if (!promise._ignore) {\\n thenFn.apply(this, arguments);\\n }\\n },\\n function() {\\n if (!promise._ignore) {\\n errFn.apply(this, arguments);\\n }\\n },\\n function() {\\n if (!promise._ignore) {\\n notifyFn.apply(this, arguments);\\n }\\n }\\n );\\n };\\n return promise;\\n };\\n return promise;\\n }\\n\\n $delegate.defer = function() {\\n var deferred = defer();\\n decoratePromise(deferred.promise);\\n return deferred;\\n };\\n\\n $delegate.when = function() {\\n return decoratePromise(when.apply(this, arguments));\\n };\\n\\n $delegate.reject = function() {\\n return decoratePromise(reject.apply(this, arguments));\\n };\\n\\n $delegate.all = function() {\\n return decoratePromise(all.apply(this, arguments));\\n };\\n\\n return $delegate;\\n });\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/q-ignorify.js\\n ** module id = 11\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.exceptionHandler', [])\\n .factory('$exceptionHandler', function($log, $injector, env, uuid) {\\n return function(exception, cause) {\\n var id = uuid(),\\n $http = $injector.get('$http');\\n\\n $http.post('/ui/errorLog', {\\n id: id,\\n message: exception.message,\\n stack: exception.stack,\\n cause: cause\\n }).catch(function() {\\n if (env === 'development') {\\n $log.error('UI Error could not be logged successfully.');\\n }\\n });\\n\\n if (env === 'development') {\\n $log.error(exception);\\n } else {\\n $log.error('Error ID: ' + id);\\n }\\n };\\n });\\n\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/exception-handler.js\\n ** module id = 12\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.sso', [\\n require('../../dashboard/services/event-bus').name\\n])\\n.factory('sso', function(eventBus, i18nFilter, $window, ims) {\\n var lastChecked = null;\\n var expires = 60000;\\n return {\\n requestInterceptor: function(config) {\\n var now = new Date().getTime();\\n if(!lastChecked || now - lastChecked > expires) {\\n var url = 'https://' + ims.host + '/ims/check/v1/token?' +\\n 'callback=?' +\\n '&client_id=' + ims.clientId +\\n '&scope=AdobeID,openid' +\\n '&_=' + now\\n ;\\n $.getJSON(url, function(sessionData) {\\n if(sessionData.error || sessionData.error_flag) {\\n eventBus.publish('processFailed', i18nFilter('loggedOutError'));\\n }\\n });\\n lastChecked = now;\\n }\\n return config;\\n }\\n };\\n});\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/sso.js\\n ** module id = 13\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.app', [\\n require('./alert').name,\\n require('./modal-progress-indicator').name\\n ])\\n .directive('app', function() {\\n return {\\n restrict: 'EA',\\n template: require('./app.tpl.html')\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/app.js\\n ** module id = 14\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.dashboardService', [\\n require('./tag-service').name,\\n require('./uuid').name,\\n require('./dashboard-mixin').name\\n ])\\n .factory('dashboardService', function($http, $q, user, tagService, eventBus, i18nFilter, dashboardMixin) {\\n var dashboardCache;\\n var allDashboardsPromiseById;\\n var fullDashboardPromiseById = {};\\n\\n var removeDependenciesRequestTransformer = function(data) {\\n return JSON.stringify(data, function(key, val) {\\n if (key === 'tags') {\\n return undefined;\\n }\\n return val;\\n });\\n };\\n\\n var removeFromCache = function(dashboard) {\\n if (dashboardCache) {\\n var i = dashboardCache.length;\\n while (i--) {\\n if (dashboardCache[i]._id === dashboard._id) {\\n dashboardCache.splice(i, 1);\\n }\\n // Continue looping in case the dashboard is there more than once. (shouldn't happen)\\n }\\n }\\n };\\n\\n /**\\n * Loads and joins dependencies (e.g., tags) onto dashboards.\\n * @param dashboardsPromise The promise for dashboards that are loading. This takes a promise so that dashboards\\n * can be loading in parallel to dependencies loading instead of sequentially.\\n * @returns {Promise}\\n */\\n var joinDependencies = function(dashboardsPromise) {\\n return $q.all([dashboardsPromise, tagService.query()]).then(function(responses) {\\n return joinTags(responses[0], responses[1]);\\n });\\n };\\n\\n var joinTags = function(dashboards, tags) {\\n // We convert dashboards to an array below to make it easier to work with\\n // but we want to return what the user gave us.\\n var origDashboards = dashboards;\\n\\n if (!angular.isArray(dashboards)) {\\n dashboards = [dashboards];\\n }\\n\\n var tagsByDashboardId = {};\\n tags.forEach(function(tag) {\\n var tagsWithId = tagsByDashboardId[tag.dashboardId];\\n\\n if (!tagsWithId) {\\n tagsWithId = tagsByDashboardId[tag.dashboardId] = [];\\n }\\n\\n tagsWithId.push(tag);\\n });\\n\\n dashboards.forEach(function(dashboard) {\\n dashboard.tags = tagsByDashboardId[dashboard._id] || [];\\n });\\n\\n return origDashboards;\\n };\\n\\n var getDashboardFromArray = function(dashboards, id) {\\n for (var i = 0; i < dashboards.length; i++) {\\n var candidate = dashboards[i];\\n if (candidate._id === id) {\\n return candidate;\\n }\\n }\\n };\\n\\n /**\\n * Retrieves a single dashboard. This is a full dashboard object (contains all information for the dashboard).\\n * @param id\\n * @returns {Promise}\\n */\\n var get = function(id) {\\n var promise = fullDashboardPromiseById[id];\\n\\n if (!promise) {\\n var deferred = $q.defer();\\n promise = deferred.promise;\\n\\n // Fetch all shallow dashboard objects first. It makes dealing with the cache, outstanding requests, and\\n // memory references a lot easier. The downside is that we're waiting for all shallow dashboards to load\\n // before loading the full dashboard object that's being requested so this may be room for optimization\\n // in the future.\\n query().then(function(dashboards) {\\n var cachedDashboard = getDashboardFromArray(dashboards, id);\\n\\n if (cachedDashboard.isFullDashboard()) {\\n deferred.resolve(cachedDashboard);\\n } else {\\n fullDashboardPromiseById[id] = deferred.promise;\\n\\n $http({\\n method: 'GET',\\n url: '/dashboards/' + id\\n }).then(function(response) {\\n var fullDashboard = response.data;\\n // Extend the cached dashboard instead of replacing it since other piecees of the app may have reference\\n // to the instance and we don't want to have to manage those references.\\n angular.extend(cachedDashboard, fullDashboard);\\n deferred.resolve(cachedDashboard);\\n delete fullDashboardPromiseById[id];\\n });\\n }\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n }\\n\\n return promise;\\n };\\n\\n /**\\n * Retrieves all dashboards. These are \\\"shallow\\\" dashboard objects that only include high-level information\\n * (no information regarding instruments, layout, etc).\\n * @returns {Promise}\\n */\\n var query = function() {\\n if (allDashboardsPromiseById) {\\n return allDashboardsPromiseById;\\n }\\n\\n var deferred = $q.defer();\\n\\n if (dashboardCache) {\\n deferred.resolve(dashboardCache);\\n } else {\\n allDashboardsPromiseById = deferred.promise;\\n\\n var loadPromise = $http({\\n method: 'GET',\\n url: '/dashboards'\\n }).then(function(response) {\\n var dashboards = response.data;\\n dashboards.forEach(addObjectMethods);\\n return dashboards;\\n }).catch(function(error) {\\n return $q.reject(error);\\n });\\n\\n // Pass the promise immediately instead of waiting for the promise to complete. This way dependencies can be\\n // loaded in parallel.\\n joinDependencies(loadPromise).then(function(dashboards) {\\n dashboardCache = dashboards;\\n deferred.resolve(dashboards);\\n allDashboardsPromiseById = null;\\n }).catch(function(error) {\\n eventBus.publish('processFailed', i18nFilter('queryDashboardsError'));\\n deferred.reject(error);\\n });\\n }\\n\\n var promise = deferred.promise;\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var leave = function(dashboards) {\\n var promises = dashboards.map(function(dashboard, index) {\\n return $http({\\n method: 'POST',\\n url: '/dashboards/' + dashboard._id + '/leave'\\n }).then(function() {\\n dashboard.removeParticipantForEntity(user);\\n removeFromCache(dashboard);\\n return dashboard;\\n }).catch(function() {\\n return $q.reject(dashboard);\\n });\\n });\\n\\n var masterPromise = $q.allSettled(promises).then(function(resolutions) {\\n var rejectedDashboards = dashboards.filter(function(dashboard, index) {\\n return resolutions[index].state === 'rejected';\\n });\\n\\n if (rejectedDashboards.length) {\\n eventBus.publish('processFailed', i18nFilter('leaveDashboardsError'));\\n return $q.reject(rejectedDashboards);\\n } else {\\n return dashboards;\\n }\\n });\\n\\n eventBus.publish('modalProcessStarted', masterPromise);\\n\\n return masterPromise;\\n };\\n\\n var save = function(dashboard) {\\n var method = dashboard._id ? 'PUT' : 'POST';\\n var promise = $http({\\n method: method,\\n url: '/dashboards/' + dashboard._id,\\n data: dashboard,\\n transformRequest: removeDependenciesRequestTransformer\\n }).then(function() {\\n if (!dashboard.isEntityAParticipant(user)) {\\n removeFromCache(dashboard);\\n }\\n return dashboard;\\n }).catch(function() {\\n eventBus.publish('processFailed', i18nFilter('saveDashboardError'));\\n return $q.reject(dashboard);\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var destroy = function(dashboards) {\\n var promises = dashboards.map(function(dashboard) {\\n return $http({\\n method: 'DELETE',\\n url: '/dashboards/' + dashboard._id\\n }).then(function() {\\n removeFromCache(dashboard);\\n return dashboard;\\n }).catch(function() {\\n return $q.reject(dashboard);\\n });\\n });\\n\\n var masterPromise = $q.allSettled(promises).then(function(resolutions) {\\n var rejectedDashboards = dashboards.filter(function(dashboard, index) {\\n return resolutions[index].state === 'rejected';\\n });\\n\\n if (rejectedDashboards.length) {\\n eventBus.publish('processFailed', i18nFilter('deleteDashboardsError'));\\n return $q.reject(rejectedDashboards);\\n } else {\\n return dashboards;\\n }\\n });\\n\\n eventBus.publish('modalProcessStarted', masterPromise);\\n\\n return masterPromise;\\n };\\n\\n var duplicate = function(dashboard) {\\n var promise = $http({\\n method: 'POST',\\n url: '/dashboards/' + dashboard._id + '/duplicate',\\n data: dashboard,\\n transformRequest: removeDependenciesRequestTransformer\\n }).then(function(response) {\\n var newDashboard = response.data;\\n addObjectMethods(newDashboard);\\n return newDashboard;\\n }).catch(function(error) {\\n eventBus.publish('processFailed', i18nFilter('duplicateDashboardError'));\\n return $q.reject(error);\\n });\\n\\n promise = joinDependencies(promise).then(function(dashboard) {\\n dashboardCache.push(dashboard);\\n return dashboard;\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var addObjectMethods = function(dashboard) {\\n return angular.extend(dashboard, dashboardMixin);\\n };\\n\\n return {\\n save: save,\\n get: get,\\n query: query,\\n destroy: destroy,\\n leave: leave,\\n duplicate: duplicate\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/dashboard-service.js\\n ** module id = 15\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.tagService', [\\n require('./sequence').name\\n ])\\n .factory('tagService', function($http, $q, Sequence, eventBus, i18nFilter) {\\n var allTagsCache,\\n queryPromise,\\n sequence = new Sequence();\\n\\n var removeFromCache = function(tag) {\\n var i = allTagsCache.length;\\n while (i--) {\\n if (allTagsCache[i]._id === tag._id) {\\n allTagsCache.splice(i, 1);\\n // Continue looping in case the tag is there more than once. (shouldn't happen)\\n }\\n }\\n };\\n\\n var query = function() {\\n if (!queryPromise) {\\n var deferred = $q.defer();\\n queryPromise = deferred.promise;\\n\\n if (allTagsCache) {\\n deferred.resolve(allTagsCache);\\n } else {\\n $http({\\n method: 'GET',\\n url: '/tags'\\n }).then(function(response) {\\n allTagsCache = response.data;\\n deferred.resolve(allTagsCache);\\n }).catch(function(error) {\\n eventBus.publish('processFailed', i18nFilter('queryTagsError'));\\n deferred.reject(error);\\n });\\n }\\n }\\n\\n return queryPromise;\\n };\\n\\n var save = function(tag) {\\n sequence.enqueue(function() {\\n var promise;\\n\\n if (tag._id) {\\n promise = $http({\\n method: 'PUT',\\n url: '/tags/' + tag._id,\\n data: tag\\n });\\n } else {\\n promise = $http({\\n method: 'POST',\\n url: '/tags',\\n data: tag\\n }).then(function(response) {\\n tag._id = response.data._id;\\n return tag;\\n });\\n }\\n\\n promise.catch(function(error) {\\n eventBus.publish('processFailed', i18nFilter('saveTagError'));\\n $q.reject(error);\\n });\\n\\n return promise;\\n });\\n };\\n\\n var destroy = function(tag) {\\n sequence.enqueue(function() {\\n return $http({\\n method: 'DELETE',\\n url: '/tags/' + tag._id\\n }).then(function(response) {\\n removeFromCache(tag);\\n return response;\\n }).catch(function(error) {\\n eventBus.publish('processFailed', i18nFilter('deleteTagError'));\\n $q.reject(error);\\n });\\n });\\n };\\n\\n return {\\n query: query,\\n save: save,\\n destroy: destroy\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/tag-service.js\\n ** module id = 16\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.tagEnum', [])\\n .constant('tagEnum', {\\n FAVORITE: 'totem.favorite'\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/tag-enum.js\\n ** module id = 17\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.selectionTable', [])\\n .directive('selectionTable', function() {\\n return {\\n scope: {\\n rowModels: '=',\\n selectedRowModels: '=',\\n\\n /**\\n * When a row is selected, the model to add to the selectedRowModels array will come from the scope of the row.\\n * The scope of the row is typically created by ng-repeat. When using ng-repeat=\\\"dashboard in dashboards\\\",\\n * the row's scope will have a dashboard attribute with the dashboard model. In this case, selectionModelMap\\n * should be set to \\\"dashboard\\\" so it can be retrieved from the row's scope when the row is selected.\\n */\\n selectionModelMap: '@'\\n },\\n link: function(scope, element, attrs) {\\n var allCheckboxSelector = attrs.selectAllSelector || 'th:first-child input';\\n var itemCheckboxSelector = attrs.selectItemSelector || 'td:first-child input';\\n\\n var updateSelectionModel = function() {\\n var selectedCheckboxes = element.find(itemCheckboxSelector + ':checked');\\n scope.selectedRowModels = selectedCheckboxes.toArray().map(function(selectedCheckbox) {\\n return $(selectedCheckbox).scope().$eval(scope.selectionModelMap);\\n });\\n };\\n\\n var updateSelectAllCheckbox = function() {\\n var itemCheckboxes = element.find(itemCheckboxSelector);\\n var allItemsSelected = itemCheckboxes.length && itemCheckboxes.not(':checked').length === 0;\\n $(allCheckboxSelector).prop('checked', allItemsSelected);\\n };\\n\\n element.on('change', allCheckboxSelector, function(event) {\\n var selected = $(event.currentTarget).prop('checked');\\n element.find(itemCheckboxSelector).prop('checked', selected);\\n\\n if (scope.selectedRowModels && scope.selectionModelMap) {\\n scope.$apply(updateSelectionModel);\\n }\\n });\\n\\n element.on('change', itemCheckboxSelector, function() {\\n updateSelectAllCheckbox();\\n\\n if (scope.selectedRowModels && scope.selectionModelMap) {\\n scope.$apply(updateSelectionModel);\\n }\\n });\\n\\n scope.$watchCollection('rowModels', function() {\\n updateSelectAllCheckbox();\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/selection-table.js\\n ** module id = 18\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.sortHeader', [])\\n .directive('sortHeader', function() {\\n return {\\n link: function(scope, element, attrs) {\\n element.addClass('totem-SortHeaderCell');\\n }\\n };\\n })\\n .directive('sortHeaderIcon', function() {\\n return {\\n scope: {\\n sortActive: '=',\\n sortAscending: '='\\n },\\n link: function(scope, element, attrs) {\\n element.addClass('totem-SortHeaderCell-icon');\\n\\n scope.$watch('sortActive', function(sortActive) {\\n element.toggle(sortActive);\\n });\\n\\n scope.$watch('sortAscending', function(sortAscending) {\\n element\\n .toggleClass('coral-Icon--arrowUp', sortAscending)\\n .toggleClass('coral-Icon--arrowDown', !sortAscending);\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/sort-header.js\\n ** module id = 19\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.adHocService', [\\n require('./participable-mixin').name\\n ])\\n .factory('adHocService', function($http, $q, $location, ims, participableMixin, eventBus, i18nFilter, externalServices) {\\n var collectionCache = null;\\n var originalCollections = null;\\n var currentCollection = null;\\n var rsAdHocBaseUrl = externalServices.rs.host + 'adhoc/';\\n var orgId = ims.activeOrg + '@AdobeOrg';\\n\\n var get = function(id) {\\n return getAll().then(function(collections) {\\n for (var i = 0; i < collections.length; i++) {\\n var collection = collections[i];\\n if (collection.id === id) {\\n return collection;\\n }\\n }\\n return null;\\n });\\n };\\n\\n var getAll = function(forceRefresh) {\\n forceRefresh = forceRefresh || false;\\n if(collectionCache && !forceRefresh) {\\n var deferred = $q.defer();\\n deferred.resolve(collectionCache);\\n return deferred.promise;\\n }\\n\\n var promise = $http({\\n method: 'GET',\\n url: rsAdHocBaseUrl + '?depth=3&orgId='+orgId,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n // SUCCESS\\n var collectionsById = response.data;\\n\\n var collections = [];\\n for (var id in collectionsById) {\\n if (collectionsById.hasOwnProperty(id)) {\\n var collection = collectionsById[id];\\n collection.id = id;\\n angular.extend(collection, participableMixin);\\n\\n // need to add the uploadId to the upload object\\n if(collection.uploads) {\\n for(var uploadId in collection.uploads) {\\n if(collection.uploads.hasOwnProperty(uploadId)) {\\n collection.uploads[uploadId].id = uploadId;\\n }\\n }\\n }\\n\\n // make the participants array match the expected format for\\n // participable\\n var newParticipants = [];\\n for(var participantId in collection.participants) {\\n if(collection.participants.hasOwnProperty(participantId)) {\\n // @todo: this info needs to be pulled from IMS\\n // Reporting Services does not have this info\\n newParticipants.push({\\n _id:participantId,\\n entity:{\\n _id:participantId,\\n displayName:'Some Name',\\n email:'[email protected]',\\n firstName:'Some',\\n lastName:'Name',\\n type:'user'\\n },\\n isOwner:collection.participants[participantId].owner\\n });\\n }\\n }\\n collection.participants = newParticipants;\\n\\n collections.push(collection);\\n }\\n }\\n\\n collectionCache = collections;\\n originalCollections = angular.copy(collectionCache);\\n\\n return collectionCache;\\n }, function(reason) {\\n eventBus.publish('processFailed',i18nFilter('adhocGenericCollectionError'));\\n return $q.reject(reason);\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n // metaData is an object that conforms to the inputs needed by adhoc/:collectionId PUT\\n var saveMetaData = function(metaData, collectionId) {\\n var promise = $http({\\n method: 'PUT',\\n url: rsAdHocBaseUrl + collectionId + '?orgId='+orgId,\\n data: metaData,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).catch(function(reason) {\\n eventBus.publish('processFailed',i18nFilter('adhocCollectionSaveError'));\\n return $q.reject(reason);\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var preRunFromPastebin = function(pastebinId, sampleSize, collectionId) {\\n sampleSize = sampleSize || 20;\\n\\n var createData = {\\n file: $location.protocol() + '://' + $location.host() + ($location.port() ? ':' + $location.port() : '') + '/pastebin/' + pastebinId\\n };\\n\\n var url = rsAdHocBaseUrl + (collectionId ? collectionId : '') + '?getDirectives=1&getSample='+sampleSize+'&noCommit=1&orgId='+orgId;\\n var promise = $http({\\n method: collectionId ? 'PUT' : 'POST',\\n url: url,\\n data: createData,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n return response.data;\\n }, function(reason) {\\n eventBus.publish('processFailed', i18nFilter('adhocGenericCollectionError'));\\n return $q.reject(reason);\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var createFromPastebin = function(pastebinId, directives, schema, collectionId) {\\n var createData = {\\n file: $location.protocol() + '://' + $location.host() + ($location.port() ? ':' + $location.port() : '') + '/pastebin/' + pastebinId,\\n schema: schema,\\n directives: directives,\\n name: currentCollection.name,\\n description: currentCollection.description,\\n uploadFile: currentCollection.fileName\\n };\\n var url = rsAdHocBaseUrl + (collectionId ? collectionId : '') + '?orgId='+orgId;\\n\\n var promise = $http({\\n method: collectionId ? 'PUT' : 'POST',\\n url: url,\\n data: createData,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n return response.data;\\n }, function(reason) {\\n eventBus.publish('processFailed', i18nFilter('adhocCollectionCreateError'));\\n return $q.reject(reason);\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var setCurrentCollection = function (collection) {\\n if(!collection) {\\n createNewCurrentCollection();\\n } else {\\n currentCollection = collection;\\n }\\n };\\n\\n var getCurrentCollection = function() {\\n if(!currentCollection) {\\n createNewCurrentCollection();\\n }\\n return currentCollection;\\n };\\n\\n var createNewCurrentCollection = function () {\\n currentCollection = {};\\n angular.extend(currentCollection, participableMixin);\\n };\\n\\n var resetCurrentCollection = function() {\\n currentCollection = null;\\n };\\n\\n var deleteUpload = function(collection, upload) {\\n if(!collection || !upload) {\\n return;\\n }\\n var url = rsAdHocBaseUrl + collection.id + '/uploads/' + upload.id + '?orgId='+orgId;\\n var promise = $http({\\n method: 'DELETE',\\n url: url,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n // decrement the rowCount on the collection\\n collection.rowCount -= upload.rowCount;\\n if(collection.uploads && collection.uploads[upload.id]) {\\n delete collection.uploads[upload.id];\\n }\\n return response.data;\\n }, function(reason) {\\n eventBus.publish('processFailed', i18nFilter('adhocUploadDeleteError'));\\n return $q.reject(reason);\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var deleteCollection = function(collection) {\\n if(!collection) {\\n eventBus.publish('processFailed', i18nFilter('adhocGenericCollectionError'));\\n return;\\n }\\n\\n var url = rsAdHocBaseUrl + collection.id + '?orgId='+orgId;\\n\\n var promise = $http({\\n method: 'DELETE',\\n url: url,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n var ind = collectionCache.indexOf(collection);\\n if(ind > -1) {\\n collectionCache.splice(ind,1);\\n }\\n return response;\\n }, function(reason) {\\n eventBus.publish('processFailed', i18nFilter('adhocCollectionDeleteError'));\\n return $q.reject(reason);\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var savePermissions = function(collection) {\\n var oldParticipants = null;\\n originalCollections.forEach(function(col) {\\n if(col.id == collection.id) {\\n oldParticipants = col.participants;\\n }\\n });\\n\\n if(!oldParticipants) {\\n eventBus.publish('processFailed', i18nFilter('genericPermissionsChangeError'));\\n return;\\n }\\n var newParticipants = [];\\n var removedParticipants = [];\\n var changedParticipants = [];\\n var participantId = null;\\n var oldParticipantId = null;\\n var participantFound = false;\\n\\n // find removed and altered participants\\n // participants in the old array that are not in the new array have been removed\\n // participants in the old array that are different from the ones in the new array have been altered\\n for(oldParticipantId in oldParticipants) {\\n if(oldParticipants.hasOwnProperty(oldParticipantId)) {\\n participantFound = false;\\n for(participantId in collection.participants) {\\n if(collection.participants.hasOwnProperty(participantId)) {\\n if(collection.participants[participantId].entity._id == oldParticipants[oldParticipantId].entity._id) {\\n participantFound = true;\\n if(collection.participants[participantId].isOwner != oldParticipants[oldParticipantId].isOwner) {\\n oldParticipants[oldParticipantId].isOwner = collection.participants[participantId];\\n changedParticipants.push(collection.participants[participantId]);\\n }\\n }\\n }\\n }\\n if(!participantFound) {\\n removedParticipants.push(oldParticipants[oldParticipantId]);\\n }\\n }\\n }\\n\\n // find new participants\\n // participants in the new array that are not in the old array are new\\n for(participantId in collection.participants) {\\n if(collection.participants.hasOwnProperty(participantId)) {\\n participantFound = false;\\n for(oldParticipantId in oldParticipants) {\\n if(oldParticipants.hasOwnProperty(oldParticipantId)) {\\n if(collection.participants[participantId].entity._id && collection.participants[participantId].entity._id == oldParticipants[oldParticipantId].entity._id) {\\n participantFound = true;\\n }\\n }\\n }\\n if(!participantFound) {\\n newParticipants.push(collection.participants[participantId]);\\n }\\n }\\n }\\n // send alerts if any of these operations fail\\n // for creating:POST, for editing:PUT and for removing:DELETE\\n // url is rsAdHocBaseUrl + collection.id + '/participants'\\n var promises = [];\\n newParticipants.forEach(function(participant) {\\n promises.push(addParticipant(collection, participant));\\n });\\n\\n removedParticipants.forEach(function(participant) {\\n promises.push(removeParticipant(collection, participant));\\n });\\n\\n changedParticipants.forEach(function(participant) {\\n promises.push(editParticipant(collection,participant));\\n });\\n\\n $q.all(promises).catch(function(res) {\\n eventBus.publish('processFailed', i18nFilter('genericPermissionsChangeError'));\\n });\\n };\\n\\n var addParticipant = function(collection, participant)\\n {\\n var url = rsAdHocBaseUrl + collection.id + '/participants?orgId='+orgId;\\n var createData = {\\n userId:participant.entity._id,\\n owner:participant.isOwner\\n };\\n var promise = $http({\\n method: 'POST',\\n url: url,\\n data: createData,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n return response.data;\\n }, function(reason) {\\n eventBus.publish('processFailed', i18nFilter('adhocPermissionError'));\\n return $q.reject(reason);\\n });\\n \\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var removeParticipant = function(collection, participant)\\n {\\n var url = rsAdHocBaseUrl + collection.id + '/participants/' + participant.entity._id + '?orgId='+orgId;\\n var promise = $http({\\n method: 'DELETE',\\n url: url,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n return response.data;\\n }, function(reason) {\\n eventBus.publish('processFailed', i18nFilter('adhocPermissionError'));\\n return $q.reject(reason);\\n });\\n \\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var editParticipant = function(collection, participant)\\n {\\n var url = rsAdHocBaseUrl + collection.id + '/participants/' + participant.entity._id + '?orgId='+orgId;\\n var editData = {\\n owner:participant.isOwner\\n };\\n var promise = $http({\\n method: 'PUT',\\n url: url,\\n data:editData,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n return response.data;\\n }, function(reason) {\\n eventBus.publish('processFailed', i18nFilter('adhocPermissionError'));\\n return $q.reject(reason);\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n return {\\n get : get,\\n getAll : getAll,\\n saveMetaData : saveMetaData,\\n createFromPastebin: createFromPastebin,\\n preRunFromPastebin: preRunFromPastebin,\\n getCurrentCollection: getCurrentCollection,\\n setCurrentCollection: setCurrentCollection,\\n resetCurrentCollection: resetCurrentCollection,\\n deleteUpload:deleteUpload,\\n deleteCollection:deleteCollection,\\n savePermissions:savePermissions\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/ad-hoc-service.js\\n ** module id = 20\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.nameEditor', [\\n require('../../common/directives/steal-focus').name\\n ])\\n .directive('nameEditor', function() {\\n return {\\n template: require('./name-editor.tpl.html'),\\n restrict: 'E',\\n scope: {\\n name: '='\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/name-editor.js\\n ** module id = 21\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.dashboardWorkspaceService', [\\n require('./uuid').name\\n])\\n.factory('dashboardWorkspaceService', function($rootScope, instrumentEventBus) {\\n var service = {\\n /**\\n * The dashboard model as it was the last time it was saved.\\n */\\n pristineDashboard: null,\\n /**\\n * The working dashboard model which may contain unsaved changes.\\n */\\n dashboard: null,\\n /**\\n * The active media definition for the workspace.\\n */\\n mediaDefinition: null,\\n /**\\n * The active page for the workspace.\\n */\\n page: null,\\n /**\\n * The active media layouts for the workspace.\\n */\\n mediaLayouts: null,\\n /**\\n * The active instruments for the workspace.\\n */\\n instruments: null,\\n\\n revertChanges: function() {\\n this.dashboard = angular.copy(this.pristineDashboard);\\n },\\n\\n updatePristineCopy: function() {\\n // Copy to pristine dashboard instead of replace since other pieces of the app might already be referencing\\n // the pristine dashboard instance and we don't want to have to manage those references.\\n angular.copy(this.dashboard, this.pristineDashboard);\\n }\\n };\\n\\n /**\\n * Finds media layouts and instruments that match the current dashboard, media definition, and page and sets\\n * them on the service.\\n */\\n var updateMediaLayoutsAndInstruments = function() {\\n if (service.mediaDefinition &&\\n service.dashboard &&\\n service.dashboard.mediaLayouts &&\\n service.dashboard.instruments) {\\n service.mediaLayouts = service.dashboard.mediaLayouts.filter(function(mediaLayout) {\\n return mediaLayout.pageId == service.page._id &&\\n mediaLayout.mediaDefinitionId == service.mediaDefinition._id;\\n });\\n service.instruments = service.dashboard.instruments.filter(function(instrument) {\\n // Only include an instrument if there's an associated media layout we're actively working with.\\n for (var i = 0; i < service.mediaLayouts.length; i++) {\\n var mediaLayout = service.mediaLayouts[i];\\n if (instrument._id == mediaLayout.instrumentId) {\\n return true;\\n }\\n }\\n return false;\\n });\\n }\\n };\\n\\n $rootScope.$watchGroup([\\n function() { return service.dashboard; },\\n function() { return service.page; },\\n function() { return service.mediaDefinition; }\\n ], updateMediaLayoutsAndInstruments);\\n\\n $rootScope.$watchCollection(function() {\\n return service.dashboard ? service.dashboard.instruments : null;\\n }, updateMediaLayoutsAndInstruments);\\n\\n $rootScope.$watchCollection(function() {\\n return service.dashboard ? service.dashboard.mediaLayouts : null;\\n }, updateMediaLayoutsAndInstruments);\\n\\n\\n var oldMediaDefinition;\\n var oldPage;\\n var oldDashboard;\\n $rootScope.$watch(function() {\\n // If the media definition is changing but not the dashboard nor page, then we need to tell the instruments\\n // that they have resized so that they will re-render (their instruments have, indeed, changed size).\\n // If we're changing pages or dashboards then we're dealing with new instruments therefore they're rendering from\\n // scratch and we don't need to notify of any resizing. While we could publish this event from all the many places\\n // where we change the media definition, this keeps the logic in a single place and ensures that it happens\\n // when it needs to.\\n if (service.mediaDefinition !== oldMediaDefinition &&\\n service.dashboard === oldDashboard &&\\n service.page === oldPage) {\\n instrumentEventBus.publish({\\n topic: 'resized'\\n });\\n }\\n\\n //console.log(oldMediaDefinition._id, service.mediaDefinition._id)\\n oldMediaDefinition = service.mediaDefinition;\\n oldPage = service.page;\\n oldDashboard = service.dashboard;\\n });\\n\\n return service;\\n});\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/dashboard-workspace.js\\n ** module id = 22\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.alert', [])\\n .directive('alert', function(eventBus) {\\n return {\\n restrict: 'EA',\\n template: require('./alert.tpl.html'),\\n scope: true,\\n link: function(scope, element, attr) {\\n scope.visible = false;\\n scope.type = '';\\n scope.content = '';\\n\\n eventBus.subscribe('processFailed', function(content) {\\n scope.type = 'error';\\n scope.content = content;\\n scope.visible = true;\\n });\\n\\n element.find('.coral-Alert-closeButton').on('click', function() {\\n scope.$apply(function() {\\n scope.visible = false;\\n });\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/alert.js\\n ** module id = 23\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.modalProgressIndicator', [])\\n .directive('modalProgressIndicator', function(eventBus) {\\n return {\\n restrict: 'EA',\\n template: require('./modal-progress-indicator.tpl.html'),\\n scope: true,\\n link: function(scope, element, attr) {\\n scope.visible = false;\\n\\n var promises = [];\\n\\n eventBus.subscribe('modalProcessStarted', function(promise) {\\n promises.push(promise);\\n promise.finally(function() {\\n promises.splice(promises.indexOf(promise), 1);\\n if (!promises.length) {\\n scope.visible = false;\\n }\\n });\\n scope.visible = true;\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/modal-progress-indicator.js\\n ** module id = 24\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.manageToolbar', [\\n require('../../common/directives/share').name,\\n require('../../common/services/dashboard-service').name\\n ])\\n .directive('manageToolbar', function(user, $state, $q, dashboardService, i18nFilter) {\\n return {\\n restrict: 'EA',\\n scope: {\\n dashboards: '=',\\n selectedDashboards: '='\\n },\\n template: require('./manage-toolbar.tpl.html'),\\n link: function(scope, element, attrs) {\\n var removeDashboardFromSelection = function(dashboard) {\\n var index = scope.selectedDashboards.indexOf(dashboard);\\n if (index > -1) {\\n scope.selectedDashboards.splice(index, 1);\\n }\\n };\\n\\n scope.showSearchField = false;\\n scope.leaveModalVisible = false;\\n scope.deleteModalVisible = false;\\n scope.deleteModalDescription = '';\\n scope.shareModalVisible = false;\\n\\n scope.viewDashboard = function() {\\n $state.go('dashboard.view', {\\n dashboardId: scope.selectedDashboards[0]._id\\n });\\n };\\n\\n scope.duplicateDashboard = function() {\\n dashboardService.duplicate(scope.selectedDashboards[0]);\\n };\\n\\n scope.leaveDashboard = function() {\\n scope.leaveModalVisible = true;\\n };\\n\\n scope.confirmLeaveDashboard = function() {\\n // Copy selection in case scope.selectedDashboards is modified by the time a response is received.\\n var dashboardsToLeave = scope.selectedDashboards.slice();\\n\\n dashboardService.leave(dashboardsToLeave).then(function() {\\n dashboardsToLeave.forEach(removeDashboardFromSelection);\\n }, function(failedDashboards) {\\n dashboardsToLeave.forEach(function(dashboard) {\\n if (failedDashboards.indexOf(dashboard) === -1) {\\n removeDashboardFromSelection(dashboard);\\n }\\n });\\n });\\n };\\n\\n scope.editDashboard = function() {\\n $state.go('dashboard.edit', {\\n dashboardId: scope.selectedDashboards[0]._id\\n });\\n };\\n\\n scope.deleteDashboard = function() {\\n // We need to find unique entity IDs here instead of participant IDs. Participant objects may not have an ID.\\n // This is the case when a user/group was just added as a participant to the dashboard since the frontend does\\n // not create an ID for new participant objects. Also, it's probably not good to assume that participant IDs\\n // and entity IDs are 1:1. We're really trying to find unique entities here anyway.\\n var affectedUserIds = [];\\n var affectedGroupIds = [];\\n\\n var addAffectedEntity = function(entity) {\\n var ids;\\n switch (entity.type) {\\n case 'group':\\n ids = affectedGroupIds;\\n break;\\n default:\\n ids = affectedUserIds;\\n }\\n\\n if (ids.indexOf(entity._id) === -1) {\\n ids.push(entity._id);\\n }\\n };\\n\\n scope.selectedDashboards.forEach(function(dashboard) {\\n dashboard.participants.forEach(function(participant) {\\n addAffectedEntity(participant.entity);\\n });\\n });\\n\\n var i18nKey = affectedUserIds.length && affectedGroupIds.length ?\\n 'deleteDashboardUsersAndGroupsDescription' :\\n 'deleteDashboardUsersOrGroupsDescription';\\n\\n scope.deleteModalDescription = i18nFilter(i18nKey, {\\n NUM_DASHBOARDS: scope.selectedDashboards.length,\\n NUM_USERS_AFFECTED: affectedUserIds.length,\\n NUM_GROUPS_AFFECTED: affectedGroupIds.length\\n });\\n\\n scope.deleteModalVisible = true;\\n };\\n\\n scope.confirmDeleteDashboard = function() {\\n // Copy selection in case scope.selectedDashboards is modified by the time a response is received.\\n var dashboardsToDelete = scope.selectedDashboards.slice();\\n\\n dashboardService.destroy(dashboardsToDelete).then(function(dashboards) {\\n dashboardsToDelete.forEach(removeDashboardFromSelection);\\n }, function(failedDashboards) {\\n dashboardsToDelete.forEach(function(dashboard) {\\n if (failedDashboards.indexOf(dashboard) === -1) {\\n removeDashboardFromSelection(dashboard);\\n }\\n });\\n });\\n };\\n\\n scope.isSearchable = function() {\\n return scope.selectedDashboards.length === 0;\\n };\\n\\n scope.isShareable = function() {\\n if (scope.selectedDashboards.length !== 1) {\\n return false;\\n }\\n\\n return scope.selectedDashboards[0].isEntityAnOwner(user);\\n };\\n\\n scope.isViewable = function() {\\n return scope.selectedDashboards.length === 1;\\n };\\n\\n scope.isDuplicable = function() {\\n return scope.selectedDashboards.length === 1;\\n };\\n\\n scope.isDownloadable = function() {\\n return scope.selectedDashboards.length === 1;\\n };\\n\\n scope.isLeavable = function() {\\n if (scope.selectedDashboards.length === 0) {\\n return false;\\n }\\n for (var i = 0; i < scope.selectedDashboards.length; i++) {\\n var dashboard = scope.selectedDashboards[i];\\n // If the user is the only owner of the dashboard\\n if (dashboard.isEntitySoleOwner(user)) {\\n return false;\\n }\\n }\\n\\n return true;\\n };\\n\\n scope.isLeaveViewable = function() {\\n if (scope.isLeavable()) {\\n return true;\\n }\\n\\n for (var i = 0; i < scope.selectedDashboards.length; i++) {\\n if (!scope.selectedDashboards[i].isEntityAnOwner(user)) {\\n return true;\\n }\\n }\\n return false;\\n };\\n\\n scope.isEditable = function() {\\n return scope.selectedDashboards.length === 1 && scope.selectedDashboards[0].isEntityAnOwner(user);\\n };\\n\\n scope.isDeletable = function() {\\n var owningOnly = true;\\n for (var i = 0; i < scope.selectedDashboards.length; i++) {\\n if (!scope.selectedDashboards[i].isEntityAnOwner(user)) {\\n owningOnly = false;\\n }\\n }\\n return owningOnly;\\n };\\n\\n scope.isDeleteViewable = function() {\\n for (var i = 0; i < scope.selectedDashboards.length; i++) {\\n if (scope.selectedDashboards[i].isEntityAnOwner(user)) {\\n return true;\\n }\\n }\\n return false;\\n };\\n\\n scope.share = function() {\\n scope.shareModalVisible = true;\\n };\\n\\n scope.saveDashboard = function(dashboard) {\\n dashboardService.save(dashboard);\\n };\\n\\n// Debugging.\\n// scope.$watch('dashboards', function() {\\n// if (scope.dashboards && scope.dashboards.length > 0) {\\n// scope.selectedDashboards = [scope.dashboards[0]];\\n// scope.share();\\n// }\\n// });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/manage/directives/manage-toolbar.js\\n ** module id = 25\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.dashboardSearch', [])\\n .directive('dashboardSearch', function() {\\n return {\\n restrict: 'EA',\\n scope: {\\n dashboards: '='\\n },\\n template: require('./dashboard-search.tpl.html'),\\n link: function(scope, element, attrs) {\\n element.find('.js-coral-Autocomplete-textfield').focus();\\n element.on('change:value', function(event, payload) {\\n // TODO: Somehow change the dashboard filter.\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/manage/directives/dashboard-search.js\\n ** module id = 26\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<manage-toolbar dashboards=\\\\\\\"dashboards\\\\\\\" selected-dashboards=\\\\\\\"selectedDashboards\\\\\\\"></manage-toolbar>\\\\n<div class=\\\\\\\"u-totem-contentUnderActionBar\\\\\\\">\\\\n <table class=\\\\\\\"coral-Table totem-ManageTable\\\\\\\" selection-table row-models=\\\\\\\"dashboards\\\\\\\" selected-row-models=\\\\\\\"selectedDashboards\\\\\\\" selection-model-map=\\\\\\\"dashboard\\\\\\\">\\\\n <thead>\\\\n <tr class=\\\\\\\"coral-Table-row\\\\\\\">\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ManageTable-headerCell totem-ManageTable-headerCell--select\\\\\\\">\\\\n <label class=\\\\\\\"coral-Checkbox\\\\\\\">\\\\n <input class=\\\\\\\"coral-Checkbox-input\\\\\\\" type=\\\\\\\"checkbox\\\\\\\" select-all-checkbox>\\\\n <span class=\\\\\\\"coral-Checkbox-checkmark\\\\\\\"></span>\\\\n </label>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ManageTable-headerCell totem-ManageTable-headerCell--favorite\\\\\\\"></th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ManageTable-headerCell totem-ManageTable-headerCell--name\\\\\\\" ng-click=\\\\\\\"setSort('name')\\\\\\\" sort-header>\\\\n {{ 'name' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === 'name'\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ManageTable-headerCell totem-ManageTable-headerCell--editors\\\\\\\" ng-click=\\\\\\\"setSort(getFirstOwnerFullName)\\\\\\\" sort-header>\\\\n {{ 'owners' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === getFirstOwnerFullName\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ManageTable-headerCell totem-ManageTable-headerCell--viewers\\\\\\\" ng-click=\\\\\\\"setSort('participants.length')\\\\\\\" sort-header>\\\\n {{ 'viewers' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === 'participants.length'\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ManageTable-headerCell totem-ManageTable-headerCell--views\\\\\\\" ng-click=\\\\\\\"setSort('views')\\\\\\\" sort-header>\\\\n {{ 'views' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === 'views'\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ManageTable-headerCell totem-ManageTable-headerCell--scheduled\\\\\\\">{{ 'scheduled' | i18n }}</th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ManageTable-headerCell totem-ManageTable-headerCell--updated\\\\\\\" ng-click=\\\\\\\"setSort('modified')\\\\\\\" sort-header>\\\\n {{ 'updated' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === 'modified'\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n </tr>\\\\n </thead>\\\\n <tbody>\\\\n <tr class=\\\\\\\"coral-Table-row\\\\\\\" ng-repeat=\\\\\\\"dashboard in dashboards | orderBy:sortPredicate:sortReverse\\\\\\\">\\\\n <td class=\\\\\\\"coral-Table-cell totem-ManageTable-cell\\\\\\\">\\\\n <label class=\\\\\\\"coral-Checkbox\\\\\\\">\\\\n <input class=\\\\\\\"coral-Checkbox-input\\\\\\\" type=\\\\\\\"checkbox\\\\\\\" select-item-checkbox>\\\\n <span class=\\\\\\\"coral-Checkbox-checkmark\\\\\\\"></span>\\\\n </label>\\\\n </td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ManageTable-cell totem-ManageTable-cell--favorite\\\\\\\"><button class=\\\\\\\"coral-MinimalButton totem-FavoriteButton\\\\\\\" ng-click=\\\\\\\"toggleFavorite(dashboard)\\\\\\\"><i class=\\\\\\\"coral-Icon totem-FavoriteIcon\\\\\\\" ng-class=\\\\\\\"{'coral-Icon--star totem-FavoriteIcon--selected': isDashboardFavorited(dashboard), 'coral-Icon--starStroke': !isDashboardFavorited(dashboard)}\\\\\\\"></i></button></td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ManageTable-cell\\\\\\\"><a class=\\\\\\\"coral-Link\\\\\\\" ui-sref=\\\\\\\"dashboard.view({dashboardId: dashboard._id})\\\\\\\">{{ dashboard.name }}</a></td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ManageTable-cell\\\\\\\">{{ getPluralizedOwners(getOwners(dashboard)) }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ManageTable-cell\\\\\\\"><i class=\\\\\\\"coral-Icon coral-Icon--user coral-Icon--sizeXS totem-ManageTable-labelIcon\\\\\\\"></i>{{ dashboard.participants.length | number }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ManageTable-cell\\\\\\\"><i class=\\\\\\\"coral-Icon coral-Icon--viewOn coral-Icon--sizeXS totem-ManageTable-labelIcon\\\\\\\"></i>{{ '18283' | number }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ManageTable-cell\\\\\\\"><i class=\\\\\\\"coral-Icon coral-Icon--email coral-Icon--sizeXS totem-ManageTable-labelIcon\\\\\\\"></i>Me + 3</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ManageTable-cell--updated\\\\\\\">{{ dashboard.modified | date: 'mediumDate' }}</td>\\\\n </tr>\\\\n </tbody>\\\\n </table>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/manage/views/manage.tpl.html\\n ** module id = 27\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<ad-hoc-manage-toolbar collections=\\\\\\\"adHocCollections\\\\\\\" selected-collections=\\\\\\\"selectedAdHocCollections\\\\\\\"></ad-hoc-manage-toolbar>\\\\n<div class=\\\\\\\"u-totem-contentUnderActionBar\\\\\\\">\\\\n <table class=\\\\\\\"coral-Table totem-AdHocTable totem-AdHocTable--collections\\\\\\\" selection-table row-models=\\\\\\\"collections\\\\\\\" selected-row-models=\\\\\\\"selectedAdHocCollections\\\\\\\" selection-model-map=\\\\\\\"collection\\\\\\\">\\\\n <thead>\\\\n <tr class=\\\\\\\"coral-Table-row\\\\\\\">\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--select\\\\\\\">\\\\n <label class=\\\\\\\"coral-Checkbox\\\\\\\">\\\\n <input class=\\\\\\\"coral-Checkbox-input\\\\\\\" type=\\\\\\\"checkbox\\\\\\\" select-all-checkbox>\\\\n <span class=\\\\\\\"coral-Checkbox-checkmark\\\\\\\"></span>\\\\n </label>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell\\\\\\\" ng-click=\\\\\\\"setSort('name')\\\\\\\" sort-header>\\\\n {{ 'name' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === 'name'\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--createdBy\\\\\\\" sort-header>\\\\n {{ 'createdby' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--dashboardCount\\\\\\\" sort-header>\\\\n {{ 'dashboards' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--records\\\\\\\" ng-click=\\\\\\\"setSort('rowCount')\\\\\\\" sort-header>\\\\n {{ 'records' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === 'rowCount'\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--capacity\\\\\\\" ng-click=\\\\\\\"setSort(getCapacity)\\\\\\\" sort-header>\\\\n {{ 'capacity' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === getCapacity\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n </tr>\\\\n </thead>\\\\n <tbody>\\\\n <tr class=\\\\\\\"coral-Table-row\\\\\\\" ng-repeat=\\\\\\\"collection in adHocCollections | orderBy:sortPredicate:sortReverse\\\\\\\">\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell\\\\\\\">\\\\n <label class=\\\\\\\"coral-Checkbox\\\\\\\">\\\\n <input class=\\\\\\\"coral-Checkbox-input\\\\\\\" type=\\\\\\\"checkbox\\\\\\\" select-item-checkbox>\\\\n <span class=\\\\\\\"coral-Checkbox-checkmark\\\\\\\"></span>\\\\n </label>\\\\n </td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell\\\\\\\"><a class=\\\\\\\"coral-Link\\\\\\\" ui-sref=\\\\\\\"collection({collectionId:collection.id})\\\\\\\">{{ collection.name }}</a><br>{{collection.description}}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell\\\\\\\"><i class=\\\\\\\"coral-Icon totem-ManageTable-labelIcon coral-Icon--user coral-Icon--sizeXS\\\\\\\"></i>{{ 'Travis Funk' }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell\\\\\\\">{{ 1 | number }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell\\\\\\\">{{ collection.rowCount | number }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell--capacity\\\\\\\">\\\\n <ad-hoc-capacity usage=\\\\\\\"{{collection.rowCount}}\\\\\\\" capacity=\\\\\\\"{{collection.maxRows}}\\\\\\\"></ad-hoc-capacity>\\\\n </td>\\\\n </tr>\\\\n </tbody>\\\\n </table>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/views/ad-hoc.tpl.html\\n ** module id = 28\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-EditTitleBar coral--dark\\\\\\\">\\\\n <div class=\\\\\\\"totem-EditTitleBar-title\\\\\\\">\\\\n {{ 'manageCollections' | i18n }}\\\\n </div>\\\\n <div class=\\\\\\\"totem-EditTitleBar-buttons\\\\\\\">\\\\n <button class=\\\\\\\"totem-EditTitleBar-cancelButton coral-Button coral-Button--quiet\\\\\\\" ng-click=\\\\\\\"cancelEditing()\\\\\\\">{{ 'cancel' | i18n }}</button>\\\\n <button class=\\\\\\\"totem-EditTitleBar-saveButton coral-Button coral-Button--primary\\\\\\\" ng-disabled=\\\\\\\"!collection.name || (!collection && !uploadFileName) || saveDisabled\\\\\\\" ng-click=\\\\\\\"saveCollection()\\\\\\\">{{ 'save' | i18n }}</button>\\\\n </div>\\\\n</div>\\\\n<div class=\\\\\\\"u-totem-contentUnderEditTitleBar\\\\\\\">\\\\n <div class=\\\\\\\"totem-ActionBar\\\\\\\" ng-show=\\\\\\\"collection.rowCount > 0\\\\\\\">\\\\n <div class=\\\\\\\"coral-ButtonGroup\\\\\\\">\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--alias\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">Export</span></a>\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\" ng-click=\\\\\\\"forceUploadVisibility = true\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--addCircle\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">Add Data</span></a>\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--delete\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">Delete Data</span></a>\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--tableHistogram\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">View Schema</span></a>\\\\n </div>\\\\n </div>\\\\n <section class=\\\\\\\"totem-Section\\\\\\\">\\\\n <form class=\\\\\\\"coral-Form coral-Form--vertical\\\\\\\" style=\\\\\\\"width:100%\\\\\\\">\\\\n <label class=\\\\\\\"coral-Form-fieldlabel\\\\\\\">\\\\n <span class=\\\\\\\"coral-Heading coral-Heading--4\\\\\\\">{{ 'name' | i18n }}</span>\\\\n <input class=\\\\\\\"coral-Form-field coral-Textfield\\\\\\\" type=\\\\\\\"text\\\\\\\" ng-model=\\\\\\\"collection.name\\\\\\\">\\\\n </label>\\\\n\\\\n <label class=\\\\\\\"coral-Form-fieldlabel\\\\\\\">\\\\n <span class=\\\\\\\"coral-Heading coral-Heading--4\\\\\\\">{{ 'description' | i18n }}</span>\\\\n <input class=\\\\\\\"u-totem-noMargin coral-Form-field coral-Textfield\\\\\\\" type=\\\\\\\"text\\\\\\\" ng-model=\\\\\\\"collection.description\\\\\\\" maxlength=\\\\\\\"255\\\\\\\">\\\\n </label>\\\\n </form>\\\\n </section>\\\\n <section class=\\\\\\\"totem-Section\\\\\\\" ng-show=\\\\\\\"forceUploadVisibility || (collection && !collection.rowCount)\\\\\\\">\\\\n <h4 class=\\\\\\\"coral-Heading coral-Heading--4\\\\\\\">{{ 'dataUpload' | i18n }}</h4>\\\\n <ad-hoc-data-upload save-disabled=\\\\\\\"saveDisabled\\\\\\\" upload-file-name=\\\\\\\"uploadFileName\\\\\\\" collection=\\\\\\\"collection\\\\\\\"></ad-hoc-data-upload>\\\\n </section>\\\\n <section class=\\\\\\\"totem-Section\\\\\\\" ng-show=\\\\\\\"collection.rowCount > 0\\\\\\\">\\\\n <h4 class=\\\\\\\"coral-Heading coral-Heading--4\\\\\\\">{{ 'uploadHistory' | i18n }}</h4>\\\\n <table class=\\\\\\\"totem-AdHocTable totem-AdHocTable--collection coral-Table coral-Table--bordered\\\\\\\">\\\\n <thead>\\\\n <tr class=\\\\\\\"coral-Table-row\\\\\\\">\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--name\\\\\\\">{{ 'fileName' | i18n }}</th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--dateUploaded\\\\\\\">{{ 'dateUploaded' | i18n }}</th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--records\\\\\\\">{{ 'records' | i18n }}</th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--dashboardCount\\\\\\\">{{ 'dashboards' | i18n }}</th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--capacity\\\\\\\">{{ 'capacity' | i18n }}</th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--expander\\\\\\\"></th>\\\\n </tr>\\\\n <tr class=\\\\\\\"coral-Table-row\\\\\\\" ng-click=\\\\\\\"showDetails = !showDetails\\\\\\\">\\\\n <th class=\\\\\\\"coral-Table-cell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--nonheader\\\\\\\">{{ 'allData' | i18n }}</th>\\\\n <th class=\\\\\\\"coral-Table-cell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--nonheader\\\\\\\"> - </th>\\\\n <th class=\\\\\\\"coral-Table-cell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--nonheader\\\\\\\">{{ collection.rowCount | number }}</th>\\\\n <th class=\\\\\\\"coral-Table-cell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--nonheader\\\\\\\">3</th>\\\\n <th class=\\\\\\\"coral-Table-cell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--nonheader totem-AdHocTable-cell--capacity\\\\\\\">\\\\n <ad-hoc-capacity usage=\\\\\\\"{{collection.rowCount}}\\\\\\\" capacity=\\\\\\\"{{collection.maxRows}}\\\\\\\"></ad-hoc-capacity>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-cell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--nonheader totem-AdHocTable-headerCell--expander\\\\\\\">\\\\n <i class=\\\\\\\"totem-ActionButton-icon coral-Icon\\\\\\\" ng-class=\\\\\\\"{ 'coral-Icon--chevronDown': showDetails, 'coral-Icon--chevronRight': !showDetails }\\\\\\\"></i>\\\\n </th>\\\\n </tr>\\\\n </thead>\\\\n <tbody ng-show='showDetails'>\\\\n <tr class=\\\\\\\"coral-Table-row\\\\\\\" ng-repeat=\\\\\\\"upload in collection.uploads\\\\\\\">\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell totem-AdHocTable-cell--subdata\\\\\\\">{{ upload.fileName || ('unknownFileName' | i18n) }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell totem-AdHocTable-cell--subdata\\\\\\\">{{ upload.dateUploaded | date }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell totem-AdHocTable-cell--subdata\\\\\\\">{{ upload.rowCount | number }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell totem-AdHocTable-cell--subdata\\\\\\\">-</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell totem-AdHocTable-cell--subdata\\\\\\\">-</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell totem-AdHocTable-cell--subdata totem-AdHocTable-cell--deleteUpload\\\\\\\" ng-click=\\\\\\\"deleteUpload(collection, upload)\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--delete\\\\\\\"></i></td>\\\\n </tr>\\\\n </tbody>\\\\n </table>\\\\n </section>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/views/collection.tpl.html\\n ** module id = 29\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<form class=\\\\\\\"coral-Form coral-Form--vertical\\\\\\\" style=\\\\\\\"width:100%\\\\\\\">\\\\n <div class=\\\\\\\"totem-EditTitleBar coral--dark\\\\\\\">\\\\n <div class=\\\\\\\"totem-EditTitleBar-title\\\\\\\">\\\\n {{ 'validateUploadedData' | i18n }}\\\\n </div>\\\\n <div class=\\\\\\\"totem-EditTitleBar-buttons\\\\\\\">\\\\n <button class=\\\\\\\"totem-EditTitleBar-cancelButton coral-Button coral-Button--quiet\\\\\\\" ng-click=\\\\\\\"cancelUpload()\\\\\\\">{{ 'cancel' | i18n }}</button>\\\\n <button class=\\\\\\\"totem-EditTitleBar-saveButton coral-Button coral-Button--primary\\\\\\\" ng-disabled=\\\\\\\"saveDisabled\\\\\\\" ng-click=\\\\\\\"saveCollection()\\\\\\\">{{ 'save' | i18n }}</button>\\\\n </div>\\\\n </div>\\\\n</form>\\\\n<div class=\\\\\\\"u-totem-contentUnderEditTitleBar\\\\\\\">\\\\n <div class=\\\\\\\"coral-Alert coral-Alert--error\\\\\\\" ng-show=\\\\\\\"uploadError\\\\\\\">\\\\n <i class=\\\\\\\"coral-Alert-typeIcon coral-Icon coral-Icon--sizeS coral-Icon--alert\\\\\\\"></i>\\\\n <strong class=\\\\\\\"coral-Alert-title\\\\\\\">Error</strong>\\\\n <div class=\\\\\\\"coral-Alert-message\\\\\\\">{{ uploadErrorMessage }}</div>\\\\n </div>\\\\n <div class=\\\\\\\"totem-AdHocValidate-contents\\\\\\\">\\\\n <div class=\\\\\\\"totem-AdHocValidate-rowHeaderBlock\\\\\\\" >\\\\n <!-- fixed row headers -->\\\\n <div class=\\\\\\\"totem-AdHocValidate-rowDescriptor\\\\\\\">\\\\n {{ 'adHocAttributeName' | i18n }}\\\\n </div>\\\\n <div class=\\\\\\\"totem-AdHocValidate-rowDescriptor\\\\\\\">\\\\n {{ 'adHocAttributeType' | i18n }}\\\\n </div>\\\\n <div class=\\\\\\\"totem-AdHocValidate-dataSpacer\\\\\\\">\\\\n <!-- spacer -->\\\\n </div>\\\\n <div class=\\\\\\\"totem-AdHocValidate-rowDescriptor\\\\\\\">\\\\n <!-- data header -->\\\\n {{ 'sampleData' | i18n }}\\\\n </div>\\\\n </div>\\\\n <div class=\\\\\\\"totem-AdHocValidate-sampleDataContainer\\\\\\\">\\\\n <table>\\\\n <tr class=\\\\\\\"totem-AdHocValidate-nameRow\\\\\\\">\\\\n <td class=\\\\\\\"totem-AdHocValidate-metaData totem-AdHocValidate-metaData--textbox\\\\\\\" ng-repeat=\\\\\\\"(adHocColumnKey,adHocColumn) in adHocSchema\\\\\\\">\\\\n <input ng-if=\\\\\\\"schemaEditable\\\\\\\" type=\\\\\\\"text\\\\\\\" class=\\\\\\\"coral-Textfield totem-AdHocValidate-metaDataInput\\\\\\\" ng-model=\\\\\\\"adHocSchema[adHocColumnKey].prettyName\\\\\\\">\\\\n <div class=\\\\\\\"totem-AdHocValidate-metaDataInput totem-AdHocValidate-metaDataInput--noEdit\\\\\\\" ng-if=\\\\\\\"!schemaEditable\\\\\\\">{{adHocSchema[adHocColumnKey].prettyName}}</div>\\\\n </td>\\\\n </tr>\\\\n <tr>\\\\n <td class=\\\\\\\"totem-AdHocValidate-metaData totem-AdHocValidate-metaData--select\\\\\\\" ng-repeat=\\\\\\\"(adHocColumnKey,adHocColumn) in adHocSchema\\\\\\\">\\\\n <cui-select ng-if=\\\\\\\"schemaEditable\\\\\\\" class=\\\\\\\"totem-AdHocValidate-metaDataInput\\\\\\\" id='adHocTypeId' options=\\\\\\\"columnOptions\\\\\\\" label=\\\\\\\"'label'\\\\\\\" selection=\\\\\\\"selectedTypes[adHocColumnKey]\\\\\\\"></cui-select>\\\\n <div class=\\\\\\\"totem-AdHocValidate-metaDataInput totem-AdHocValidate-metaDataInput--noEdit\\\\\\\" ng-if=\\\\\\\"!schemaEditable\\\\\\\">{{selectedTypes[adHocColumnKey].label}}</div>\\\\n </td>\\\\n </tr>\\\\n <tr style=\\\\\\\"padding:0;margin:0;\\\\\\\">\\\\n <td class=\\\\\\\"totem-AdHocValidate-dataSpacer\\\\\\\" ng-repeat=\\\\\\\"adHocColumn in adHocSchema\\\\\\\"></td>\\\\n </tr>\\\\n <tr ng-repeat=\\\\\\\"dataRow in adHocData\\\\\\\">\\\\n <td class=\\\\\\\"totem-AdHocValidate-sampleData totem-AdHocValidate-sampleData--datum\\\\\\\" ng-repeat=\\\\\\\"(adHocColumnKey, adHocColumnValue) in adHocSchema\\\\\\\">{{ dataRow[adHocColumnKey] }}</td>\\\\n </tr>\\\\n </table>\\\\n </div>\\\\n </div>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/views/validate-upload.tpl.html\\n ** module id = 30\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<dashboard-rail ng-show=\\\\\\\"showRail && !editable\\\\\\\"></dashboard-rail>\\\\n<div class=\\\\\\\"totem-NonRail\\\\\\\" editable=\\\\\\\"editable\\\\\\\">\\\\n <div class=\\\\\\\"totem-EditTitleBar coral--dark\\\\\\\" ng-if=\\\\\\\"editable\\\\\\\">\\\\n <name-editor name=\\\\\\\"dashboard.name\\\\\\\"></name-editor>\\\\n <div class=\\\\\\\"totem-EditTitleBar-buttons\\\\\\\">\\\\n <button class=\\\\\\\"totem-EditTitleBar-cancelButton coral-Button coral-Button--quiet\\\\\\\" ng-click=\\\\\\\"cancelEditing()\\\\\\\">{{ 'cancel' | i18n }}</button>\\\\n <button class=\\\\\\\"totem-EditTitleBar-saveButton coral-Button coral-Button--primary\\\\\\\" ng-click=\\\\\\\"saveDashboard()\\\\\\\">{{ 'save' | i18n }}</button>\\\\n </div>\\\\n </div>\\\\n <div class=\\\\\\\"totem-ActionBar\\\\\\\">\\\\n <div class=\\\\\\\"coral-ButtonGroup\\\\\\\">\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\" ng-click=\\\\\\\"toggleRail()\\\\\\\" ng-if=\\\\\\\"!editable\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--dashboard\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ getRailToggleText(showRail) }}</span></a>\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\" ui-sref=\\\\\\\"dashboard.edit({dashboardId: dashboard._id})\\\\\\\" ng-if=\\\\\\\"!editable\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--edit\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'edit' | i18n }}</span></a>\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\" href=\\\\\\\"/dashboards/{{dashboard._id}}.pdf?hour=1\\\\\\\" download ng-if=\\\\\\\"!editable\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--download\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'download' | i18n }}</span></a>\\\\n <!--<a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\" href=\\\\\\\"/dashboards/{{dashboard._id}}.pptx?hour=1\\\\\\\" download ng-if=\\\\\\\"!editable\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--download\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">Download PPT</span></a>-->\\\\n\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\" ng-click=\\\\\\\"newInstrumentConfigVisible = true\\\\\\\" ng-show=\\\\\\\"editable\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--addCircle\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'addInstrument' | i18n }}</span></a>\\\\n </div>\\\\n </div>\\\\n <div ng-class=\\\\\\\"{'u-totem-contentUnderEditActionBar': editable, 'u-totem-contentUnderActionBar': !editable}\\\\\\\" responsive-evaluator editable=\\\\\\\"editable\\\\\\\">\\\\n <div class=\\\\\\\"totem-Measurements\\\\\\\" ng-if=\\\\\\\"editable\\\\\\\" ng-style=\\\\\\\"getMeasurementsStyle()\\\\\\\">\\\\n <ruler></ruler>\\\\n <media-definition-track></media-definition-track>\\\\n <media-definition-menu media-definitions=\\\\\\\"mediaDefinitions\\\\\\\"></media-definition-menu>\\\\n </div>\\\\n <dashboard-canvas editable=\\\\\\\"editable\\\\\\\"></dashboard-canvas>\\\\n </div>\\\\n <new-instrument-configuration ng-show=\\\\\\\"editable\\\\\\\" visible=\\\\\\\"newInstrumentConfigVisible\\\\\\\"></new-instrument-configuration>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/views/dashboard.tpl.html\\n ** module id = 31\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-EditTitleBar coral--dark\\\\\\\">\\\\n <name-editor name=\\\\\\\"instrument.title\\\\\\\"></name-editor>\\\\n <div class=\\\\\\\"totem-EditTitleBar-buttons\\\\\\\">\\\\n <button class=\\\\\\\"totem-EditTitleBar-cancelButton coral-Button coral-Button--quiet\\\\\\\" ng-click=\\\\\\\"cancel()\\\\\\\">{{ 'cancel' | i18n }}</button>\\\\n <button class=\\\\\\\"totem-EditTitleBar-saveButton coral-Button coral-Button--primary\\\\\\\" ng-click=\\\\\\\"save()\\\\\\\">{{ 'save' | i18n }}</button>\\\\n </div>\\\\n</div>\\\\n<instrument-editor-bootstrap instrument=\\\\\\\"instrument\\\\\\\"></instrument-editor-bootstrap>\\\\n\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/instrument/views/instrument.tpl.html\\n ** module id = 32\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-InstrumentCanvas totem-InstrumentCanvas--renderOnly\\\\\\\">\\\\n <div class=\\\\\\\"totem-InstrumentCanvas-content\\\\\\\">\\\\n <instrument instrument=\\\\\\\"instrument\\\\\\\" class=\\\\\\\"totem-InstrumentCanvas-instrument\\\\\\\"></instrument>\\\\n </div>\\\\n</div>\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/instrument/views/render-instrument.tpl.html\\n ** module id = 33\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.adHocManageToolbar', [\\n require('../../common/services/ad-hoc-service').name,\\n require('../../common/directives/share').name\\n ])\\n .directive('adHocManageToolbar', function(user, $state, $q, dashboardService, i18nFilter, adHocService) {\\n return {\\n restrict: 'EA',\\n scope: {\\n collections: '=',\\n selectedCollections: '='\\n },\\n template: require('./ad-hoc-manage-toolbar.tpl.html'),\\n link: function(scope, element, attrs) {\\n scope.showSearchField = false;\\n scope.leaveModalVisible = false;\\n scope.deleteModalVisible = false;\\n scope.deleteModalDescription = '';\\n\\n scope.viewCollection = function() {\\n $state.go('collection', {\\n collectionId: scope.selectedCollections[0]._id\\n });\\n };\\n\\n scope.deleteCollections = function() {\\n scope.deleteCollectionDescription = i18nFilter('deleteCollectionDescription', {\\n NUM_COLLECTIONS: scope.selectedCollections.length\\n });\\n\\n scope.deleteCollectionTitle = i18nFilter('deleteCollectionTitle', {\\n NUM_COLLECTIONS: scope.selectedCollections.length\\n });\\n\\n scope.deleteModalVisible = true;\\n };\\n\\n scope.confirmDeleteCollection = function() {\\n var promises = [];\\n var origSelectedCollections = [];\\n scope.selectedCollections.forEach(function(collection) {\\n promises.push(adHocService.deleteCollection(collection));\\n });\\n\\n $q.all(promises).then(function(collection) {\\n scope.collections.forEach(function(collection) {\\n var index = scope.selectedCollections.indexOf(collection);\\n if (index > -1) {\\n origSelectedCollections.push(collection);\\n scope.selectedCollections.splice(index, 1);\\n }\\n });\\n });\\n };\\n\\n scope.isSearchable = function() {\\n return scope.selectedCollections.length === 0;\\n };\\n\\n scope.isViewable = function() {\\n return scope.selectedCollections.length === 1;\\n };\\n\\n scope.isEditable = function() {\\n return scope.selectedDashboards.length === 1 && scope.selectedDashboards[0].isEntityAnOwner(user);\\n };\\n\\n scope.isDeletable = function() {\\n // console.log('deleteable');\\n // var owningOnly = true;\\n // for (var i = 0; i < scope.selectedCollections.length; i++) {\\n // if (!scope.selectedCollections[i].isEntityAnOwner(user)) {\\n // owningOnly = false;\\n // }\\n // }\\n // return owningOnly;\\n return true;\\n };\\n\\n scope.isShareable = function() {\\n return scope.selectedCollections.length === 1;\\n };\\n\\n scope.isDeleteViewable = function() {\\n if(scope.selectedCollections.length > 0) {\\n return true;\\n }\\n for (var i = 0; i < scope.selectedCollections.length; i++) {\\n if (scope.selectedCollections[i].isEntityAnOwner(user)) {\\n return true;\\n }\\n }\\n return false;\\n };\\n\\n scope.createCollection = function() {\\n adHocService.resetCurrentCollection();\\n $state.go('collection',{collectionId:null});\\n };\\n\\n scope.saveCollection = function(collection) {\\n adHocService.savePermissions(collection);\\n };\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/directives/ad-hoc-manage-toolbar.js\\n ** module id = 34\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.adHocSearch', [])\\n .directive('adHocSearch', function() {\\n return {\\n restrict: 'EA',\\n scope: {\\n dashboards: '='\\n },\\n template: require('./ad-hoc-search.tpl.html'),\\n link: function(scope, element, attrs) {\\n element.find('.js-coral-Autocomplete-textfield').focus();\\n element.on('change:value', function(event, payload) {\\n // TODO: Somehow change the dashboard filter.\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/directives/ad-hoc-search.js\\n ** module id = 35\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.adHocCapacity', [\\n ])\\n .directive('adHocCapacity', function() {\\n return {\\n restrict: 'E',\\n scope: {\\n capacity:'@',\\n usage:'@'\\n },\\n template: require('./ad-hoc-capacity.tpl.html'),\\n link: function (scope, element, attrs) {\\n scope.getPercent = function(precision) {\\n var percent = scope.usage / scope.capacity * 100;\\n if(percent > 100) { percent = 100; }\\n if(precision) {\\n percent = percent.toPrecision(precision);\\n } else {\\n percent = Math.round(percent);\\n }\\n return percent;\\n };\\n\\n scope.getClass = function(percent) {\\n var ret = 'totem-Capacity-barSegment--good'; // green\\n if(percent > 70) {\\n ret = 'totem-Capacity-barSegment--warn'; // yellow above 70%\\n }\\n if(percent > 90) { \\n ret = 'totem-Capacity-barSegment--danger'; // red above 90%\\n }\\n return ret;\\n };\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/directives/ad-hoc-capacity.js\\n ** module id = 36\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.dataUpload', [\\n require('./ad-hoc-file-upload').name\\n ])\\n .directive('adHocDataUpload', function() {\\n return {\\n restrict: 'E',\\n template: require('./ad-hoc-data-upload.tpl.html'),\\n scope: {\\n collection:'=',\\n uploadFileName:'=',\\n saveDisabled:'='\\n }\\n };\\n});\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/directives/ad-hoc-data-upload.js\\n ** module id = 37\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.dashboardCanvas', [\\n require('../../common/directives/draggable').name,\\n require('../../common/directives/resizeable').name,\\n require('../../common/directives/tap').name,\\n require('../../common/services/dashboard-workspace').name,\\n require('../../instrument/services/instrument-event-bus').name\\n ])\\n .directive('dashboardCanvas', function(gridSpacing, eventBus, dashboardWorkspaceService, instrumentEventBus, minInstrumentWidth, minInstrumentHeight) {\\n return {\\n restrict: 'AE',\\n scope: {\\n editable: '='\\n },\\n template: require('./dashboard-canvas.tpl.html'),\\n link: function(scope, element, attrs) {\\n /**\\n * Cached map where the key is the instrument ID and the value is the corresponding media layout.\\n * This is for optimization.\\n */\\n var mediaLayoutByInstrumentId;\\n\\n scope.getGridStyle = function() {\\n if (dashboardWorkspaceService.mediaDefinition && dashboardWorkspaceService.mediaLayouts) {\\n var gridHeight;\\n\\n if (dashboardWorkspaceService.mediaLayouts.length) {\\n // Set the grid height to accommodate down to the bottom of the lowest media layout.\\n var maxY = 0;\\n\\n dashboardWorkspaceService.mediaLayouts.forEach(function(mediaLayout) {\\n maxY = Math.max(maxY, mediaLayout.y + mediaLayout.height);\\n });\\n\\n gridHeight = (maxY + 1) * gridSpacing; // + 1 just to give an arbitrary little gap at the bottom\\n } else {\\n gridHeight = 400;\\n }\\n\\n return {\\n 'background-size': gridSpacing + 'px ' + gridSpacing + 'px',\\n width: dashboardWorkspaceService.mediaDefinition.width,\\n height: gridHeight\\n };\\n }\\n return null;\\n };\\n\\n scope.getInstrumentStyle = function(instrument) {\\n var mediaLayout = mediaLayoutByInstrumentId[instrument._id];\\n if (mediaLayout) {\\n return {\\n left: mediaLayout.x * gridSpacing,\\n top: mediaLayout.y * gridSpacing,\\n width: mediaLayout.width * gridSpacing,\\n height: mediaLayout.height * gridSpacing\\n };\\n } else {\\n return {\\n visible: false\\n };\\n }\\n };\\n\\n scope.constrainDrag = function(rect) {\\n var container = element.find('.totem-DashboardCanvas');\\n var width = container.innerWidth();\\n var height = container.innerHeight();\\n\\n // Constrain to the bounds of the dashboard.\\n rect.x = Math.min(Math.max(0, rect.x), width - rect.width);\\n rect.y = Math.min(Math.max(0, rect.y), height - rect.height);\\n\\n // Adjust to grid\\n rect.x -= (rect.x % gridSpacing);\\n rect.y -= (rect.y % gridSpacing);\\n\\n return rect;\\n };\\n\\n scope.constrainResize = function(rect, origRect) {\\n var container = element.find('.totem-DashboardCanvas');\\n var containerRect = {\\n width: container.innerWidth(),\\n height: container.innerHeight(),\\n x: container.position().left,\\n y: container.position().top\\n };\\n\\n // Enforce minimum dimensions\\n rect.width = Math.max(minInstrumentWidth, rect.width);\\n rect.height = Math.max(minInstrumentWidth, rect.height);\\n if(rect.width == minInstrumentWidth) {\\n rect.x = Math.min(origRect.x + (origRect.width - rect.width), rect.x);\\n }\\n\\n // Forbid escaping the container\\n if(rect.x + rect.width > containerRect.width) {\\n rect.width = containerRect.width - rect.x;\\n }\\n if(rect.x <= 0) {\\n rect.x = 0;\\n rect.width = origRect.x + origRect.width;\\n }\\n\\n // Adjust to grid\\n rect.height -= (rect.height % gridSpacing);\\n rect.x -= (rect.x % gridSpacing);\\n if(rect.width % gridSpacing !== 0) {\\n rect.width += gridSpacing - (rect.width % gridSpacing);\\n }\\n\\n return rect;\\n };\\n\\n scope.bringToFront = function(instrument) {\\n if (!scope.editable) {\\n return;\\n }\\n\\n dashboardWorkspaceService.dashboard.bringInstrumentToFront(\\n instrument, dashboardWorkspaceService.mediaDefinition);\\n };\\n\\n var commitRect = function(instrument, rect) {\\n var mediaLayout = mediaLayoutByInstrumentId[instrument._id];\\n mediaLayout.width = rect.width / gridSpacing;\\n mediaLayout.height = rect.height / gridSpacing;\\n mediaLayout.x = rect.x / gridSpacing;\\n mediaLayout.y = rect.y / gridSpacing;\\n };\\n\\n scope.dragContinue = scope.dragComplete = commitRect;\\n\\n scope.resizeBegin = function(instrument) {\\n instrumentEventBus.publish({\\n topic: 'resizing',\\n to: instrument._id\\n });\\n };\\n\\n scope.resizeContinue = commitRect;\\n\\n scope.resizeComplete = function(instrument, rect) {\\n instrumentEventBus.publish({\\n topic: 'resized',\\n to: instrument._id\\n });\\n commitRect(instrument, rect);\\n };\\n\\n scope.$watchGroup([\\n function() { return dashboardWorkspaceService.instruments; },\\n function() { return dashboardWorkspaceService.mediaLayouts; }\\n ], function(newValues) {\\n var instruments = newValues[0];\\n var mediaLayouts = newValues[1];\\n if (instruments && mediaLayouts) {\\n mediaLayoutByInstrumentId = {};\\n instruments.forEach(function(instrument) {\\n mediaLayouts.forEach(function(mediaLayout) {\\n if (mediaLayout.instrumentId === instrument._id) {\\n mediaLayoutByInstrumentId[instrument._id] = mediaLayout;\\n return false;\\n }\\n });\\n });\\n\\n scope.instruments = instruments;\\n }\\n });\\n\\n // Watch for z-index changes within the media layout models. When we see a change, sort the instruments\\n // based on their z-index.\\n scope.$watch(function() {\\n if (dashboardWorkspaceService.mediaLayouts) {\\n var zIndexHash = '';\\n\\n var mediaLayouts = dashboardWorkspaceService.mediaLayouts;\\n for (var i = 0; i < mediaLayouts.length; i++) {\\n var mediaLayout = mediaLayouts[i];\\n // I know this looks like a hack but it's the most performant way I can think of for detecting when\\n // z-index changes on any of the active media layouts. If you can think of a better way, please feel free\\n // to change. While we could deep watch the media layouts, a change to x, y, width, or height on the\\n // media layout would trigger the watcher. While we could create an array of z-index values from the\\n // media layouts, would would have to deep compare the array. Creating this hash seems more\\n // efficient because no deep watch is necessary.\\n\\n // Media layout ID needs to be included in the hash to support the case where a user changes\\n // media definitions and the media layouts for the new media definition contain the same z-index values\\n // in the same order as the media layouts of the previous media definition. In this case we still need to\\n // execute the instrument reordering process.\\n zIndexHash += mediaLayout._id + ':' + mediaLayout.zIndex + ',';\\n }\\n\\n return zIndexHash;\\n }\\n }, function() {\\n if (scope.instruments && dashboardWorkspaceService.mediaLayouts) {\\n sortInstrumentsByZIndex(scope.instruments, dashboardWorkspaceService.mediaLayouts);\\n }\\n });\\n\\n /**\\n * Sorts instruments by the z-index of their respective media layouts.\\n *\\n * This is used for ordering instruments on screen such that they are properly stacked in the z dimension\\n * using DOM element ordering rather than CSS z-index. We prefer element ordering over CSS z-index in order to\\n * avoid conflicting with the z-index of surrounding components in the application.\\n *\\n * @param instruments\\n * @param mediaLayouts\\n * @returns {*}\\n */\\n var sortInstrumentsByZIndex = function(instruments, mediaLayouts) {\\n instruments.sort(function(instrumentA, instrumentB) {\\n var mediaLayoutA = mediaLayoutByInstrumentId[instrumentA._id];\\n var mediaLayoutB = mediaLayoutByInstrumentId[instrumentB._id];\\n if (mediaLayoutA && mediaLayoutB) {\\n if (mediaLayoutA.zIndex === undefined) {\\n return -1;\\n } else if (mediaLayoutB.zIndex === undefined) {\\n return 1;\\n } else {\\n return mediaLayoutA.zIndex - mediaLayoutB.zIndex;\\n }\\n }\\n });\\n\\n return instruments;\\n };\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/dashboard-canvas.js\\n ** module id = 38\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.dashboardRail', [\\n ])\\n .directive('dashboardRail', function(dashboardService, dashboardWorkspaceService) {\\n return {\\n restrict: 'AE',\\n template: require('./dashboard-rail.tpl.html'),\\n link: function(scope, element, attrs) {\\n dashboardService.query().then(function(dashboards) {\\n scope.dashboards = dashboards;\\n });\\n\\n scope.isActiveDashboard = function(dashboard) {\\n return dashboardWorkspaceService.dashboard && dashboardWorkspaceService.dashboard._id === dashboard._id;\\n };\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/dashboard-rail.js\\n ** module id = 39\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.responsiveEvaluator', [\\n require('../services/event-bus').name,\\n require('../../common/services/debounce').name,\\n require('../../common/services/dashboard-workspace').name\\n ])\\n .directive('responsiveEvaluator', function($timeout, $window, dashboardWorkspaceService, eventBus, debounce) {\\n return {\\n scope: {\\n editable: '='\\n },\\n link: function(scope, element, attrs) {\\n var debouncedWindowResize = debounce(function() {\\n scope.$apply(function() {\\n findBestFitMediaDefinition();\\n });\\n }, 30);\\n\\n var findBestFitMediaDefinition = function() {\\n if (!dashboardWorkspaceService.dashboard) {\\n return;\\n }\\n\\n var bestFit, smallestFit,\\n width = element.innerWidth();\\n\\n dashboardWorkspaceService.dashboard.mediaDefinitions.forEach(function(definition) {\\n if (definition.width < width && (!bestFit || definition.width > bestFit.width)) {\\n bestFit = definition;\\n }\\n if (!smallestFit || definition.width < smallestFit.width) {\\n smallestFit = definition;\\n }\\n });\\n\\n if(!bestFit) {\\n bestFit = smallestFit;\\n }\\n\\n // Let's say the best fit media definition is 1000px wide and the width allotted for the dashboard\\n // (derived from the container width) is 1000px. The dashboard would fit nicely. However, say that dashboard\\n // is long enough that it requires vertical scrolling. When the vertical scrollbar shows up, a horizontal\\n // scrollbar shows up as well because the content is now too wide for the container width minus\\n // the vertical scrollbar width. This is a sketchy situation. Do we bump the dashboard down to the next\\n // smallest media definition (we could calculate whether a vertical scrollbar will show up beforehand by\\n // comparing the container height with positions and heights of media layouts)? Do we show leave the\\n // horizontal scrollbar? Do we hide the horizontal scrollbar and let the vertical scrollbar just cover a bit\\n // of the dashboard? We've decided to take the last approach. However, if the active media definition is the\\n // smallest media definition, we set the horizontal scrollbar to auto since the user may legitimately need to\\n // scroll horizontally to see all the dashboard content. This is definitely subject to change.\\n if (smallestFit === bestFit) {\\n element.css('overflow-x', 'auto');\\n } else {\\n element.css('overflow-x', 'hidden');\\n }\\n\\n dashboardWorkspaceService.mediaDefinition = bestFit;\\n };\\n\\n eventBus.subscribe('resetActiveMediaDefinition', function() {\\n // http://stackoverflow.com/questions/25330149/why-is-the-asyncqueue-processed-before-watchers/25330696\\n scope.$$postDigest(function() {\\n scope.$apply(findBestFitMediaDefinition);\\n });\\n });\\n\\n scope.$watch(function() {\\n return dashboardWorkspaceService.dashboard;\\n }, function() {\\n findBestFitMediaDefinition();\\n });\\n\\n scope.$watch('editable', function(editable) {\\n if (editable) {\\n angular.element($window).off('resize.mediaDefinition');\\n } else {\\n angular.element($window).on('resize.mediaDefinition', debouncedWindowResize);\\n\\n // When the user navigates from editing a dashboard to viewing a dashboard, we want make sure we're showing\\n // the best fit media definition rather than the last media definition the user was editing.\\n findBestFitMediaDefinition();\\n }\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/responsive-evaluator.js\\n ** module id = 40\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.dashboardInstrumentChrome', [\\n require('../services/event-bus').name\\n ])\\n .directive('dashboardInstrumentChrome', function(eventBus, $stateParams, $state, dashboardWorkspaceService) {\\n return {\\n restrict: 'AE',\\n scope: {\\n editable: '=',\\n instrument: '='\\n },\\n transclude: true,\\n template: require('./dashboard-instrument-chrome.tpl.html'),\\n link: function(scope, element, attrs) {\\n scope.editInstrument = function() {\\n $state.go('instrument.edit', {\\n dashboardId: $stateParams.dashboardId,\\n instrumentId: scope.instrument._id\\n });\\n };\\n\\n scope.removeInstrument = function() {\\n dashboardWorkspaceService.dashboard.removeInstrument(scope.instrument);\\n };\\n\\n scope.duplicateInstrument = function($event) {\\n // Normally something higher in the DOM would see the click and force this instrument to be on top of other\\n // instruments. If we were to let this happen during instrument duplication, it would be forced to be on top\\n // of the new duplicate. We want the duplicate to be on top.\\n $event.stopPropagation();\\n dashboardWorkspaceService.dashboard.duplicateInstrument(scope.instrument,\\n dashboardWorkspaceService.mediaDefinition);\\n };\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/dashboard-instrument-chrome.js\\n ** module id = 41\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.mediaDefinitionTrack', [\\n require('./media-definition-range').name,\\n require('./media-definition-rename-popover').name,\\n require('./media-definition-delete-popover').name,\\n require('../services/event-bus').name,\\n require('../../common/services/uuid').name,\\n require('../../common/services/dashboard-workspace').name,\\n require('../../instrument/services/instrument-event-bus').name\\n ])\\n .directive('mediaDefinitionTrack', function(eventBus, uuid, dashboardWorkspaceService, instrumentEventBus, $timeout,\\n gridSpacing, minMediaDefinitionWidth) {\\n\\n return {\\n restrict: 'AE',\\n scope: true,\\n replace: true,\\n template: require('./media-definition-track.tpl.html'),\\n link: function(scope, element, attrs) {\\n // TODO: Do this in a more Angular way?\\n var getThumbByMediaDefinition = function(mediaDefinition) {\\n var thumbs = element.find('.totem-MediaDefinitionThumb').toArray();\\n for (var i = 0; i < thumbs.length; i++) {\\n var thumb = $(thumbs[i]);\\n if (thumb.scope().mediaDefinition == mediaDefinition) {\\n return thumb;\\n }\\n }\\n };\\n\\n scope.$watch(function() {\\n return dashboardWorkspaceService.dashboard;\\n }, function(dashboard) {\\n if (dashboard) {\\n scope.mediaDefinitions = dashboard.mediaDefinitions;\\n }\\n });\\n\\n scope.$watch(function() {\\n return dashboardWorkspaceService.mediaDefinition;\\n }, function(mediaDefinition) {\\n scope.activeMediaDefinition = mediaDefinition;\\n });\\n\\n scope.getRangeStyle = function(mediaDefinition) {\\n // Potential optimization point since we're sorting media definitions each time this is called (once for\\n // every media definition).\\n var mediaDefinitions = dashboardWorkspaceService.dashboard.sortMediaDefinitions();\\n var index = mediaDefinitions.indexOf(mediaDefinition);\\n if (index > 0) {\\n var previousMediaDefinition = mediaDefinitions[index - 1];\\n return {\\n left: previousMediaDefinition.width,\\n width: mediaDefinition.width - previousMediaDefinition.width\\n };\\n } else {\\n return {\\n left: 0,\\n width: mediaDefinition.width\\n };\\n }\\n };\\n\\n scope.activateMediaDefinition = function(mediaDefinition) {\\n dashboardWorkspaceService.mediaDefinition = mediaDefinition;\\n };\\n\\n scope.getThumbStyle = function(mediaDefinition) {\\n var style = {\\n left: mediaDefinition.width\\n };\\n return style;\\n };\\n\\n ///////////////////////////\\n // Thumb dragging\\n ///////////////////////////\\n\\n scope.constrainThumbDrag = function(rect) {\\n rect.y = 0;\\n rect.x = Math.min(Math.max(minMediaDefinitionWidth, rect.x), element.width());\\n rect.x -= rect.x % gridSpacing; // Snap to grid\\n return rect;\\n };\\n\\n // Media layouts pertaining to the media definition thumb being dragged.\\n var mediaLayoutsDrag,\\n // Copies of the media layouts pertaining to the media definition thumb being dragged. These contain the state\\n // as it was when the drag started.\\n mediaLayoutCopiesDragBegin,\\n // The width of the media definition being dragged as it was when the drag started.\\n mediaDefinitionWidthDragBegin;\\n\\n scope.thumbDragBegin = function(mediaDefinition) {\\n if (mediaDefinition === dashboardWorkspaceService.mediaDefinition) {\\n instrumentEventBus.publish({\\n topic: 'resizing'\\n });\\n }\\n mediaLayoutsDrag = dashboardWorkspaceService.dashboard.getMediaLayoutsForMediaDefinition(mediaDefinition);\\n mediaLayoutCopiesDragBegin = angular.copy(mediaLayoutsDrag);\\n mediaDefinitionWidthDragBegin = mediaDefinition.width;\\n };\\n\\n scope.thumbDragContinue = function(mediaDefinition, rect) {\\n mediaDefinition.width = rect.x;\\n\\n // If the name is in the format #px (which is default) then automatically update\\n // the name to match the new width.\\n if (/^\\\\d+px$/g.test(mediaDefinition.name)) {\\n mediaDefinition.name = rect.x + 'px';\\n }\\n\\n dashboardWorkspaceService.dashboard.resampleMediaLayouts(\\n mediaLayoutCopiesDragBegin,\\n mediaLayoutsDrag,\\n mediaDefinitionWidthDragBegin,\\n mediaDefinition.width);\\n };\\n\\n scope.thumbDragComplete = function(mediaDefinition) {\\n if (mediaDefinition === dashboardWorkspaceService.mediaDefinition) {\\n instrumentEventBus.publish({\\n topic: 'resized'\\n });\\n }\\n };\\n\\n ///////////////////////////\\n // Popover handling\\n ///////////////////////////\\n\\n // Unfortunately this has to be an object instead of a simple boolean in order to allow the popover directive to\\n // set the boolean and be able to see the change from within this directive. This is due to how scopes use\\n // prototypal inheritance to \\\"shadow\\\" the parent scope.\\n // Sound mysterious? See https://github.com/angular/angular.js/wiki/Understanding-Scopes for an explanation.\\n scope.renamePopoverVisibility = { visible: false };\\n scope.createPopoverVisibility = { visible: false };\\n scope.deletePopoverVisibility = { visible: false };\\n\\n var showPopover = function(mediaDefinition, popoverVisibilityName) {\\n var scrollParent = element.scrollParent(),\\n scrollParentWidth = scrollParent.width(),\\n thumbBuffer = 50; // Make sure the thumb is this many pixels away from the side of the scrollable container\\n\\n scope.popoverThumb = getThumbByMediaDefinition(mediaDefinition);\\n scope.popoverMediaDefinition = mediaDefinition;\\n\\n // Make sure the media definition thumb is visible before showing the popover.\\n var newScrollLeft;\\n\\n if (mediaDefinition.width < scrollParent[0].scrollLeft + thumbBuffer) {\\n newScrollLeft = mediaDefinition.width - thumbBuffer;\\n } else if (mediaDefinition.width > scrollParent[0].scrollLeft + scrollParentWidth - thumbBuffer) {\\n newScrollLeft = mediaDefinition.width + thumbBuffer - scrollParentWidth;\\n }\\n\\n var makeVisible = function() {\\n scope[popoverVisibilityName].visible = true;\\n };\\n\\n if (newScrollLeft !== undefined) {\\n scrollParent.animate({\\n scrollLeft: newScrollLeft\\n }, {\\n duration: 300,\\n done: function() {\\n scope.$apply(makeVisible);\\n }\\n });\\n } else {\\n makeVisible();\\n }\\n };\\n\\n eventBus.subscribe('renameMediaDefinition', function(mediaDefinition) {\\n showPopover(mediaDefinition, 'renamePopoverVisibility');\\n }, scope);\\n\\n eventBus.subscribe('addMediaDefinition', function() {\\n var previousMediaDefinition = dashboardWorkspaceService.mediaDefinition;\\n var newMediaDefinition = dashboardWorkspaceService.dashboard.createMediaDefinition(previousMediaDefinition);\\n dashboardWorkspaceService.mediaDefinition = newMediaDefinition;\\n\\n scope.cancelCreate = function() {\\n dashboardWorkspaceService.mediaDefinition = previousMediaDefinition;\\n dashboardWorkspaceService.dashboard.removeMediaDefinition(newMediaDefinition);\\n };\\n\\n // We have to wait for the thumb for the new media definition to be created before we can show\\n // the popover at its position.\\n $timeout(function() {\\n showPopover(newMediaDefinition, 'createPopoverVisibility');\\n });\\n }, scope);\\n\\n eventBus.subscribe('deleteMediaDefinition', function(mediaDefinition) {\\n showPopover(mediaDefinition, 'deletePopoverVisibility');\\n }, scope);\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/media-definition-track.js\\n ** module id = 42\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.mediaDefinitionMenu', [\\n require('../services/event-bus').name,\\n require('../../common/services/dashboard-workspace').name\\n ])\\n .directive('mediaDefinitionMenu', function(eventBus, dashboardWorkspaceService) {\\n return {\\n restrict: 'AE',\\n template: require('./media-definition-menu.tpl.html'),\\n scope: true,\\n link: function(scope, element, attrs) {\\n var popover;\\n\\n scope.togglePopover = function($event) {\\n var popoverElement = $('.totem-MediaDefinitionMenu-popover');\\n popover = popoverElement.data('popover');\\n if (!popover) {\\n popover = new CUI.Popover({\\n element: popoverElement,\\n pointAt: $event.currentTarget,\\n alignFrom: 'right'\\n });\\n }\\n popover.toggleVisibility();\\n };\\n\\n scope.rowChildMouseenter = scope.rowChildFocus = function(event) {\\n $(event.currentTarget.parentNode).addClass('is-highlighted');\\n };\\n\\n scope.rowChildMouseleave = scope.rowChildBlur = function(event) {\\n var parent = $(event.currentTarget.parentNode);\\n if (!parent.children(':focus').length) {\\n parent.removeClass('is-highlighted');\\n }\\n };\\n\\n scope.activateMediaDefinition = function(mediaDefinition) {\\n popover.hide();\\n dashboardWorkspaceService.mediaDefinition = mediaDefinition;\\n };\\n\\n scope.editMediaDefinition = function(mediaDefinition) {\\n popover.hide();\\n eventBus.publish('renameMediaDefinition', mediaDefinition);\\n };\\n\\n scope.deleteMediaDefinition = function(mediaDefinition) {\\n popover.hide();\\n eventBus.publish('deleteMediaDefinition', mediaDefinition);\\n };\\n\\n scope.addMediaDefinition = function() {\\n popover.hide();\\n eventBus.publish('addMediaDefinition');\\n };\\n\\n scope.$watch(function() {\\n return dashboardWorkspaceService.dashboard;\\n }, function(dashboard) {\\n if (dashboard) {\\n scope.mediaDefinitions = dashboard.mediaDefinitions;\\n }\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/media-definition-menu.js\\n ** module id = 43\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.ruler', [])\\n .directive('ruler', function() {\\n return {\\n restrict: 'AE',\\n link: function(scope, element, attrs) {\\n var tickWidth = 50;\\n\\n // How many labels should we make? Well, we could make as many as fill the width of the element,\\n // but what happens when the user makes the window larger? We could watch for window resize events\\n // and generate more. But what happens when the ruler container gets larger without the window resizing\\n // (like if a side panel gets hidden)? Rather than deal with the fringe cases, we'll go with a width which\\n // covers most resolutions or the width of the element, whichever is larger.\\n var maxWidth = Math.max(2700, element.width());\\n\\n element.addClass('totem-Ruler');\\n\\n var numLabels = Math.ceil(maxWidth / 50);\\n var label;\\n\\n for (var i = 0; i < numLabels; i++) {\\n label = angular.element('<span class=\\\"totem-Ruler-label\\\">' + (i * tickWidth) + '</span>');\\n label.css({\\n position: 'absolute',\\n top: -1,\\n left: (i * tickWidth) + 3\\n });\\n element.append(label);\\n }\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/ruler.js\\n ** module id = 44\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.instrument', [\\n require('../services/instrument-event-bus').name\\n ])\\n .directive('instrument', function(eventBus, instrumentEventBus, $compile, $q) {\\n return {\\n restrict: 'E',\\n scope: {\\n instrument: '='\\n },\\n template: require('./instrument.tpl.html'),\\n replace: true,\\n link: function(scope, element, attrs) {\\n var rendererScope;\\n\\n var content = element.find('.js-totem-DashboardInstrument-render');\\n\\n scope.showProgress = false;\\n scope.showFailure = false;\\n\\n var digestConfigChangedHandler = function() {\\n if (scope.instrument) {\\n rendererScope.config = scope.instrument.config;\\n }\\n };\\n\\n var processingHandler = function() {\\n scope.showProgress = true;\\n\\n // Assume that if there was a previous failure and the instrument is processing again\\n // that we should pull it out of a failure state.\\n scope.showFailure = false;\\n };\\n\\n var processedHandler = function() {\\n scope.showProgress = false;\\n };\\n\\n var failedHandler = function() {\\n scope.showFailure = true;\\n };\\n\\n var instrumentBus;\\n\\n scope.$watch('instrument', function(instrument) {\\n if (instrumentBus) {\\n instrumentBus.unsubscribeAll();\\n }\\n\\n if (instrument && instrument.type) {\\n instrumentEventBus.subscribe({\\n topic: 'configChanged',\\n fromPublisher: instrument._id,\\n handler: digestConfigChangedHandler\\n }, scope);\\n\\n instrumentEventBus.subscribe({\\n topic: 'processing',\\n fromPublisher: instrument._id,\\n handler: processingHandler\\n }, scope);\\n\\n instrumentEventBus.subscribe({\\n topic: 'processed',\\n fromPublisher: instrument._id,\\n handler: processedHandler\\n }, scope);\\n\\n instrumentEventBus.subscribe({\\n topic: 'failed',\\n fromPublisher: instrument._id,\\n handler: failedHandler\\n }, scope);\\n\\n var rendererFactory = require('../../../instruments/' + instrument.type + '/renderer/renderer');\\n\\n if (rendererScope) {\\n rendererScope.$destroy();\\n }\\n\\n var bus = instrumentEventBus.getInstrumentScopedInterface(instrument._id);\\n\\n var renderer = rendererFactory(instrument.config, bus);\\n\\n content.empty().append(renderer);\\n\\n // Allow instrument renderer to use AngularJS\\n rendererScope = scope.$new(true);\\n rendererScope.config = instrument.config;\\n rendererScope.eventBus = bus;\\n $compile(content.contents())(rendererScope);\\n }\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/instrument/directives/instrument.js\\n ** module id = 45\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nvar dashboardUtil = require('../../../../common/dashboard-util.js');\\n\\nmodule.exports = angular.module('totem.newInstrumentConfiguration', [\\n require('../../common/services/dashboard-workspace').name\\n ])\\n .directive('newInstrumentConfiguration', function($state, uuid, dashboardWorkspaceService, gridSpacing) {\\n return {\\n restrict: 'AE',\\n scope: {\\n visible: '='\\n },\\n template: require('./new-instrument-configuration.tpl.html'),\\n link: function(scope, element, attrs) {\\n\\n /**\\n * Creates a new instrument and media layouts across all pages and media definitions. The instrument will be\\n * placed at the lowest y position available on a given media definition.\\n * @param {String} type The type of instrument we are creating\\n */\\n scope.addInstrument = function(type) {\\n var dashboard = dashboardWorkspaceService.dashboard;\\n var newInstrument = {\\n _id: uuid(),\\n title: 'New Instrument',\\n type: type\\n };\\n\\n dashboard.instruments.push(newInstrument);\\n dashboardUtil.insertInstrumentAtLayoutBottom(newInstrument, dashboard, gridSpacing, uuid);\\n\\n // TODO: Need to set timeout because the modal will not clear the backdrop if we immediately\\n // navigate to a new page. Setting a timeout allows the modal to clear the backdrop before we\\n // navigate away.\\n setTimeout(function() {\\n $state.go('instrument.edit', {\\n dashboardId: dashboard._id,\\n instrumentId: newInstrument._id\\n });\\n }, 0);\\n };\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/instrument/directives/new-instrument-configuration.js\\n ** module id = 46\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.instrumentEditorBootstrap', [\\n require('../services/instrument-event-bus').name,\\n 'totem.dv.editor'\\n ])\\n .directive('instrumentEditorBootstrap', function(instrumentEventBus, $compile, $q) {\\n return {\\n restrict: 'E',\\n scope: {\\n instrument: '='\\n },\\n link: function(scope, element, attrs) {\\n var rendererScope, editorScope;\\n\\n var destroyScopes = function() {\\n if (rendererScope) {\\n rendererScope.$destroy();\\n }\\n\\n if (editorScope) {\\n editorScope.$destroy();\\n }\\n };\\n\\n var init = function() {\\n destroyScopes();\\n\\n if (scope.instrument && scope.instrument.type) {\\n var editorFactory = require('../../../instruments/' + scope.instrument.type + '/editor/editor');\\n\\n var eventBus = instrumentEventBus.getInstrumentScopedInterface(scope.instrument._id);\\n\\n rendererScope = scope.$new(true);\\n rendererScope.instrument = scope.instrument;\\n var renderer = $compile('<instrument instrument=\\\"instrument\\\"></instrument>')(rendererScope);\\n\\n var editor = editorFactory(renderer, scope.instrument.config, eventBus);\\n element.empty().append(editor);\\n\\n // Allow instrument editor to use AngularJS\\n editorScope = scope.$new(true);\\n editorScope.instrument = scope.instrument;\\n editorScope.eventBus = eventBus;\\n\\n $compile(editor)(editorScope);\\n }\\n };\\n\\n scope.$watch('instrument', init);\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/instrument/directives/instrument-editor-bootstrap.js\\n ** module id = 47\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.eventBus', [])\\n .factory('eventBus', function($rootScope) {\\n return {\\n publish: function() {\\n $rootScope.$emit.apply($rootScope, arguments);\\n },\\n subscribe: function(event, callback, scope) {\\n var unbind = $rootScope.$on(event, function() {\\n callback.apply(null, Array.prototype.slice.call(arguments, 1));\\n });\\n if (scope) {\\n scope.$on('$destroy', unbind);\\n }\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/services/event-bus.js\\n ** module id = 48\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.instrumentEventBus', [])\\n .factory('instrumentEventBus', function($timeout) {\\n var subscriptionsByTopic = {};\\n\\n var bus = {};\\n\\n /**\\n * Publish a message to the event bus.\\n * @param {Object} envelope\\n * @param {String} envelope.topic The message topic.\\n * @param {String|Number} [envelope.from] The identifier of the sender. This can be used by a subscriber to filter\\n * messages by sender.\\n * @param {String|Number} [envelope.to] The identifier for the intended recipient. If excluded, the message will\\n * be sent to all topic subscribers (assuming the message is not filtered via \\\"from\\\").\\n * @param {*} [envelope.data] Any data payload to send to the subscriber.\\n */\\n bus.publish = function(envelope) {\\n // Force asynchronicity and a digest cycle. Not necessary but helpful to ensure a digest cycle happens and\\n // make everything consistently asynchronous.\\n $timeout(function() {\\n var subscriptions = subscriptionsByTopic[envelope.topic];\\n\\n if (subscriptions) {\\n for (var i = 0; i < subscriptions.length; i++) {\\n var subscription = subscriptions[i];\\n\\n // if (the subscriber doesn't care who the message is from or the message is from the desired publisher)\\n // AND (the message isn't addressed to any particular subscriber or it's addressed to this subscriber)\\n // ...then deliver the message.\\n if ((!subscription.fromPublisher || subscription.fromPublisher === envelope.from) &&\\n (!envelope.to || subscription.subscriberId === envelope.to)) {\\n subscription.handler(envelope.data);\\n }\\n }\\n }\\n });\\n };\\n\\n /**\\n * Subscribe to the event bus.\\n * @param {Object} subscription\\n * @param {String} subscription.topic The topic to subscribe to.\\n * @param {Function} subscription.handler The handling function for the message. This function will be passed any\\n * data specified on the message envelope's data attribute.\\n * @param {String|Number} [subscription.subscriberId] The subscriber's identifier. This can be used by the publisher\\n * to send messages to a specific subscriber.\\n * @param {String|Number} [subscription.fromPublisher] If specified, the subscriber will only be delivered messages that\\n * contain a from attribute with a value that matches.\\n * @param {Object} [scope] The AngularJS scope related to the subscriber. If passed, the subscriber will be\\n * automatically unsubscribed when the scope is destroyed. Useful for memory cleanup.\\n * @returns {Function} A function which, when called, will unsubscribe the subscriber.\\n */\\n bus.subscribe = function(subscription, scope) {\\n var subscriptions = subscriptionsByTopic[subscription.topic];\\n\\n if (!subscriptions) {\\n subscriptions = subscriptionsByTopic[subscription.topic] = [];\\n }\\n\\n subscriptions.push(subscription);\\n\\n var unsubscribeHandle = function() {\\n bus.unsubscribe(subscription);\\n };\\n\\n if (scope) {\\n scope.$on('$destroy', unsubscribeHandle);\\n }\\n\\n return unsubscribeHandle;\\n };\\n\\n /**\\n * Unsubscribe a subscription.\\n * @param {Object} subscription The subscription object that was used during subscription.\\n */\\n bus.unsubscribe = function(subscription) {\\n var subscriptions = subscriptionsByTopic[subscription.topic];\\n if (subscriptions) {\\n var index = subscriptions.indexOf(subscription);\\n if (index > -1) {\\n subscriptions.splice(index, 1);\\n }\\n }\\n };\\n\\n /**\\n * Returns a simplified API instruments can use for publishing and subscribing. This allows the user of the API\\n * to be blissfully unaware of the instrument's ID or the enveloping mechanism used within the instrument event bus.\\n * @param {String|Number} instrumentId\\n * @returns {{publish: Function, subscribe: Function}}\\n */\\n bus.getInstrumentScopedInterface = function(instrumentId) {\\n return {\\n publish: function(topic, data) {\\n bus.publish({\\n from: instrumentId,\\n topic: topic,\\n data: data\\n });\\n },\\n subscribe: function(topic, handler) {\\n return bus.subscribe({\\n subscriberId: instrumentId,\\n topic: topic,\\n handler: handler\\n });\\n }\\n };\\n };\\n\\n return bus;\\n })\\n;\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/instrument/services/instrument-event-bus.js\\n ** module id = 49\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div ui-view class=\\\\\\\"totem-View\\\\\\\"></div>\\\\n<alert></alert>\\\\n<modal-progress-indicator></modal-progress-indicator>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/app.tpl.html\\n ** module id = 50\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.uuid', [])\\n .constant('uuid', function() {\\n /* jshint bitwise:false */\\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript\\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\\n var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);\\n return v.toString(16);\\n });\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/uuid.js\\n ** module id = 51\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.dashboardMixin', [\\n require('./participable-mixin').name,\\n require('./tag-enum').name,\\n require('./uuid').name\\n])\\n .factory('dashboardMixin', function(participableMixin, tagEnum, uuid, gridSpacing, duplicateInstrumentOffset, minMediaDefinitionWidth) {\\n /**\\n * Methods to be used on dashboard objects. While we could make a Dashboard class, it doesn't give offer much and\\n * brings with it other hassles.\\n */\\n var objectMethods = {\\n isFullDashboard: function() {\\n return this.hasOwnProperty('instruments');\\n },\\n removeInstrument: function(instrument) {\\n if (this.instruments) {\\n var index = this.instruments.indexOf(instrument);\\n if (index > -1) {\\n this.instruments.splice(index, 1);\\n }\\n }\\n\\n if (this.mediaLayouts) {\\n var i = this.mediaLayouts.length;\\n while (i--) {\\n if (this.mediaLayouts[i].instrumentId === instrument._id) {\\n this.mediaLayouts.splice(i, 1);\\n }\\n }\\n }\\n },\\n getFavoriteTag: function() {\\n if (this.tags) {\\n for (var i = 0; i < this.tags.length; i++) {\\n var tag = this.tags[i];\\n if (tag.tag === tagEnum.FAVORITE) {\\n return tag;\\n }\\n }\\n }\\n },\\n removeTag: function(tag) {\\n if (this.tags) {\\n var i = this.tags.length;\\n while (i--) {\\n if (this.tags[i]._id === tag._id) {\\n this.tags.splice(i, 1);\\n }\\n // Continue looping in case the user is there more than once. (shouldn't happen)\\n }\\n }\\n },\\n removeMediaDefinition: function(mediaDefinition) {\\n var i = this.mediaDefinitions.length;\\n\\n while (i--) {\\n if (this.mediaDefinitions[i]._id === mediaDefinition._id) {\\n this.mediaDefinitions.splice(i, 1);\\n }\\n }\\n\\n this.removeMediaLayoutsForMediaDefinition(mediaDefinition);\\n },\\n getMediaLayoutsForMediaDefinition: function(mediaDefinition) {\\n return this.mediaLayouts.filter(function(mediaLayout) {\\n return mediaLayout.mediaDefinitionId === mediaDefinition._id;\\n });\\n },\\n removeMediaLayoutsForMediaDefinition: function(mediaDefinition) {\\n var i = this.mediaLayouts.length;\\n\\n while (i--) {\\n if (this.mediaLayouts[i].mediaDefinitionId === mediaDefinition._id) {\\n this.mediaLayouts.splice(i, 1);\\n }\\n }\\n },\\n /**\\n * Sorts media definitions smallest to biggest.\\n * @returns {Array}\\n */\\n sortMediaDefinitions: function() {\\n return this.mediaDefinitions.sort(function(def1, def2) { return def1.width - def2.width; });\\n },\\n duplicateInstrument: function(instrument) {\\n var newInstrument = angular.copy(instrument);\\n newInstrument._id = uuid();\\n this.instruments.push(newInstrument);\\n\\n this.mediaDefinitions.forEach(function(mediaDefinition) {\\n var mediaLayouts = this.getMediaLayoutsForMediaDefinition(mediaDefinition);\\n var mediaLayout;\\n\\n for (var i = 0; i < mediaLayouts.length; i++) {\\n mediaLayout = mediaLayouts[i];\\n if (mediaLayout.instrumentId === instrument._id) {\\n break;\\n }\\n }\\n\\n var newMediaLayout = angular.copy(mediaLayout);\\n newMediaLayout._id = uuid();\\n newMediaLayout.instrumentId = newInstrument._id;\\n\\n // Adjust the instrument's position so it's offset from the original. Try to adjust it to the right if the\\n // needed space is available but if the needed space is not available and there's more space to the left then\\n // adjust it to the left.\\n\\n var rightOffsetAvailable = Math.floor(mediaDefinition.width / gridSpacing) -\\n (newMediaLayout.x + newMediaLayout.width);\\n\\n var leftOffsetAvailable = newMediaLayout.x;\\n\\n if (rightOffsetAvailable > 0 &&\\n (rightOffsetAvailable >= duplicateInstrumentOffset || rightOffsetAvailable >= leftOffsetAvailable)) {\\n newMediaLayout.x += Math.min(rightOffsetAvailable, duplicateInstrumentOffset);\\n } else if (leftOffsetAvailable > 0) {\\n newMediaLayout.x -= Math.min(leftOffsetAvailable, duplicateInstrumentOffset);\\n }\\n\\n // Media definitions don't have a defined height so there's no need to check to see if there is room\\n // to dodge. We just do it.\\n newMediaLayout.y += duplicateInstrumentOffset;\\n\\n this.mediaLayouts.push(newMediaLayout);\\n this.bringInstrumentToFront(newInstrument, mediaDefinition);\\n }.bind(this));\\n },\\n bringInstrumentToFront: function(instrument, mediaDefinition) {\\n var mediaLayouts = this.getMediaLayoutsForMediaDefinition(mediaDefinition);\\n\\n var mediaLayout;\\n\\n for (var i = 0; i < mediaLayouts.length; i++) {\\n mediaLayout = mediaLayouts[i];\\n if (mediaLayout.instrumentId === instrument._id) {\\n break;\\n }\\n }\\n\\n // Remove the zIndex from the media layout, sort all others and redefine their zIndexes if they\\n // previously had one, give the media layout the next available zIndex.\\n\\n delete mediaLayout.zIndex;\\n\\n var zIndexCursor = 1;\\n mediaLayouts.sort(function(mediaLayoutA, mediaLayoutB) {\\n if (mediaLayoutA.zIndex === undefined) {\\n return -1;\\n } else if (mediaLayoutB.zIndex === undefined) {\\n return 1;\\n } else {\\n return mediaLayoutA.zIndex - mediaLayoutB.zIndex;\\n }\\n }).forEach(function(mediaLayout, i) {\\n if (mediaLayout.zIndex !== undefined) {\\n mediaLayout.zIndex = zIndexCursor++;\\n }\\n });\\n\\n mediaLayout.zIndex = zIndexCursor;\\n },\\n /**\\n * If a new media definition were created, what width should it be? This comes up with a decent width\\n * as a starting point and the user can manipulate it from there.\\n */\\n _getNewMediaDefinitionWidth: function(baseMediaDefinition) {\\n var sortedDefinitions = this.sortMediaDefinitions();\\n var activeIndex = sortedDefinitions.indexOf(baseMediaDefinition);\\n\\n var newWidth;\\n\\n // Start by getting the midpoint between the base media definition and the next smallest.\\n if (activeIndex === 0) {\\n if (baseMediaDefinition.width === minMediaDefinitionWidth) {\\n newWidth = baseMediaDefinition.width + 100;\\n } else {\\n newWidth = baseMediaDefinition.width / 2;\\n }\\n } else {\\n var nextSmallest = sortedDefinitions[activeIndex - 1];\\n newWidth = (baseMediaDefinition.width + nextSmallest.width) / 2;\\n }\\n\\n newWidth = Math.max(minMediaDefinitionWidth, newWidth);\\n\\n // This adjustment just seems to look better. This is particularly the case if the active media definition\\n // is the smallest media definition; it looks better if the new one is just offset a ways instead of midway\\n // between the media definition and the left of the viewport. This is obviously subjective.\\n newWidth = Math.max(newWidth, baseMediaDefinition.width - 100);\\n\\n // Snap to the grid.\\n newWidth = newWidth - (newWidth % gridSpacing);\\n\\n return newWidth;\\n },\\n\\n /**\\n * Creates a media definition and adds it to the dashboard.\\n * @param {Object} baseMediaDefinition The media definition the new media definition should be based on. The\\n * new media definition's instrument layout will attempt to mimic the layout from the base media definition.\\n * @returns {Object} New media definition.\\n */\\n createMediaDefinition: function(baseMediaDefinition) {\\n var newWidth = this._getNewMediaDefinitionWidth(baseMediaDefinition);\\n\\n // Create a new media definition with its corresponding media layouts based off the base\\n // media definition.\\n var newMediaDefinition = {\\n _id: uuid(),\\n // If you change the name default, be sure to change the code that automatically updates the\\n // media definition name when it's dragged and its name is in #px format.\\n name: newWidth + 'px',\\n width: newWidth\\n };\\n\\n this.mediaDefinitions.push(newMediaDefinition);\\n\\n var mediaLayouts = angular.copy(this.getMediaLayoutsForMediaDefinition(baseMediaDefinition));\\n\\n mediaLayouts.forEach(function(mediaLayout) {\\n mediaLayout._id = uuid();\\n mediaLayout.mediaDefinitionId = newMediaDefinition._id;\\n });\\n\\n this.resampleMediaLayouts(mediaLayouts, mediaLayouts, baseMediaDefinition.width, newWidth);\\n\\n this.mediaLayouts = this.mediaLayouts.concat(mediaLayouts);\\n\\n return newMediaDefinition;\\n },\\n\\n /**\\n * Resamples media layouts to appropriately fit a new media definition width. Because resampling must snap to\\n * the dashboard grid, sampling \\\"errors\\\" will likely occur. For example, if an instrument is one grid space\\n * from the side of the dashboard before resampling, it may be touching the side of the dashboard after some\\n * resampling due to having to snap to the next grid space.\\n *\\n * When resampling repetitively like when dragging a media definition thumb, it's important that the resampling\\n * is based of the initial media definition and media layout positions so that the resampling error does\\n * not compound. For example, if the user drags the thumb to the left to make the media definition smaller and drags\\n * it back to the right to where it started and the lets go of the thumb, we want to ensure everything\\n * looks as it did when the user started dragging.\\n *\\n * @param {Array} startMediaLayouts Media layout objects representing an instrument's position and dimension when\\n * the series of resamplings started. If this is a single resample and not part of a series, these objects can\\n * be the same as endMediaLayouts.\\n * @param {Array} endMediaLayouts Media layout objects that should be resampled.\\n * @param {Number} startMediaDefinitionWidth Media definition width to resample media layouts from. If this\\n * resampling is part of a series of resamplings, this should be the width of the media definition at the beginning\\n * of the series.\\n * @param {Number} endMediaDefinitionWidth Media definition width to resample media layouts to.\\n */\\n resampleMediaLayouts: function(startMediaLayouts, endMediaLayouts, startMediaDefinitionWidth, endMediaDefinitionWidth) {\\n var resamplePercent = endMediaDefinitionWidth / startMediaDefinitionWidth;\\n\\n endMediaLayouts.forEach(function(mediaLayout, i) {\\n var startMediaLayout = startMediaLayouts[i];\\n mediaLayout.width = Math.round(startMediaLayout.width * resamplePercent);\\n mediaLayout.x = Math.round(startMediaLayout.x * resamplePercent);\\n });\\n },\\n\\n /**\\n * If the provided media definition were removed, what would be the next best media definition the user would like\\n * to see?\\n * @param mediaDefinition\\n * @returns {Object} The next best media definition.\\n */\\n getNextBestMediaDefinition: function(mediaDefinition) {\\n // sorted smallest width to biggest width\\n var mediaDefinitions = this.sortMediaDefinitions();\\n var index = mediaDefinitions.indexOf(mediaDefinition);\\n\\n if (index > 0) {\\n return mediaDefinitions[index - 1];\\n } else if (index < mediaDefinitions.length - 1) {\\n return mediaDefinitions[index + 1];\\n }\\n\\n return null;\\n }\\n };\\n\\n angular.extend(objectMethods, participableMixin);\\n\\n return objectMethods;\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/dashboard-mixin.js\\n ** module id = 52\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.sequence', [])\\n .factory('Sequence', function() {\\n // A promise-based sequential queue.\\n var Sequence = function() {};\\n\\n /**\\n * Add a function to the queue. It will we be called after the promise from the previously enqueued function is\\n * resolved.\\n * @param fn A function that returns a promise that is resolved when processing is complete.\\n */\\n Sequence.prototype.enqueue = function(fn) {\\n this.tail = this.tail ? this.tail.finally(fn) : fn();\\n };\\n \\n return Sequence;\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/sequence.js\\n ** module id = 53\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.participableMixin', [])\\n .factory('participableMixin', function() {\\n /**\\n * Useful methods that can be mixed into objects with\\n * participants arrays (e.g., dashboards, ad-hoc collections).\\n */\\n return {\\n removeParticipant: function(participant) {\\n this.removeParticipantForEntity(participant.entity);\\n },\\n removeParticipantForEntity: function(entity) {\\n var i = this.participants.length;\\n while (i--) {\\n if (this.participants[i].entity._id === entity._id) {\\n this.participants.splice(i, 1);\\n }\\n // Continue looping in case the user is there more than once. (shouldn't happen)\\n }\\n },\\n isEntityAnOwner: function(entity) {\\n for (var i = 0; i < this.participants.length; i++) {\\n var participant = this.participants[i];\\n if (participant.entity._id === entity._id && participant.isOwner) {\\n return true;\\n }\\n }\\n return false;\\n },\\n isSoleOwner: function(participant) {\\n return this.isEntitySoleOwner(participant.entity);\\n },\\n isEntitySoleOwner: function(entity) {\\n var userFoundAsOwner = false;\\n for (var i = 0; i < this.participants.length; i++) {\\n var participant = this.participants[i];\\n if (participant.isOwner) {\\n if (participant.entity._id === entity._id) {\\n userFoundAsOwner = true;\\n } else {\\n return false;\\n }\\n }\\n }\\n return userFoundAsOwner;\\n },\\n isEntityAParticipant: function(entity) {\\n for (var i = 0; i < this.participants.length; i++) {\\n var participant = this.participants[i];\\n if (participant.entity._id === entity._id) {\\n return true;\\n }\\n }\\n return false;\\n },\\n getOwners: function() {\\n return this.participants.filter(function(participant) {\\n return participant.isOwner;\\n });\\n },\\n addEntityAsParticipant: function(entity) {\\n if (!this.isEntityAParticipant(entity)) {\\n this.participants.push({\\n entity: entity,\\n isOwner: false,\\n isScheduled: false\\n });\\n }\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/participable-mixin.js\\n ** module id = 54\\n ** module chunks = 0\\n **/\",\"var map = {\\n\\t\\\"./demo-html/renderer/renderer\\\": 84,\\n\\t\\\"./dv/renderer/renderer\\\": 86,\\n\\t\\\"./key-metric/renderer/renderer\\\": 87,\\n\\t\\\"./starfield/renderer/renderer\\\": 88,\\n\\t\\\"./text/renderer/renderer\\\": 90,\\n\\t\\\"./twitter-trends/renderer/renderer\\\": 91\\n};\\nfunction webpackContext(req) {\\n\\treturn __webpack_require__(webpackContextResolve(req));\\n};\\nfunction webpackContextResolve(req) {\\n\\treturn map[req] || (function() { throw new Error(\\\"Cannot find module '\\\" + req + \\\"'.\\\") }());\\n};\\nwebpackContext.keys = function webpackContextKeys() {\\n\\treturn Object.keys(map);\\n};\\nwebpackContext.resolve = webpackContextResolve;\\nmodule.exports = webpackContext;\\nwebpackContext.id = 55;\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments ^\\\\.\\\\/.*\\\\/renderer\\\\/renderer$\\n ** module id = 55\\n ** module chunks = 0\\n **/\",\"var map = {\\n\\t\\\"./dv/editor/editor\\\": 85,\\n\\t\\\"./text/editor/editor\\\": 89\\n};\\nfunction webpackContext(req) {\\n\\treturn __webpack_require__(webpackContextResolve(req));\\n};\\nfunction webpackContextResolve(req) {\\n\\treturn map[req] || (function() { throw new Error(\\\"Cannot find module '\\\" + req + \\\"'.\\\") }());\\n};\\nwebpackContext.keys = function webpackContextKeys() {\\n\\treturn Object.keys(map);\\n};\\nwebpackContext.resolve = webpackContextResolve;\\nmodule.exports = webpackContext;\\nwebpackContext.id = 56;\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments ^\\\\.\\\\/.*\\\\/editor\\\\/editor$\\n ** module id = 56\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\n/**\\n * Sets the focus to the element when its stealFocus attribute is set to true.\\n */\\nmodule.exports = angular.module('totem.stealFocus', [])\\n .directive('stealFocus', function($parse, $timeout) {\\n return {\\n link: function(scope, element, attr) {\\n var model = $parse(attr.stealFocus);\\n scope.$watch(model, function(value) {\\n if(value === true) {\\n $timeout(function() {\\n element[0].focus();\\n });\\n }\\n });\\n\\n\\t\\telement.bind('blur', function() {\\n scope.$apply(model.assign(scope, false));\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/steal-focus.js\\n ** module id = 57\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-NameEditor\\\\\\\">\\\\n <button class=\\\\\\\"totem-NameEditor-button coral-MinimalButton\\\\\\\" ng-click=\\\\\\\"editingTitle=true\\\\\\\" ng-show=\\\\\\\"!editingTitle\\\\\\\">{{ name }}<span class=\\\\\\\"totem-NameEditor-editIcon coral-Icon coral-Icon--edit\\\\\\\"></span></button>\\\\n <form ng-submit=\\\\\\\"editingTitle=false\\\\\\\" ng-show=\\\\\\\"editingTitle\\\\\\\">\\\\n <input type=\\\\\\\"text\\\\\\\" class=\\\\\\\"totem-NameEditor-textField coral-Textfield\\\\\\\" ng-model=\\\\\\\"name\\\\\\\" steal-focus=\\\\\\\"editingTitle\\\\\\\">\\\\n </form>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/name-editor.tpl.html\\n ** module id = 58\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-Alert coral-Alert\\\\\\\" ng-class=\\\\\\\"{'is-visible': visible, 'coral-Alert--error': type === 'error', 'coral-Alert--success': type === 'success'}\\\\\\\">\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-MinimalButton coral-Alert-closeButton\\\\\\\" title=\\\\\\\"Close\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--sizeXS coral-Icon--close coral-MinimalButton-icon\\\\\\\"></i>\\\\n </button>\\\\n <i class=\\\\\\\"coral-Alert-typeIcon coral-Icon coral-Icon--sizeS coral-Icon--alert\\\\\\\"></i>\\\\n <strong class=\\\\\\\"coral-Alert-title\\\\\\\">{{ type }}</strong>\\\\n <div class=\\\\\\\"coral-Alert-message\\\\\\\">{{ content }}</div>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/alert.tpl.html\\n ** module id = 59\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-ModalProgressIndicator\\\\\\\" ng-class=\\\\\\\"{'is-visible': visible}\\\\\\\">\\\\n <div class=\\\\\\\"coral-Wait coral-Wait--large coral-Wait--center\\\\\\\"></div>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/modal-progress-indicator.tpl.html\\n ** module id = 60\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.share', [\\n require('./sort-header').name,\\n require('./invalid-share-action-alert').name,\\n require('./user-search').name\\n ])\\n .directive('share', function($document, $window, $timeout) {\\n var MODAL_SELECTOR = '.totem-ShareModal',\\n MODAL_BODY_SELECTOR = '.totem-ShareModal-body',\\n MODAL_BUFFER = 20;\\n\\n return {\\n restrict: 'EA',\\n scope: {\\n participable: '=',\\n visible: '=',\\n externalSave: '&save'\\n },\\n template: require('./share.tpl.html'),\\n link: function(scope, element, attrs) {\\n var participableCopy;\\n\\n scope.getParticipants = function() {\\n if (participableCopy) {\\n return participableCopy.participants;\\n }\\n };\\n\\n scope.isOwner = function(participant) {\\n return participant.isOwner;\\n };\\n\\n scope.isScheduled = function(participant) {\\n return participant.isScheduled;\\n };\\n\\n scope.setSort = function(predicate) {\\n if (scope.sortPredicate === predicate) {\\n scope.sortReverse = !scope.sortReverse;\\n } else {\\n scope.sortReverse = false;\\n }\\n scope.sortPredicate = predicate;\\n };\\n\\n scope.removeParticipant = function(participant, $event) {\\n if (participableCopy.isSoleOwner(participant)) {\\n $event.preventDefault();\\n // The event we're listening to will eventually bubble up to the document and execute our event handler\\n // if we already have one set up (done with $document.one below) which would immediately remove\\n // the invalid state. For this reason we remove any event listener previously set up and don't add\\n // a new one until the next frame.\\n $document.off('click.totem.share.invalidRemoveOwner');\\n scope.invalidRemoveOwnerParticipant = participant;\\n $timeout(function() {\\n $document.one('click.totem.share.invalidRemoveOwner', function() {\\n scope.$apply(function() {\\n scope.invalidRemoveOwnerParticipant = null;\\n });\\n });\\n });\\n } else {\\n participableCopy.removeParticipant(participant);\\n }\\n };\\n\\n scope.addParticipant = function(entity) {\\n participableCopy.addEntityAsParticipant(entity);\\n };\\n\\n scope.setOwnerRole = function(participant, $event) {\\n var setAsOwner = $event.target.checked;\\n if (!setAsOwner && participableCopy.isSoleOwner(participant)) {\\n $event.preventDefault();\\n // The event we're listening to will eventually bubble up to the document and execute our event handler\\n // if we already have one set up (done with $document.one below) which would immediately remove\\n // the invalid state. For this reason we remove any event listener previously set up and don't add\\n // a new one until the next frame.\\n $document.off('click.totem.share.invalidRevokeOwnership');\\n scope.invalidRevokeOwnershipParticipant = participant;\\n $timeout(function() {\\n $document.one('click.totem.share.invalidRevokeOwnership', function() {\\n scope.$apply(function() {\\n scope.invalidRevokeOwnershipParticipant = null;\\n });\\n });\\n });\\n } else {\\n participant.isOwner = setAsOwner;\\n }\\n };\\n\\n scope.setScheduled = function(participant, scheduled) {\\n participant.isScheduled = scheduled;\\n };\\n\\n scope.save = function() {\\n angular.copy(participableCopy, scope.participable);\\n scope.externalSave({ participable: scope.participable });\\n };\\n\\n scope.visible = false;\\n scope.sortPredicate = scope.getFullName;\\n scope.sortReverse = false;\\n scope.invalidRemoveOwnerParticipant = null;\\n scope.invalidRevokeOwnershipParticipant = null;\\n\\n scope.$watch('participable', function(participable) {\\n participableCopy = angular.copy(participable);\\n });\\n\\n // Sets a max height on the body of the modal so it scrolls when there are many users instead of the modal\\n // extending past the viewport or some other type of scrolling.\\n var setMaxHeight = function(visible) {\\n if (visible) {\\n var viewPortHeight = $($window).height();\\n // We must find the element at the document level since the modal element is shifted to be a direct\\n // descendant of <body>.\\n var modal = $(MODAL_SELECTOR);\\n var modalBody = $(MODAL_BODY_SELECTOR);\\n modal.toggle(true); // Just a quick, temporary toggle to measure. Real toggling will be done by CoralUI.\\n var modalHeight = modal.outerHeight();\\n var modalBodyHeight = modalBody.outerHeight();\\n modal.toggle(false);\\n var modalChromeHeight = modalHeight - modalBodyHeight;\\n modalBody.css('max-height', viewPortHeight - modalChromeHeight - MODAL_BUFFER);\\n }\\n };\\n\\n scope.$watch('visible', setMaxHeight);\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/share.js\\n ** module id = 61\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.adHocFileUpload',[\\n ])\\n .directive('adHocFileUpload', function(adHocService, $sce, i18nFilter, $timeout) {\\n return {\\n restrict: 'EA',\\n scope:{\\n collection:'=',\\n uploadFileName:'=',\\n saveDisabled:'='\\n },\\n replace: true,\\n template: require('./ad-hoc-file-upload.tpl.html'),\\n link: function(scope, element, attr) {\\n scope.percentProgress = null;\\n scope.uploading = false;\\n\\n scope.dropLabel = $sce.trustAsHtml(i18nFilter('dragAndDropCsv', {\\n LINK_BEFORE: '<a href=\\\"javascript:void(0)\\\" class=\\\"coral-Link coral-FileUpload-trigger totem-AdHocDataUpload-uploadLink\\\">',\\n LINK_AFTER: '</a>'\\n }));\\n\\n // We have to instantiate FileUpload on a timeout because it depends on children existing on the DOM whose\\n // existance depend on ng-if bindings which are evaluated later.\\n $timeout(function() {\\n new CUI.FileUpload({\\n name:'adHocFileUploadField',\\n element:element,\\n dropZone:element,\\n uploadUrl:'/pastebin',\\n autoStart: true\\n });\\n element\\n .on('dropzonedrop', function(e) {\\n scope.$apply(function() {\\n scope.saveDisabled = true;\\n scope.uploading = true;\\n });\\n })\\n .on('fileuploadsuccess', function(e) {\\n scope.$apply(function() {\\n var response = angular.fromJson(e.item.xhr.response);\\n var pastebinId = response._id;\\n scope.uploading = false;\\n scope.uploadFileName = e.item.fileName;\\n scope.saveDisabled = false;\\n scope.collection.pastebinId = pastebinId;\\n scope.collection.fileName = e.item.fileName;\\n });\\n })\\n .on('fileuploadprogress', function(e) {\\n scope.$apply(function() {\\n var percent = Math.round((e.originalEvent.loaded /\\te.originalEvent.total) * 100);\\n scope.percentProgress = percent;\\n });\\n })\\n .on('fileuploaderror', function(e) {\\n })\\n .on('fileRejected', function(e) {\\n });\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/directives/ad-hoc-file-upload.js\\n ** module id = 62\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.debounce', [])\\n.factory('debounce', function($timeout) {\\n\\treturn function(fn, timeout, apply){\\n\\t\\ttimeout = angular.isUndefined(timeout) ? 0 : timeout;\\n\\t\\tapply = angular.isUndefined(apply) ? true : apply;\\n\\t\\tvar nthCall = 0;\\n\\t\\treturn function() {\\n\\t\\t\\tvar that = this;\\n\\t\\t\\tvar argz = arguments;\\n\\t\\t\\tnthCall++;\\n\\t\\t\\tvar later = (function(version){\\n\\t\\t\\t\\treturn function(){\\n\\t\\t\\t\\t\\tif (version === nthCall){\\n\\t\\t\\t\\t\\t\\treturn fn.apply(that, argz);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t};\\n\\t\\t\\t})(nthCall);\\n\\t\\t\\treturn $timeout(later, timeout, apply);\\n\\t\\t};\\n\\t};\\n});\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/debounce.js\\n ** module id = 63\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.draggable', [\\n require('../services/drag-resize-util').name,\\n require('../services/auto-scroll').name\\n ])\\n .controller('DraggableController', function() {\\n // Methods are added from directive.\\n })\\n .directive('draggable', function($parse, dragResizeUtil, AutoScroll) {\\n return {\\n restrict: 'A',\\n controller: 'DraggableController',\\n link: function(scope, element, attr, controller) {\\n var scrollParent,\\n autoScroll = new AutoScroll();\\n\\n autoScroll.onScroll = function(event) {\\n controller.continueDrag(event);\\n };\\n\\n var originXWithinScrollParent,\\n originYWithinScrollParent,\\n originXRelativeToDraggable,\\n originYRelativeToDraggable;\\n\\n var getElementRect = function(overrides) {\\n var position;\\n\\n if (!overrides || overrides.x === undefined || overrides.y === undefined) {\\n position = element.position();\\n }\\n\\n var rect = {\\n x: overrides && overrides.x !== undefined ? overrides.x : position.left,\\n y: overrides && overrides.y !== undefined ? overrides.y : position.top,\\n width: overrides && overrides.width !== undefined ? overrides.width : element.outerWidth(),\\n height: overrides && overrides.height !== undefined ? overrides.height : element.outerHeight()\\n };\\n\\n return rect;\\n };\\n\\n controller.startDrag = function(event) {\\n scrollParent = $(event.target).scrollParent();\\n\\n originXWithinScrollParent = dragResizeUtil.getXWithinContainer(event, scrollParent);\\n originYWithinScrollParent = dragResizeUtil.getYWithinContainer(event, scrollParent);\\n\\n var rect = getElementRect();\\n originXRelativeToDraggable = rect.x;\\n originYRelativeToDraggable = rect.y;\\n\\n if (attr.dragBegin) {\\n var dragBegin = $parse(attr.dragBegin);\\n dragBegin(scope, {rect: rect, event: event});\\n }\\n\\n autoScroll.start(scrollParent);\\n };\\n\\n controller.continueDrag = function(event) {\\n var xWithinScrollParent = dragResizeUtil.getXWithinContainer(event, scrollParent),\\n yWithinScrollParent = dragResizeUtil.getYWithinContainer(event, scrollParent);\\n\\n var rect = getElementRect({\\n x: originXRelativeToDraggable + xWithinScrollParent - originXWithinScrollParent,\\n y: originYRelativeToDraggable + yWithinScrollParent - originYWithinScrollParent\\n });\\n\\n if (attr.constrainDrag) {\\n var constrainDrag = $parse(attr.constrainDrag);\\n rect = constrainDrag(scope, {rect: rect, event: event});\\n }\\n\\n if (attr.dragContinue) {\\n var dragContinue = $parse(attr.dragContinue);\\n dragContinue(scope, {rect: rect});\\n }\\n\\n element.css({\\n 'left': rect.x,\\n 'top': rect.y\\n });\\n\\n autoScroll.updatePointerLocation(event);\\n\\n return rect;\\n };\\n\\n controller.endDrag = function() {\\n autoScroll.stop();\\n\\n if (attr.dragComplete) {\\n var dragComplete = $parse(attr.dragComplete);\\n dragComplete(scope, {rect: getElementRect()});\\n }\\n\\n scrollParent = null;\\n };\\n }\\n };\\n })\\n .directive('dragHandle', function($document, $window, $parse) {\\n var namespace = function(eventName) {\\n return eventName + '.dragHandle';\\n };\\n\\n return {\\n restrict: 'A',\\n require: '^draggable',\\n link: function(scope, element, attr, draggableCtrl) {\\n var dragging = false;\\n\\n element.on([namespace('mousedown'), namespace('touchstart')].join(' '), function(event) {\\n scope.$apply(function() {\\n var shouldDrag = $parse(attr.dragHandle)(scope);\\n if (dragging || shouldDrag === false) {\\n return;\\n }\\n dragging = true;\\n\\n event.preventDefault();\\n\\n draggableCtrl.startDrag(event);\\n\\n var $documents = $document;\\n\\n // Handle the case where we're inside an iframe. Mouse events outside of the iframe would normally not\\n // be caught so we have to watch the parent document as well. This will only work if the iframe and the\\n // parent are from the same domain.\\n if ($window !== $window.parent) {\\n $documents = $documents.add($window.parent.document);\\n }\\n\\n $documents.on([namespace('mousemove'), namespace('touchmove')].join(' '), function(event) {\\n scope.$apply(function() {\\n draggableCtrl.continueDrag(event);\\n });\\n });\\n\\n $documents.on([namespace('mouseup'), namespace('touchend')].join(' '), function(event) {\\n scope.$apply(function() {\\n draggableCtrl.endDrag();\\n $documents.off([\\n namespace('mouseup'),\\n namespace('touchend'),\\n namespace('mousemove'),\\n namespace('touchmove')\\n ].join(' '));\\n dragging = false;\\n });\\n });\\n });\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/draggable.js\\n ** module id = 64\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.resizeable', [\\n require('../services/drag-resize-util').name\\n ])\\n .controller('ResizeableController', function() {\\n // Methods are added from directive.\\n })\\n .directive('resizeable', function($parse) {\\n return {\\n restrict: 'A',\\n controller: 'ResizeableController',\\n link: function(scope, element, attr, controller) {\\n var pointerOriginPageX, pointerOriginPageY;\\n var elementOriginRect = {};\\n\\n var getElementRect = function(overrides) {\\n var position;\\n\\n if (!overrides || overrides.x === undefined || overrides.y === undefined) {\\n position = element.position();\\n }\\n\\n var rect = {\\n x: overrides && overrides.x !== undefined ? overrides.x : position.left,\\n y: overrides && overrides.y !== undefined ? overrides.y : position.top,\\n width: overrides && overrides.width !== undefined ? overrides.width : element.outerWidth(),\\n height: overrides && overrides.height !== undefined ? overrides.height : element.outerHeight()\\n };\\n\\n return rect;\\n };\\n\\n controller.startDrag = function(x, y) {\\n pointerOriginPageX = x;\\n pointerOriginPageY = y;\\n\\n var rect = getElementRect();\\n elementOriginRect.width = rect.width;\\n elementOriginRect.height = rect.height;\\n elementOriginRect.x = rect.x;\\n elementOriginRect.y = rect.y;\\n\\n if (attr.resizeBegin) {\\n var resizeBegin = $parse(attr.resizeBegin);\\n resizeBegin(scope, {rect: rect, origRect: elementOriginRect});\\n }\\n\\n };\\n\\n controller.continueDrag = function(x, y, fromSide) {\\n var rect;\\n if(fromSide && fromSide === 'left') {\\n rect = getElementRect({\\n width: elementOriginRect.width + pointerOriginPageX - x,\\n height: elementOriginRect.height + y - pointerOriginPageY,\\n x: elementOriginRect.x + x - pointerOriginPageX\\n });\\n } else {\\n rect = getElementRect({\\n width: elementOriginRect.width + x - pointerOriginPageX,\\n height: elementOriginRect.height + y - pointerOriginPageY,\\n x: elementOriginRect.x\\n });\\n }\\n\\n if (attr.constrainResize) {\\n var constrainResize = $parse(attr.constrainResize);\\n rect = constrainResize(scope, {rect: rect, origRect: elementOriginRect});\\n }\\n\\n if (attr.resizeContinue) {\\n var resizeContinue = $parse(attr.resizeContinue);\\n resizeContinue(scope, {rect: rect, origRect: elementOriginRect});\\n }\\n\\n element.css({\\n 'width': rect.width,\\n 'height': rect.height,\\n 'left': rect.x\\n });\\n\\n return rect;\\n };\\n\\n controller.endDrag = function(x, y) {\\n if (attr.resizeComplete) {\\n var resizeComplete = $parse(attr.resizeComplete);\\n resizeComplete(scope, {rect: getElementRect()});\\n }\\n };\\n }\\n };\\n })\\n .directive('resizeHandle', function($document, $window, dragResizeUtil) {\\n var namespace = function(eventName) {\\n return eventName + '.resizeHandle';\\n };\\n\\n return {\\n restrict: 'A',\\n require: '^resizeable',\\n link: function(scope, element, attr, resizeableCtrl) {\\n var resizing = false;\\n\\n element.on([namespace('mousedown'), namespace('touchstart')].join(' '), function(event) {\\n scope.$apply(function() {\\n if (resizing) {\\n return;\\n }\\n resizing = true;\\n\\n event.preventDefault();\\n\\n resizeableCtrl.startDrag(dragResizeUtil.getPageX(event), dragResizeUtil.getPageY(event));\\n\\n var $documents = $document;\\n\\n // Handle the case where we're inside an iframe. Mouse events outside of the iframe would normally not\\n // be caught so we have to watch the parent document as well. This will only work if the iframe and the\\n // parent are from the same domain.\\n if ($window !== $window.parent) {\\n $documents = $documents.add($window.parent.document);\\n }\\n\\n $documents.on([namespace('mousemove'), namespace('touchmove')].join(' '), function(event) {\\n scope.$apply(function() {\\n resizeableCtrl.continueDrag(dragResizeUtil.getPageX(event), dragResizeUtil.getPageY(event), attr.resizeHandle);\\n });\\n });\\n\\n $documents.on([namespace('mouseup'), namespace('touchend')].join(' '), function(event) {\\n scope.$apply(function() {\\n resizeableCtrl.endDrag();\\n $documents.off([\\n namespace('mouseup'),\\n namespace('touchend'),\\n namespace('mousemove'),\\n namespace('touchmove')\\n ].join(' '));\\n resizing = false;\\n });\\n });\\n });\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/resizeable.js\\n ** module id = 65\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.tap', [])\\n .directive('tap', function($parse) {\\n return {\\n restrict: 'A',\\n link: function(scope, element, attr) {\\n var tapping = false;\\n element.on('touchstart', function() {\\n tapping = true;\\n }).on('touchmove', function() {\\n tapping = false;\\n }).on('touchend', function() {\\n if (tapping) {\\n scope.$apply(function() {\\n $parse(attr.tap)(scope);\\n });\\n }\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/tap.js\\n ** module id = 66\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.mediaDefinitionRange', [])\\n .directive('mediaDefinitionRange', function() {\\n return {\\n restrict: 'AE',\\n scope: {\\n name: '=',\\n isActive: '='\\n },\\n replace: true,\\n template: require('./media-definition-range.tpl.html')\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/media-definition-range.js\\n ** module id = 67\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.mediaDefinitionRenamePopover', [\\n require('./media-definition-popover').name\\n ])\\n .directive('mediaDefinitionRenamePopover', function(eventBus, $timeout, i18nFilter) {\\n return {\\n restrict: 'AE',\\n scope: {\\n mediaDefinition: '=',\\n externalCancel: '&cancel',\\n externalComplete: '&complete',\\n externalHideFromClickOutside: '&hideFromClickOutside',\\n visible: '=',\\n isCreating: '=',\\n thumb: '='\\n },\\n template: require('./media-definition-rename-popover.tpl.html'),\\n link: function(scope, element, attrs) {\\n // Must be an object in order for ng-model to work correctly on the text input:\\n // http://stackoverflow.com/questions/13193929/using-ng-model-within-a-transcluded-directive-in-angularjs\\n scope.editing = { name: '' };\\n\\n scope.cancel = function() {\\n scope.visible = false;\\n scope.externalCancel();\\n };\\n\\n scope.complete = function() {\\n scope.visible = false;\\n commitName();\\n scope.externalComplete();\\n };\\n\\n var commitName = function() {\\n scope.mediaDefinition.name = scope.editing.name;\\n };\\n\\n scope.hideFromClickOutside = function() {\\n commitName();\\n scope.externalHideFromClickOutside();\\n };\\n\\n scope.$watch('visible', function(visible) {\\n if (visible) {\\n scope.editing.name = scope.mediaDefinition.name;\\n\\n // Give focus to the input. Sure we could do some sort of directive to make it more angulary but meh.\\n $timeout(function() { // Not sure why timeout is necessary here :/\\n element.find('.totem-RenameMediaDefinition-input').focus();\\n });\\n }\\n });\\n\\n scope.getSaveLabel = function() {\\n return i18nFilter(scope.isCreating ? 'create' : 'save');\\n };\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/media-definition-rename-popover.js\\n ** module id = 68\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.mediaDefinitionDeletePopover', [\\n require('./media-definition-popover').name,\\n require('../../common/services/dashboard-workspace').name\\n ])\\n .directive('mediaDefinitionDeletePopover', function(dashboardWorkspaceService) {\\n return {\\n restrict: 'AE',\\n scope: {\\n mediaDefinition: '=',\\n externalCancel: '&cancel',\\n externalComplete: '&complete',\\n hideFromClickOutside: '&',\\n visible: '=',\\n thumb: '='\\n },\\n template: require('./media-definition-delete-popover.tpl.html'),\\n link: function(scope, element, attrs) {\\n scope.complete = function() {\\n scope.visible = false;\\n\\n if (dashboardWorkspaceService.mediaDefinition === scope.mediaDefinition) {\\n dashboardWorkspaceService.mediaDefinition =\\n dashboardWorkspaceService.dashboard.getNextBestMediaDefinition(scope.mediaDefinition);\\n }\\n\\n dashboardWorkspaceService.dashboard.removeMediaDefinition(scope.mediaDefinition);\\n scope.externalComplete();\\n };\\n\\n scope.cancel = function() {\\n scope.visible = false;\\n scope.externalCancel();\\n };\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/media-definition-delete-popover.js\\n ** module id = 69\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"coral-Autocomplete\\\\\\\" data-init=\\\\\\\"autocomplete\\\\\\\" data-mode=\\\\\\\"contains\\\\\\\">\\\\n <span class=\\\\\\\"coral-DecoratedTextfield js-coral-Autocomplete-field\\\\\\\">\\\\n <i class=\\\\\\\"coral-DecoratedTextfield-icon coral-Icon coral-Icon--sizeXS coral-Icon--search\\\\\\\"></i>\\\\n <input class=\\\\\\\"coral-DecoratedTextfield-input coral-Textfield js-coral-Autocomplete-textfield\\\\\\\" type=\\\\\\\"text\\\\\\\" name=\\\\\\\"name1\\\\\\\" placeholder=\\\\\\\"Searching not implemented\\\\\\\">\\\\n </span>\\\\n <ul class=\\\\\\\"coral-SelectList js-coral-Autocomplete-selectList\\\\\\\">\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--optgroup\\\\\\\">\\\\n <span class=\\\\\\\"coral-SelectList-groupHeader\\\\\\\">DASHBOARDS</span>\\\\n <ul class=\\\\\\\"coral-SelectList-sublist\\\\\\\">\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"af\\\\\\\">Afghanistan</li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"bs\\\\\\\">Bahamas</li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"kh\\\\\\\">Cambodia</li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"dk\\\\\\\">Denmark</li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"ec\\\\\\\">Ecuador</li>\\\\n </ul>\\\\n </li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--optgroup\\\\\\\">\\\\n <span class=\\\\\\\"coral-SelectList-groupHeader\\\\\\\">OWNERS</span>\\\\n <ul class=\\\\\\\"coral-SelectList-sublist\\\\\\\">\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"al\\\\\\\">Albania</li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"bh\\\\\\\">Bahrain</li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"cm\\\\\\\">Cameroon</li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"dj\\\\\\\">Djibouti</li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"eg\\\\\\\">Egypt</li>\\\\n </ul>\\\\n </li>\\\\n </ul>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/manage/directives/dashboard-search.tpl.html\\n ** module id = 70\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-ActionBar\\\\\\\">\\\\n <dashboard-search ng-if=\\\\\\\"showSearchField && isSearchable()\\\\\\\" class=\\\\\\\"totem-ActionBar-searchField\\\\\\\" dashboards=\\\\\\\"dashboards\\\\\\\"></dashboard-search>\\\\n <div class=\\\\\\\"coral-ButtonGroup\\\\\\\">\\\\n <button ng-show=\\\\\\\"!showSearchField && isSearchable()\\\\\\\" ng-click=\\\\\\\"showSearchField = true\\\\\\\" class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--search\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'search' | i18n }}</span></button>\\\\n <!--<button class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--fullScreenExit\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">Show List</span></button>-->\\\\n <button ng-show=\\\\\\\"isShareable()\\\\\\\" ng-click=\\\\\\\"share()\\\\\\\" class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--share\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'share' | i18n }}</span></button>\\\\n <button ng-show=\\\\\\\"isViewable()\\\\\\\" ng-click=\\\\\\\"viewDashboard()\\\\\\\" class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--viewOn\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'view' | i18n }}</span></button>\\\\n <button ng-show=\\\\\\\"isDuplicable()\\\\\\\" ng-click=\\\\\\\"duplicateDashboard()\\\\\\\" class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--copy\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'duplicate' | i18n }}</span></button>\\\\n <!--<button ng-show=\\\\\\\"isDownloadable()\\\\\\\" class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--download\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">Download</span></button>-->\\\\n <!--<button class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--email\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">Subscribe</span></button>-->\\\\n <!--<button class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--spam\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">Unsubscribe</span></button>-->\\\\n <button ng-show=\\\\\\\"isLeaveViewable()\\\\\\\" ng-disabled=\\\\\\\"!isLeavable()\\\\\\\" ng-click=\\\\\\\"leaveDashboard()\\\\\\\" class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--close\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'leaveDashboard' | i18n }}</span></button>\\\\n <button ng-show=\\\\\\\"isEditable()\\\\\\\" ng-click=\\\\\\\"editDashboard()\\\\\\\" class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--edit\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'edit' | i18n }}</span></button>\\\\n <button ng-show=\\\\\\\"isDeleteViewable()\\\\\\\" ng-disabled=\\\\\\\"!isDeletable()\\\\\\\" ng-click=\\\\\\\"deleteDashboard()\\\\\\\" class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--delete\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'delete' | i18n }}</span></button>\\\\n </div>\\\\n</div>\\\\n<share participable=\\\\\\\"selectedDashboards[0]\\\\\\\" visible=\\\\\\\"shareModalVisible\\\\\\\" save=\\\\\\\"saveDashboard(participable)\\\\\\\"></share>\\\\n<cui-modal visible=\\\\\\\"leaveModalVisible\\\\\\\" type=\\\\\\\"'notice'\\\\\\\">\\\\n <span header>{{ 'leaveDashboardTitle' | i18n }}</span>\\\\n <span content>{{ 'leaveDashboardDescription' | i18n }}</span>\\\\n <div template class=\\\\\\\"coral-Modal\\\\\\\">\\\\n <div class=\\\\\\\"coral-Modal-header\\\\\\\">\\\\n <i class=\\\\\\\"coral-Modal-typeIcon coral-Icon coral-Icon--sizeS\\\\\\\"></i>\\\\n <h2 class=\\\\\\\"coral-Modal-title coral-Heading coral-Heading--2\\\\\\\"></h2>\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-MinimalButton coral-Modal-closeButton\\\\\\\" title=\\\\\\\"{{ 'cancel' | i18n }}\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--sizeXS coral-Icon--close coral-MinimalButton-icon \\\\\\\"></i>\\\\n </button>\\\\n </div>\\\\n <div class=\\\\\\\"coral-Modal-body\\\\\\\"></div>\\\\n <div class=\\\\\\\"coral-Modal-footer\\\\\\\">\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-Button coral-Button--quiet\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\">{{ 'leaveDashboardCancel' | i18n }}</button>\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-Button coral-Button--primary\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\" ng-click=\\\\\\\"confirmLeaveDashboard()\\\\\\\">{{ 'leaveDashboardConfirm' | i18n }}</button>\\\\n </div>\\\\n </div>\\\\n</cui-modal>\\\\n<cui-modal visible=\\\\\\\"deleteModalVisible\\\\\\\" type=\\\\\\\"'error'\\\\\\\">\\\\n <span header>{{ 'deleteDashboardTitle' | i18n }}</span>\\\\n <span content>{{ deleteModalDescription }}</span>\\\\n <div template class=\\\\\\\"coral-Modal\\\\\\\">\\\\n <div class=\\\\\\\"coral-Modal-header\\\\\\\">\\\\n <i class=\\\\\\\"coral-Modal-typeIcon coral-Icon coral-Icon--sizeS\\\\\\\"></i>\\\\n <h2 class=\\\\\\\"coral-Modal-title coral-Heading coral-Heading--2\\\\\\\"></h2>\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-MinimalButton coral-Modal-closeButton\\\\\\\" title=\\\\\\\"{{ 'cancel' | i18n }}\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--sizeXS coral-Icon--close coral-MinimalButton-icon \\\\\\\"></i>\\\\n </button>\\\\n </div>\\\\n <div class=\\\\\\\"coral-Modal-body\\\\\\\"></div>\\\\n <div class=\\\\\\\"coral-Modal-footer\\\\\\\">\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-Button coral-Button--quiet\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\">{{ 'deleteDashboardCancel' | i18n }}</button>\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-Button coral-Button--primary coral-Button--warning\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\" ng-click=\\\\\\\"confirmDeleteDashboard()\\\\\\\">{{ 'deleteDashboardConfirm' | i18n }}</button>\\\\n </div>\\\\n </div>\\\\n</cui-modal>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/manage/directives/manage-toolbar.tpl.html\\n ** module id = 71\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"coral-Autocomplete\\\\\\\" data-init=\\\\\\\"autocomplete\\\\\\\" data-mode=\\\\\\\"contains\\\\\\\">\\\\n <span class=\\\\\\\"coral-DecoratedTextfield js-coral-Autocomplete-field\\\\\\\">\\\\n <i class=\\\\\\\"coral-DecoratedTextfield-icon coral-Icon coral-Icon--sizeXS coral-Icon--search\\\\\\\"></i>\\\\n <input class=\\\\\\\"coral-DecoratedTextfield-input coral-Textfield js-coral-Autocomplete-textfield\\\\\\\" type=\\\\\\\"text\\\\\\\" name=\\\\\\\"name1\\\\\\\" placeholder=\\\\\\\"Search\\\\\\\">\\\\n </span>\\\\n <ul class=\\\\\\\"coral-SelectList js-coral-Autocomplete-selectList\\\\\\\">\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--optgroup\\\\\\\">\\\\n <span class=\\\\\\\"coral-SelectList-groupHeader\\\\\\\">DASHBOARDS</span>\\\\n <ul class=\\\\\\\"coral-SelectList-sublist\\\\\\\">\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"af\\\\\\\">Afghanistan</li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"bs\\\\\\\">Bahamas</li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"kh\\\\\\\">Cambodia</li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"dk\\\\\\\">Denmark</li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"ec\\\\\\\">Ecuador</li>\\\\n </ul>\\\\n </li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--optgroup\\\\\\\">\\\\n <span class=\\\\\\\"coral-SelectList-groupHeader\\\\\\\">OWNERS</span>\\\\n <ul class=\\\\\\\"coral-SelectList-sublist\\\\\\\">\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"al\\\\\\\">Albania</li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"bh\\\\\\\">Bahrain</li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"cm\\\\\\\">Cameroon</li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"dj\\\\\\\">Djibouti</li>\\\\n <li class=\\\\\\\"coral-SelectList-item coral-SelectList-item--option\\\\\\\" data-value=\\\\\\\"eg\\\\\\\">Egypt</li>\\\\n </ul>\\\\n </li>\\\\n </ul>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/directives/ad-hoc-search.tpl.html\\n ** module id = 72\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-Capacity\\\\\\\">\\\\n <div class=\\\\\\\"totem-Capacity-label\\\\\\\">{{ getPercent(1) | number : 1 }}%</div>\\\\n <div class=\\\\\\\"totem-Capacity-bar\\\\\\\">\\\\n <div class=\\\\\\\"totem-Capacity-barSegment\\\\\\\" ng-class=\\\\\\\"getClass(getPercent(0))\\\\\\\" ng-style=\\\\\\\"{ width: getPercent(0)/100 * 90 }\\\\\\\"></div>\\\\n <div class=\\\\\\\"totem-Capacity-barSegment totem-Capacity-barSegment--unused\\\\\\\" ng-style=\\\\\\\"{ width: 90 - (getPercent(0)/100 * 90) }\\\\\\\"></div>\\\\n </div>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/directives/ad-hoc-capacity.tpl.html\\n ** module id = 73\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-ActionBar\\\\\\\">\\\\n <ad-hoc-search ng-if=\\\\\\\"showSearchField && isSearchable()\\\\\\\" class=\\\\\\\"totem-ActionBar-searchField\\\\\\\" collections=\\\\\\\"adHocCollections\\\\\\\"></ad-hoc-search>\\\\n <div class=\\\\\\\"coral-ButtonGroup\\\\\\\">\\\\n <button ng-show=\\\\\\\"!showSearchField && isSearchable()\\\\\\\" ng-click=\\\\\\\"showSearchField = true\\\\\\\" class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--search\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'search' | i18n }}</span></button>\\\\n <button ng-click=\\\\\\\"createCollection()\\\\\\\" class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--addCircle\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'new' | i18n }}</span></button>\\\\n <button ng-show=\\\\\\\"isViewable()\\\\\\\" ng-click=\\\\\\\"viewCollection()\\\\\\\" class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--viewOn\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'view' | i18n }}</span></button>\\\\n <button ng-show=\\\\\\\"isDeleteViewable()\\\\\\\" ng-disabled=\\\\\\\"!isDeletable()\\\\\\\" ng-click=\\\\\\\"deleteCollections()\\\\\\\" class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--delete\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'delete' | i18n }}</span></button>\\\\n <button ng-show=\\\\\\\"isShareable()\\\\\\\" ng-click=\\\\\\\"shareModalVisible = true\\\\\\\" class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--share\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'share' | i18n }}</span></button>\\\\n </div>\\\\n</div>\\\\n<share participable=\\\\\\\"selectedCollections[0]\\\\\\\" visible=\\\\\\\"shareModalVisible\\\\\\\" save=\\\\\\\"saveCollection(participable)\\\\\\\"></share>\\\\n<cui-modal visible=\\\\\\\"deleteModalVisible\\\\\\\" type=\\\\\\\"'error'\\\\\\\">\\\\n <span header>{{ deleteCollectionTitle }}</span>\\\\n <span content>{{ deleteCollectionDescription }}</span>\\\\n <div template class=\\\\\\\"coral-Modal\\\\\\\">\\\\n <div class=\\\\\\\"coral-Modal-header\\\\\\\">\\\\n <i class=\\\\\\\"coral-Modal-typeIcon coral-Icon coral-Icon--sizeS\\\\\\\"></i>\\\\n <h2 class=\\\\\\\"coral-Modal-title coral-Heading coral-Heading--2\\\\\\\"></h2>\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-MinimalButton coral-Modal-closeButton\\\\\\\" title=\\\\\\\"{{ 'cancel' | i18n }}\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--sizeXS coral-Icon--close coral-MinimalButton-icon \\\\\\\"></i>\\\\n </button>\\\\n </div>\\\\n <div class=\\\\\\\"coral-Modal-body\\\\\\\"></div>\\\\n <div class=\\\\\\\"coral-Modal-footer\\\\\\\">\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-Button coral-Button--quiet\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\">{{ 'deleteCollectionCancel' | i18n }}</button>\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-Button coral-Button--primary coral-Button--warning\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\" ng-click=\\\\\\\"confirmDeleteCollection()\\\\\\\">{{ 'deleteCollectionConfirm' | i18n }}</button>\\\\n </div>\\\\n </div>\\\\n</cui-modal>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/directives/ad-hoc-manage-toolbar.tpl.html\\n ** module id = 74\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-AdHocDataUpload\\\\\\\">\\\\n <div class=\\\\\\\"coral-Alert coral-Alert--info coral-Alert--large totem-AdHocDataUpload-uploadInfo\\\\\\\">\\\\n <i class=\\\\\\\"coral-Alert-typeIcon coral-Icon coral-Icon--sizeS coral-Icon--alert\\\\\\\"></i>\\\\n <strong class=\\\\\\\"coral-Alert-title\\\\\\\">{{ 'adHocFileRequirements' | i18n }}</strong>\\\\n <div class=\\\\\\\"coral-Alert-message\\\\\\\">\\\\n <ul class=\\\\\\\"coral-List totem-AdHocCollection-infoList\\\\\\\">\\\\n <li class=\\\\\\\"coral-List-item\\\\\\\">{{ 'adHocFileRequirementDelimited' | i18n }}</li>\\\\n <li class=\\\\\\\"coral-List-item\\\\\\\">{{ 'adHocFileRequirementHeaders' | i18n }}</li>\\\\n <li class=\\\\\\\"coral-List-item\\\\\\\">{{ 'adHocFileRequirementFormat' | i18n }}</li>\\\\n <li class=\\\\\\\"coral-List-item\\\\\\\">{{ 'adHocFileRequirementMaxRecords' | i18n }}</li>\\\\n <li class=\\\\\\\"coral-List-item\\\\\\\">{{ 'adHocFileRequirementComments' | i18n }}</li>\\\\n </ul>\\\\n </div>\\\\n </div>\\\\n <ad-hoc-file-upload save-disabled=\\\\\\\"saveDisabled\\\\\\\" upload-file-name=\\\\\\\"uploadFileName\\\\\\\" collection=\\\\\\\"collection\\\\\\\"></ad-hoc-file-upload>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/directives/ad-hoc-data-upload.tpl.html\\n ** module id = 75\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-DashboardCanvas\\\\\\\" ng-class=\\\\\\\"{'totem-DashboardCanvas--editable': editable}\\\\\\\" ng-style=\\\\\\\"getGridStyle()\\\\\\\">\\\\n <dashboard-instrument-chrome class=\\\\\\\"totem-DashboardInstrumentChrome\\\\\\\"\\\\n editable=\\\\\\\"editable\\\\\\\"\\\\n ng-repeat=\\\\\\\"instrument in instruments\\\\\\\"\\\\n ng-style=\\\\\\\"getInstrumentStyle(instrument)\\\\\\\"\\\\n instrument=\\\\\\\"instrument\\\\\\\"\\\\n draggable\\\\n constrain-drag=\\\\\\\"constrainDrag(rect)\\\\\\\"\\\\n drag-complete=\\\\\\\"dragComplete(instrument, rect)\\\\\\\"\\\\n drag-continue=\\\\\\\"dragContinue(instrument, rect)\\\\\\\"\\\\n ng-mousedown=\\\\\\\"bringToFront(instrument)\\\\\\\"\\\\n ng-click=\\\\\\\"bringToFront(instrument)\\\\\\\"\\\\n tap=\\\\\\\"bringToFront(instrument)\\\\\\\"\\\\n resizeable\\\\n constrain-resize=\\\\\\\"constrainResize(rect, origRect)\\\\\\\"\\\\n resize-begin=\\\\\\\"resizeBegin(instrument)\\\\\\\"\\\\n resize-continue=\\\\\\\"resizeContinue(instrument, rect)\\\\\\\"\\\\n resize-complete=\\\\\\\"resizeComplete(instrument, rect)\\\\\\\">\\\\n <instrument instrument=\\\\\\\"instrument\\\\\\\"/>\\\\n </dashboard-instrument-chrome>\\\\n <div ng-if=\\\\\\\"instruments.length === 0\\\\\\\" class=\\\\\\\"totem-DashboardCanvas-noContentNotice\\\\\\\">\\\\n {{ 'noDashboardContent' | i18n }}\\\\n </div>\\\\n</div>\\\\n\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/dashboard-canvas.tpl.html\\n ** module id = 76\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div>\\\\n <div class=\\\\\\\"totem-DashboardInstrumentChrome-title coral-Heading coral-Heading--1\\\\\\\" ng-class=\\\\\\\"{'totem-DashboardInstrumentChrome-title--editable':editable}\\\\\\\" drag-handle=\\\\\\\"editable\\\\\\\">{{ instrument.title }}</div>\\\\n <div class=\\\\\\\"totem-DashboardInstrumentChrome-toolbar\\\\\\\" ng-if=\\\\\\\"editable\\\\\\\">\\\\n <button class=\\\\\\\"coral-Button coral-Button--quiet totem-DashboardInstrumentChrome-tool\\\\\\\" ng-click=\\\\\\\"duplicateInstrument($event)\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--copy coral-Icon--sizeM\\\\\\\"></i>\\\\n </button>\\\\n <button class=\\\\\\\"coral-Button coral-Button--quiet totem-DashboardInstrumentChrome-tool\\\\\\\" drag-handle>\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--move coral-Icon--sizeM\\\\\\\"></i>\\\\n </button>\\\\n <button class=\\\\\\\"coral-Button coral-Button--quiet totem-DashboardInstrumentChrome-tool\\\\\\\" ng-click=\\\\\\\"editInstrument()\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--edit coral-Icon--sizeM\\\\\\\"></i>\\\\n </button>\\\\n <button class=\\\\\\\"coral-Button coral-Button--quiet totem-DashboardInstrumentChrome-tool\\\\\\\" ng-click=\\\\\\\"removeInstrument()\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--delete coral-Icon--sizeM\\\\\\\"></i>\\\\n </button>\\\\n </div>\\\\n <div class=\\\\\\\"totem-DashboardInstrumentChrome-content\\\\\\\" ng-transclude/>\\\\n <div class=\\\\\\\"totem-DashboardInstrumentChrome-resizeThumb totem-DashboardInstrumentChrome-resizeThumb--right\\\\\\\" ng-if=\\\\\\\"editable\\\\\\\" resize-handle/>\\\\n <div class=\\\\\\\"totem-DashboardInstrumentChrome-resizeThumb totem-DashboardInstrumentChrome-resizeThumb--left\\\\\\\" ng-if=\\\\\\\"editable\\\\\\\" resize-handle=\\\\\\\"left\\\\\\\"/>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/dashboard-instrument-chrome.tpl.html\\n ** module id = 77\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-Rail totem-Rail--dashboardList\\\\\\\">\\\\n <ul class=\\\\\\\"totem-RailList coral-List coral-List--minimal\\\\\\\">\\\\n <li class=\\\\\\\"totem-RailList-item coral-List-item\\\\\\\" ng-repeat=\\\\\\\"dashboard in dashboards | orderBy:'name'\\\\\\\">\\\\n <button class=\\\\\\\"totem-RailList-itemButton\\\\\\\" ui-sref=\\\\\\\"dashboard.view({dashboardId: dashboard._id})\\\\\\\"\\\\n ng-class=\\\\\\\"{'is-selected': isActiveDashboard(dashboard)}\\\\\\\">{{ dashboard.name }}</button>\\\\n </li>\\\\n </ul>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/dashboard-rail.tpl.html\\n ** module id = 78\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-MediaDefinitionTrack\\\\\\\">\\\\n <media-definition-range\\\\n ng-repeat=\\\\\\\"mediaDefinition in mediaDefinitions\\\\\\\"\\\\n is-active=\\\\\\\"mediaDefinition === activeMediaDefinition\\\\\\\"\\\\n ng-style=\\\\\\\"getRangeStyle(mediaDefinition)\\\\\\\"\\\\n name=\\\\\\\"mediaDefinition.name\\\\\\\"\\\\n ng-click=\\\\\\\"activateMediaDefinition(mediaDefinition)\\\\\\\"></media-definition-range>\\\\n <div class=\\\\\\\"totem-MediaDefinitionThumb\\\\\\\"\\\\n ng-repeat=\\\\\\\"mediaDefinition in mediaDefinitions\\\\\\\"\\\\n ng-style=\\\\\\\"getThumbStyle(mediaDefinition)\\\\\\\"\\\\n ng-disabled=\\\\\\\"true\\\\\\\"\\\\n draggable\\\\n drag-handle\\\\n drag-begin=\\\\\\\"thumbDragBegin(mediaDefinition)\\\\\\\"\\\\n drag-continue=\\\\\\\"thumbDragContinue(mediaDefinition, rect)\\\\\\\"\\\\n drag-complete=\\\\\\\"thumbDragComplete(mediaDefinition)\\\\\\\"\\\\n constrain-drag=\\\\\\\"constrainThumbDrag(rect)\\\\\\\"></div>\\\\n <media-definition-rename-popover\\\\n thumb=\\\\\\\"popoverThumb\\\\\\\"\\\\n media-definition=\\\\\\\"popoverMediaDefinition\\\\\\\"\\\\n visible=\\\\\\\"renamePopoverVisibility.visible\\\\\\\"\\\\n ng-if=\\\\\\\"renamePopoverVisibility.visible\\\\\\\"\\\\n is-creating=\\\\\\\"false\\\\\\\"></media-definition-rename-popover>\\\\n <media-definition-rename-popover\\\\n thumb=\\\\\\\"popoverThumb\\\\\\\"\\\\n media-definition=\\\\\\\"popoverMediaDefinition\\\\\\\"\\\\n visible=\\\\\\\"createPopoverVisibility.visible\\\\\\\"\\\\n ng-if=\\\\\\\"createPopoverVisibility.visible\\\\\\\"\\\\n is-creating=\\\\\\\"true\\\\\\\"\\\\n cancel=\\\\\\\"cancelCreate();\\\\\\\"></media-definition-rename-popover>\\\\n <media-definition-delete-popover\\\\n thumb=\\\\\\\"popoverThumb\\\\\\\"\\\\n media-definition=\\\\\\\"popoverMediaDefinition\\\\\\\"\\\\n visible=\\\\\\\"deletePopoverVisibility.visible\\\\\\\"\\\\n ng-if=\\\\\\\"deletePopoverVisibility.visible\\\\\\\"></media-definition-delete-popover>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/media-definition-track.tpl.html\\n ** module id = 79\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<button class=\\\\\\\"totem-MediaDefinitionMenu-toggle\\\\\\\" ng-click=\\\\\\\"togglePopover($event)\\\\\\\">{{ 'mediaDefinitionMenuLabel' | i18n:{NUM_MEDIA_DEFINITIONS: mediaDefinitions.length} }}</button>\\\\n<div class=\\\\\\\"totem-MediaDefinitionMenu-popover\\\\\\\">\\\\n <div class=\\\\\\\"totem-MediaDefinitionMenu-row\\\\\\\" ng-repeat=\\\\\\\"mediaDefinition in mediaDefinitions\\\\\\\">\\\\n <button class=\\\\\\\"totem-MediaDefinitionMenu-definitionButton\\\\\\\"\\\\n ng-focus=\\\\\\\"rowChildFocus($event)\\\\\\\"\\\\n ng-blur=\\\\\\\"rowChildBlur($event)\\\\\\\"\\\\n ng-mouseenter=\\\\\\\"rowChildMouseenter($event)\\\\\\\"\\\\n ng-mouseleave=\\\\\\\"rowChildMouseleave($event)\\\\\\\"\\\\n ng-click=\\\\\\\"activateMediaDefinition(mediaDefinition)\\\\\\\">\\\\n <span class=\\\\\\\"totem-MediaDefinitionMenu-nameLabel\\\\\\\">{{ mediaDefinition.name }}</span>\\\\n </button>\\\\n <button class=\\\\\\\"totem-MediaDefinitionMenu-iconButton totem-MediaDefinitionMenu-editButton coral-Button coral-Button--square coral-Button--quiet\\\\\\\"\\\\n title=\\\\\\\"{{ 'editMediaDefinition' | i18n:{NAME: mediaDefinition.name} }}\\\\\\\"\\\\n ng-focus=\\\\\\\"rowChildFocus($event)\\\\\\\"\\\\n ng-blur=\\\\\\\"rowChildBlur($event)\\\\\\\"\\\\n ng-mouseenter=\\\\\\\"rowChildMouseenter($event)\\\\\\\"\\\\n ng-mouseleave=\\\\\\\"rowChildMouseleave($event)\\\\\\\"\\\\n ng-click=\\\\\\\"editMediaDefinition(mediaDefinition)\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--edit\\\\\\\"></i>\\\\n </button>\\\\n <button class=\\\\\\\"totem-MediaDefinitionMenu-iconButton totem-MediaDefinitionMenu-deleteButton coral-Button coral-Button--square coral-Button--quiet\\\\\\\"\\\\n title=\\\\\\\"{{ 'deleteMediaDefinition' | i18n:{NAME: mediaDefinition.name} }}\\\\\\\"\\\\n ng-focus=\\\\\\\"rowChildFocus($event)\\\\\\\"\\\\n ng-blur=\\\\\\\"rowChildBlur($event)\\\\\\\"\\\\n ng-mouseenter=\\\\\\\"rowChildMouseenter($event)\\\\\\\"\\\\n ng-mouseleave=\\\\\\\"rowChildMouseleave($event)\\\\\\\"\\\\n ng-click=\\\\\\\"deleteMediaDefinition(mediaDefinition)\\\\\\\"\\\\n ng-disabled=\\\\\\\"mediaDefinitions.length <= 1\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--delete\\\\\\\"></i>\\\\n </button>\\\\n </div>\\\\n <div class=\\\\\\\"totem-MediaDefinitionMenu-row\\\\\\\">\\\\n <button class=\\\\\\\"totem-MediaDefinitionMenu-definitionButton\\\\\\\"\\\\n ng-focus=\\\\\\\"rowChildFocus($event)\\\\\\\"\\\\n ng-blur=\\\\\\\"rowChildBlur($event)\\\\\\\"\\\\n ng-mouseenter=\\\\\\\"rowChildMouseenter($event)\\\\\\\"\\\\n ng-mouseleave=\\\\\\\"rowChildMouseleave($event)\\\\\\\"\\\\n ng-click=\\\\\\\"addMediaDefinition(mediaDefinition)\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--add\\\\\\\"></i>\\\\n <span class=\\\\\\\"totem-MediaDefinitionMenu-addLabel\\\\\\\">{{ 'addMediaDefinition' | i18n }}</span>\\\\n </button>\\\\n </div>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/media-definition-menu.tpl.html\\n ** module id = 80\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-DashboardInstrument\\\\\\\">\\\\n <div class=\\\\\\\"coral-Wait coral-Wait--large coral-Wait--center\\\\\\\" ng-show=\\\\\\\"showProgress && !showFailure\\\\\\\"></div>\\\\n <div class=\\\\\\\"js-totem-DashboardInstrument-render totem-DashboardInstrument-render\\\\\\\" ng-class=\\\\\\\"{'totem-DashboardInstrument-render--hidden': showProgress || showFailure}\\\\\\\"></div>\\\\n <div class=\\\\\\\"totem-DashboardInstrument-failure\\\\\\\" ng-show=\\\\\\\"showFailure\\\\\\\">{{ 'instrumentFailure' | i18n }}</div>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/instrument/directives/instrument.tpl.html\\n ** module id = 81\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<cui-modal visible=\\\\\\\"visible\\\\\\\" backdrop=\\\\\\\"backdrop\\\\\\\" buttons=\\\\\\\"buttons\\\\\\\">\\\\n\\\\t<span header>Choose an instrument type</span>\\\\n\\\\t<div content>\\\\n\\\\t\\\\t<button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"totem-ActionButton coral-Button coral-Button-secondary\\\\\\\" ng-click=\\\\\\\"addInstrument('text');\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\">Text</button>\\\\n\\\\t\\\\t<button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"totem-ActionButton coral-Button coral-Button-secondary\\\\\\\" ng-click=\\\\\\\"addInstrument('dv');\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\">DV</button>\\\\n\\\\t</div>\\\\n</cui-modal>\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/instrument/directives/new-instrument-configuration.tpl.html\\n ** module id = 82\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = {\\n\\tinsertInstrumentAtLayoutBottom: function(instrument, dashboard, gridSpacing, uuidGenerator) {\\n\\t\\tvar mediaDefinitions = dashboard.mediaDefinitions;\\n\\t\\tvar mediaLayouts = dashboard.mediaLayouts;\\n\\t\\tvar pages = dashboard.pages;\\n\\t\\tvar defaultMargin = 1;\\n\\t\\tvar defaultHeight = 40;\\n\\n\\t\\tpages.forEach(function(page) {\\n\\t\\t\\tmediaDefinitions.forEach(function(mediaDefinition) {\\n\\t\\t\\t\\tvar maxY = 0;\\n\\t\\t\\t\\tvar layoutsByDefinition = mediaLayouts.filter(function(mediaLayout) {\\n\\t\\t\\t\\t\\treturn mediaLayout.mediaDefinitionId === mediaDefinition._id;\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\tlayoutsByDefinition.forEach(function(mediaLayout) {\\n\\t\\t\\t\\t\\tmaxY = Math.max(mediaLayout.y + mediaLayout.height, maxY);\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\tmediaLayouts.push({\\n\\t\\t\\t\\t\\t_id: uuidGenerator(),\\n\\t\\t\\t\\t\\tinstrumentId: instrument._id,\\n\\t\\t\\t\\t\\tmediaDefinitionId: mediaDefinition._id,\\n\\t\\t\\t\\t\\tpageId: page._id,\\n\\t\\t\\t\\t\\tx: 1,\\n\\t\\t\\t\\t\\ty: maxY + defaultMargin,\\n\\t\\t\\t\\t\\twidth: mediaDefinition.width / gridSpacing - 2,\\n\\t\\t\\t\\t\\theight: defaultHeight\\n\\t\\t\\t\\t});\\n\\t\\t\\t});\\n\\t\\t});\\n\\t}\\n};\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./common/dashboard-util.js\\n ** module id = 83\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = function(config, eventBus) {\\n eventBus.publish('dataLoaded');\\n return config.html;\\n};\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/demo-html/renderer/renderer.js\\n ** module id = 84\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nvar moduleName = 'totem.dv.editor';\\nangular.module('totem').requires.push(moduleName);\\nangular.module(moduleName, [\\n 'adobe.drag-drop',\\n 'infinite-scroll'\\n ])\\n .service('rsDataAdapter', require('./adapters/rs/adapter'))\\n .service('dataSourcesService', require('./services/data-sources-service'))\\n .service('dvConfigService', require('./services/dv-config-service'))\\n .constant('aestheticDefaults', require('./services/aesthetic-defaults'))\\n .directive('yAestheticConfiguration', require('./directives/y-aesthetic-configuration'))\\n .directive('variableConfiguration', require('./directives/variable-configuration'))\\n .directive('dimensionPod', require('./directives/dimension-pod'))\\n .controller('DataPanelCtrl', require('./controllers/data-panel-ctrl'))\\n .controller('LineCtrl', require('./controllers/line-ctrl'));\\n\\nmodule.exports = function(renderer, config, eventBus) {\\n var editor = $(require('./editor.html'));\\n editor.find('.totem-dv-Editor-renderer').append(renderer);\\n return editor;\\n};\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/editor.js\\n ** module id = 85\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nvar MELT_COLUMN = require('../enum/melt-column');\\n\\nvar getMeltedColumnName = function(meltColumn, refIds) {\\n return meltColumn + refIds.join(':');\\n};\\n\\nvar moduleName = 'totem.dv.renderer';\\nangular.module('totem').requires.push(moduleName);\\nangular.module(moduleName, [])\\n .directive('dv', function($http, $q, $timeout, ims, aestheticDefaults){\\n var linker = function(scope, element, attrs) {\\n /**\\n * A $q deferreds which can be resolved in order to cancel outstanding data request.\\n */\\n var requestCanceler;\\n\\n /**\\n * The data frame object. Contains data formatted appropriately for DV.\\n */\\n var dataFrame;\\n\\n /**\\n * The parameters that were last used to request data. Used to determine if we need to load new data or if we\\n * can use data that was previously loaded and cached.\\n */\\n var previousRequestParams;\\n\\n /**\\n * The deferred created when loadData() is called. Represts the data loading process.\\n */\\n var loadDataDeferred;\\n\\n /**\\n * Whether data loading was forcefully canceled (generally by calling loadData() before the prior data loading\\n * request has been fulfilled.\\n * @type {boolean}\\n */\\n var loadDataCanceled = false;\\n\\n /**\\n * The response data.\\n */\\n var data;\\n\\n /**\\n * Create data columns object based off column sources and returned data.\\n * @param data Data returned from data service.\\n */\\n var createDataFrame = function(data) {\\n var sourceMappings = scope.config.sourceMappings;\\n\\n dataFrame = {};\\n\\n for (var key in sourceMappings) {\\n var columnName;\\n var sourceMapping = sourceMappings[key];\\n\\n if (angular.isObject(sourceMapping)) {\\n columnName = getMeltedColumnName(sourceMapping.column, sourceMapping.refIds);\\n } else {\\n columnName = sourceMapping;\\n }\\n\\n dataFrame[key] = data[columnName];\\n }\\n };\\n\\n var getMelts = function(sourceMappings) {\\n var melts = [];\\n\\n // TODO: Avoid looping?\\n var findMeltForRefIds = function(refIds) {\\n for (var i = 0; i < melts.length; i++) {\\n var melt = melts[i];\\n if (angular.equals(melt.columns, refIds)) {\\n return melt;\\n }\\n }\\n };\\n\\n for (var key in sourceMappings) {\\n var sourceMapping = sourceMappings[key];\\n var refIds = sourceMapping.refIds;\\n\\n if (angular.isObject(sourceMapping)) {\\n if (!findMeltForRefIds(refIds)) {\\n melts.push({\\n columns: sourceMapping.refIds,\\n variableName: getMeltedColumnName(MELT_COLUMN.VARIABLE, refIds),\\n valueName: getMeltedColumnName(MELT_COLUMN.VALUE, refIds)\\n });\\n }\\n }\\n }\\n\\n return melts;\\n };\\n\\n /**\\n * Loads data based on the configuration, replaces data in the dv spec, then renders the chart.\\n * @param {Function} callback A function to call when data is done loading. The callback pattern is used instead\\n * of returning a promise because $q promises are resolved asynchronously. When a user is modifying a mapping\\n * that does not require new data to be fetched from the server (for example, modifying the line size of the chart\\n * by dragging a slider) we want render to be called immediately rather than having a progress indicator\\n * show up between when loadData is called and when render is called.\\n */\\n var loadData = function() {\\n if (loadDataDeferred) {\\n loadDataDeferred.reject();\\n }\\n\\n loadDataDeferred = $q.defer();\\n\\n var cancelOutstandingRequest = function() {\\n if (requestCanceler) {\\n requestCanceler.resolve();\\n loadDataCanceled = true;\\n }\\n };\\n\\n if (scope.config.spec.data && scope.config.spec.data.frame) {\\n cancelOutstandingRequest();\\n dataFrame = scope.config.spec.data.frame;\\n loadDataDeferred = loadDataDeferred || $q.defer();\\n loadDataDeferred.resolve();\\n return loadDataDeferred.promise;\\n }\\n\\n if (!scope.config.source ||\\n !scope.config.source.query ||\\n !scope.config.source.version ||\\n !scope.config.sourceMappings) {\\n cancelOutstandingRequest();\\n scope.eventBus.publish('failed');\\n loadDataDeferred = loadDataDeferred || $q.defer();\\n loadDataDeferred.reject();\\n return loadDataDeferred.promise;\\n }\\n\\n var source = scope.config.source;\\n\\n var requestParams = {\\n query: source.query,\\n melts: getMelts(scope.config.sourceMappings)\\n };\\n\\n // If the data we're requesting is the same as the data we last requested then there's no need to\\n // re-request it. We'll return the previous promise. If it's different, reject the last promise because\\n // we'll be making a new request for the new request params.\\n if (data && previousRequestParams && angular.equals(requestParams, previousRequestParams)) {\\n // config.sourceMappings may have changed even though we're dealing with the same underling data. We'll\\n // re-create the data frame to ensure they are in sync.\\n createDataFrame(data);\\n loadDataDeferred.resolve();\\n return loadDataDeferred.promise;\\n }\\n\\n scope.eventBus.publish('processing');\\n\\n requestCanceler = $q.defer();\\n $http({\\n method: 'POST',\\n url: '/reporting-services/' + source.version + '/query/',\\n // params: {\\n // useCache: 1\\n // },\\n data: requestParams,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n },\\n timeout: requestCanceler.promise\\n }).then(function(response) {\\n data = response.data;\\n createDataFrame(data);\\n loadDataDeferred.resolve();\\n }).catch(function(response) {\\n // If we forcibly canceled data loading then it didn't technically \\\"fail\\\"\\n if (!loadDataCanceled) {\\n scope.eventBus.publish('failed');\\n loadDataDeferred.reject();\\n }\\n\\n loadDataCanceled = false;\\n });\\n\\n previousRequestParams = angular.copy(requestParams);\\n return loadDataDeferred.promise;\\n };\\n\\n /**\\n * Adds aesthetic mapping defaults where such aesthetics have not been defined. This is generally used\\n * so we don't have to rely on DV's defaults.\\n *\\n * @param spec\\n * @param layer\\n */\\n var addAestheticMappingDefaultsToLayer = function(spec, layer) {\\n var uppercaseType = layer.type.toUpperCase();\\n\\n if (aestheticDefaults[uppercaseType] && aestheticDefaults[uppercaseType].MAPPINGS) {\\n var mappingDefaults = aestheticDefaults[uppercaseType].MAPPINGS;\\n for (var mapping in mappingDefaults) {\\n if ((!spec.mappings || spec.mappings[mapping] === undefined) &&\\n (!layer.mappings || layer.mappings[mapping] === undefined)) {\\n layer.mappings = layer.mappings || {};\\n layer.mappings[mapping] = mappingDefaults[mapping];\\n }\\n }\\n }\\n };\\n\\n /**\\n * Renders the chart.\\n */\\n var render = function() {\\n if (!dataFrame) {\\n return;\\n }\\n\\n // The instrument may be in the midst of changing sizes (like when moving between media definitions). We\\n // want to wait a bit so that we render at the new element size.\\n $timeout(function(){\\n if (element.width() > 0 && element.height() > 0) {\\n var specCopy = angular.copy(scope.config.spec);\\n specCopy.parent = element[0];\\n specCopy.duration = 0;\\n specCopy.width = '100%';\\n specCopy.height = '100%';\\n specCopy.data = specCopy.data || {};\\n specCopy.data.frame = dataFrame;\\n\\n specCopy.layers.forEach(function(layer) {\\n addAestheticMappingDefaultsToLayer(specCopy, layer);\\n });\\n\\n try {\\n dv.chart(specCopy);\\n } catch (e) {\\n scope.eventBus.publish('failed');\\n throw e;\\n }\\n }\\n });\\n\\n scope.eventBus.publish('processed');\\n };\\n\\n scope.eventBus.subscribe('resizing', function() {\\n scope.eventBus.publish('processing');\\n }, scope);\\n\\n scope.eventBus.subscribe('resized', render, scope);\\n\\n scope.$watch('config', function(config) {\\n if (config) {\\n loadData().then(render);\\n }\\n }, true);\\n };\\n\\n return {\\n restrict: 'E',\\n link: linker,\\n scope: true\\n };\\n });\\n\\nmodule.exports = function(config, eventBus) {\\n return '<dv class=\\\"totem-dv-Renderer\\\"></dv>';\\n};\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/renderer/renderer.js\\n ** module id = 86\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = function(config, eventBus) {\\n var html = '' +\\n '<div class=\\\"keyMetric-Renderer\\\">' +\\n ' <div class=\\\"keyMetric-Renderer-content\\\">' +\\n ' <i class=\\\"keyMetric-Renderer-icon coral-Icon coral-Icon--thumbDown\\\"></i>' +\\n ' <span class=\\\"keyMetric-Renderer-value\\\">' + config.value + '</span>' +\\n ' <span class=\\\"keyMetric-Renderer-label\\\">' + config.label + '</span>' +\\n ' </div>' +\\n '</div>';\\n eventBus.publish('dataLoaded');\\n return html;\\n};\\n\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/key-metric/renderer/renderer.js\\n ** module id = 87\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = function(config, eventBus) {\\n eventBus.publish('dataLoaded');\\n return 'Hello from Starfield.';\\n};\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/starfield/renderer/renderer.js\\n ** module id = 88\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\n/* global Quill: true */\\n\\nvar moduleName = 'totem.text.editor';\\nangular.module('totem').requires.push(moduleName);\\nangular.module(moduleName, [])\\n .controller('TxtCtrl', function($scope, $timeout) {\\n\\n $scope.instrument.config = $scope.instrument.config || {};\\n\\n var toolbarScope = null;\\n var quill = null;\\n var formatList = [];\\n var toolbar = null;\\n\\n // Transfers cursor/selection state to toolbar controls.\\n this.sendState = function(delta, source) {\\n $scope.$apply(function() {\\n if(toolbarScope) {\\n var attributes = attributesOverRange();\\n if(attributes) {\\n toolbarScope.setState(attributes);\\n }\\n }\\n $scope.instrument.config.html = quill.getHTML();\\n }.bind(this));\\n };\\n\\n // Determines text attributes for the current cursor/selection\\n function attributesOverRange() {\\n var range = quill.getSelection();\\n if(!range) {\\n return;\\n }\\n var delta = quill.getContents();\\n var current = 0;\\n var rangeAttributes = {};\\n var inspectStart = range.start;\\n var inspectEnd = range.end;\\n if(range.isCollapsed()) {\\n inspectStart -= 1;\\n }\\n for(var i = 0; i < delta.ops.length; i++) {\\n var insertStart = current;\\n var insertEnd = current + delta.ops[i].insert.length;\\n var val, key;\\n if(insertEnd > inspectStart && insertStart < inspectEnd) {\\n for(var j = 0; j < formatList.length; j++) {\\n key = formatList[j];\\n val = undefined;\\n if(key == 'align' || key == 'bullet' || key == 'list') {\\n // Detect line styles\\n var lookahead = 1;\\n // Cursor at beginning of a new line. Look forward for format data.\\n if(delta.ops[i].insert && delta.ops[i].insert == '\\\\n' && range.isCollapsed()) {\\n lookahead = 2;\\n }\\n // There's no newline in the insert, or the selection ends after the last newline.\\n if(delta.ops[i].insert && delta.ops[i].insert.indexOf('\\\\n') == -1 || insertStart + delta.ops[i].insert.lastIndexOf('\\\\n') < inspectEnd) {\\n // Look ahead for attributes on next insert containing a newline\\n while(delta.ops[i + lookahead] && delta.ops[i + lookahead].insert) {\\n if(delta.ops[i + lookahead].insert.indexOf('\\\\n') != -1) {\\n delta.ops[i + lookahead].attributes = delta.ops[i + lookahead].attributes || {};\\n val = delta.ops[i + lookahead].attributes[key];\\n break;\\n }\\n lookahead++;\\n }\\n }\\n } else {\\n // Detect word/char styles\\n if(delta.ops[i].attributes && delta.ops[i].attributes[key]) {\\n val = delta.ops[i].attributes[key];\\n }\\n }\\n if(rangeAttributes[key]) {\\n if(rangeAttributes[key].indexOf(val) == -1) {\\n rangeAttributes[key].push(val);\\n }\\n } else {\\n rangeAttributes[key] = [val];\\n }\\n }\\n }\\n current += delta.ops[i].insert.length;\\n }\\n return rangeAttributes;\\n }\\n\\n // Sets Quill RTE instance from editor.\\n this.setQuill = function(quillInstance) {\\n quill = quillInstance;\\n quill.setHTML($scope.instrument.config.html);\\n quill.on('text-change', this.sendState.bind(this));\\n quill.on('selection-change', this.sendState.bind(this));\\n if(toolbar) {\\n quill.addModule('toolbar', {container: toolbar});\\n }\\n };\\n\\n // Sets toolbar instance from toolbar.\\n this.setToolbar = function(toolbarElem, scope, toolbarFormatList) {\\n toolbar = toolbarElem;\\n toolbarScope = scope;\\n formatList = toolbarFormatList;\\n if(quill) {\\n quill.addModule('toolbar', {container: toolbar});\\n }\\n };\\n\\n // Used by the toolbar to set formats on selected text in the editor.\\n this.applyFormat = function(format, value) {\\n if(quill) {\\n // Some listener inside quill.focus() is causing scope errors.\\n // using this temp solution\\n $timeout(function() {\\n quill.focus();\\n var range = quill.getSelection();\\n if(range && !range.isCollapsed()) {\\n quill.formatText(range.start, range.end, format, value);\\n } else if (range && range.isCollapsed()) {\\n quill.prepareFormat(format, value);\\n }\\n }, 0);\\n }\\n };\\n })\\n .directive('quill', function() {\\n return {\\n restrict: 'E',\\n controller: 'TxtCtrl',\\n transclude: true,\\n replace: true,\\n template: require('./directives/quill.html')\\n };\\n })\\n .directive('quillToolbar', function() {\\n return {\\n require: '^quill',\\n restrict: 'E',\\n transclude: true,\\n replace: true,\\n template: require('./directives/quill-toolbar.html'),\\n controller: function($scope) {\\n\\n // Used by the editor to set the state of the toolbar\\n // based on selected text/cursor position.\\n $scope.setState = function(attributes) {\\n angular.forEach(attributes, function(values, format) {\\n var newFormatValue;\\n if(attributes[format].length === 1) {\\n switch(format) {\\n case 'font':\\n case 'size':\\n case 'align':\\n if(values[0] === undefined) {\\n newFormatValue = $scope[format + 'Options'][1];\\n } else {\\n for(var i = 0; i < $scope[format + 'Options'].length; i++) {\\n if($scope[format + 'Options'][i].value === values[0].replace(/'/g, '')) {\\n newFormatValue = $scope[format + 'Options'][i];\\n }\\n }\\n }\\n break;\\n default:\\n newFormatValue = values[0];\\n }\\n }\\n $scope.format[format] = newFormatValue;\\n });\\n };\\n\\n $scope.fontOptions = [\\n {\\n label: '',\\n value: ''\\n },\\n {\\n label: 'Sans Serif',\\n value: 'sans-serif'\\n },\\n {\\n label: 'Serif',\\n value: 'serif',\\n },\\n {\\n label: 'Monospace',\\n value: 'monospace'\\n },\\n {\\n label: 'Silly',\\n value: 'Comic Sans MS'\\n },\\n {\\n label: 'Heavy',\\n value: 'Impact'\\n }\\n ];\\n\\n $scope.sizeOptions = [\\n {\\n label: '',\\n value: ''\\n },\\n {\\n label: 'Normal',\\n value: '13px',\\n },\\n {\\n label: 'Small',\\n value: '10px'\\n },\\n {\\n label: 'Large',\\n value: '18px'\\n },\\n {\\n label: 'Huge',\\n value: '32px'\\n }\\n ];\\n\\n $scope.alignOptions = [\\n {\\n label: '',\\n value: ''\\n },\\n {\\n label: 'Left',\\n value: 'left'\\n },\\n {\\n label: 'Center',\\n value: 'center'\\n },\\n {\\n label: 'Right',\\n value: 'right'\\n },\\n {\\n label: 'Justify',\\n value: 'justify'\\n }\\n ];\\n\\n $scope.format = {\\n font: $scope.fontOptions[1],\\n size: $scope.sizeOptions[1],\\n align: $scope.alignOptions[1],\\n bold: false,\\n italic: false,\\n underline: false,\\n bullet: false,\\n list: false\\n };\\n },\\n link: function(scope, element, attrs, txtCtrl) {\\n scope.$evalAsync(function(){\\n txtCtrl.setToolbar(element.get(0), scope, Object.keys(scope.format));\\n });\\n scope.applyFormat = function(name) {\\n var selectedFormat = scope.format[name];\\n if(selectedFormat.value) {\\n selectedFormat = selectedFormat.value;\\n }\\n txtCtrl.applyFormat(name, selectedFormat);\\n };\\n }\\n };\\n })\\n .directive('quillEditor', function() {\\n return {\\n require: '^quill',\\n restrict: 'E',\\n transclude: true,\\n replace: true,\\n template: require('./directives/quill-editor.html'),\\n controller: function() {\\n },\\n link: function(scope, element, attrs, txtCtrl) {\\n scope.$evalAsync(function(){\\n txtCtrl.setQuill(new Quill(element.get(0)));\\n });\\n }\\n };\\n })\\n;\\n\\nmodule.exports = function(renderer, config, eventBus) {\\n var editor = $(require('./editor.html'));\\n return editor;\\n};\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/text/editor/editor.js\\n ** module id = 89\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nvar moduleName = 'totem.text.renderer';\\nangular.module('totem').requires.push(moduleName);\\nangular.module(moduleName, [])\\n .directive('text', function(){\\n var linker = function(scope, element, attrs) {\\n scope.$watch('config', function(config) {\\n config = config || {};\\n element.html(config.html);\\n }, true);\\n };\\n\\n return {\\n restrict: 'E',\\n link: linker,\\n scope: true\\n };\\n });\\n\\nmodule.exports = function() {\\n return '<text class=\\\"totem-text-Renderer\\\"></text>';\\n};\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/text/renderer/renderer.js\\n ** module id = 90\\n ** module chunks = 0\\n **/\",\"'use strict';\\nvar moduleName = 'totem.twitterTrends';\\nangular.module('totem').requires.push(moduleName);\\nangular.module(moduleName, [])\\n .directive('twitterTrends', function($http){\\n var linker = function(scope, element, attrs) {\\n scope.trends = [];\\n scope.loadTrends = function(){\\n scope.eventBus.publish('dataLoading');\\n $http.jsonp('http://api.whatthetrend.com/api/v2/trends.json?woeid=' + scope.config.woeid + '&callback=JSON_CALLBACK').then(function(response){\\n scope.trends = response.data.trends;\\n scope.eventBus.publish('dataLoaded');\\n });\\n };\\n\\n scope.$watch('config', scope.loadTrends, true);\\n scope.loadTrends();\\n };\\n\\n return {\\n restrict: 'E',\\n link: linker,\\n scope: true,\\n template: '' +\\n '<div id=\\\"trends-Container\\\">' +\\n ' <h1 class=\\\"trends-Title\\\">{{config.locationName}}</h1>' +\\n ' <div class=\\\"trends-Trend\\\" ng-repeat=\\\"trend in trends\\\">' +\\n ' <a href=\\\"https://twitter.com/search?q={{trend.name}}\\\" target=\\\"_new\\\">{{trend.name}}</a>' +\\n ' </div>' +\\n '</div>'\\n };\\n });\\n\\nmodule.exports = function(config, eventBus) {\\n return '<twitter-trends />';\\n};\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/twitter-trends/renderer/renderer.js\\n ** module id = 91\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.invalidShareActionAlert', [])\\n .directive('invalidShareActionAlert', function($compile, $timeout) {\\n return {\\n restrict: 'E',\\n scope: {\\n show: '=',\\n message: '='\\n },\\n link: function(scope, element, attrs) {\\n var initialized = false;\\n scope.$watch('show', function(show) {\\n if (show && !initialized) {\\n // We deal with the template here instead of specifying a template on the directive's return\\n // object just for optimization purposes. We won't build the alert until it's actually needed.\\n var template = require('./invalid-share-action-alert.tpl.html');\\n element.empty().append($compile(template)(scope));\\n\\n // Give time for the tooltip to bind to scope.message before tooltip can be properly positioned.\\n $timeout(function() {\\n var $tooltip = element.find('.js-totem-RemoveParticipantAlert-tooltip');\\n var $icon = element.find('.js-totem-RemoveParticipantAlert-icon');\\n new CUI.Tooltip({\\n element: $tooltip,\\n target: $icon,\\n arrow: 'top'\\n });\\n $tooltip.show();\\n });\\n\\n initialized = true;\\n }\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/invalid-share-action-alert.js\\n ** module id = 92\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.userSearch', [\\n require('../services/user-service').name\\n ])\\n .directive('userSearch', function(userService, i18nFilter) {\\n\\n var getSublistElement = function(entities, header) {\\n if (entities.length) {\\n var html = '<li class=\\\"coral-SelectList-item coral-SelectList-item--optgroup\\\">' +\\n '<span class=\\\"coral-SelectList-groupHeader\\\">' + header + '</span>' +\\n '<ul class=\\\"coral-SelectList-sublist\\\">';\\n\\n for (var i = 0; i < entities.length; i++) {\\n var entity = entities[i];\\n html += '<li class=\\\"coral-SelectList-item coral-SelectList-item--option\\\" data-value=\\\"' + entity._id + '\\\">' +\\n entity.displayName + '</li>';\\n }\\n\\n html += '</ul>';\\n return $(html);\\n }\\n };\\n\\n return {\\n restrict: 'EA',\\n template: require('./user-search.tpl.html'),\\n scope: {\\n selectUser: '&',\\n selectGroup: '&'\\n },\\n link: function(scope, element, attrs) {\\n var groups;\\n var users;\\n var autocompleteElement = element.find('.coral-Autocomplete');\\n\\n var autocomplete = new CUI.Autocomplete({\\n element: autocompleteElement,\\n selectlistConfig: {\\n type: 'dynamic',\\n loadData: function() {\\n var deferred = $.Deferred();\\n\\n // dataadditional is null when the user hits the down arrow key without having entered any text\\n // into the input.\\n if (this.options.dataadditional &&\\n this.options.dataadditional.query &&\\n this.options.dataadditional.query.length) {\\n var self = this;\\n userService.search(this.options.dataadditional.query).then(function(results) {\\n users = results.users;\\n groups = results.groups;\\n\\n // Improved APIs coming!\\n // https://git.corp.adobe.com/Coral/coralui-component-selectlist/pull/11\\n\\n var $groups = getSublistElement(groups, i18nFilter('groups'));\\n\\n if ($groups) {\\n self._makeAccessibleListOption($groups);\\n self.$element.append($groups);\\n }\\n\\n var $users = getSublistElement(users, i18nFilter('users'));\\n\\n if ($users) {\\n self._makeAccessibleListOption($users);\\n self.$element.append($users);\\n }\\n\\n self._loadingComplete = true;\\n\\n deferred.resolve();\\n }).catch(function(error) {\\n deferred.reject(error);\\n });\\n } else {\\n deferred.resolve();\\n }\\n\\n return deferred.promise();\\n }\\n }\\n });\\n\\n autocompleteElement.on('change:value', function(event, payload) {\\n scope.$apply(function() {\\n var id = payload.value;\\n\\n for (var i = 0; i < users.length; i++) {\\n var user = users[i];\\n if (user._id === id) {\\n scope.selectUser({user: user});\\n }\\n }\\n\\n for (var j = 0; j < groups.length; j++) {\\n var group = groups[i];\\n if (group._id === id) {\\n scope.selectGroup({group: group});\\n }\\n }\\n\\n autocomplete.clear();\\n });\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/user-search.js\\n ** module id = 93\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<cui-modal visible=\\\\\\\"visible\\\\\\\">\\\\n <span header>{{ participable.name }}</span>\\\\n\\\\n <table content class=\\\\\\\"coral-Table totem-ShareTable\\\\\\\">\\\\n <thead>\\\\n <tr class=\\\\\\\"coral-Table-row\\\\\\\">\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ShareTable-headerCell--remove\\\\\\\"></th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ShareTable-headerCell--name\\\\\\\" ng-click=\\\\\\\"setSort('entity.displayName')\\\\\\\" sort-header>\\\\n Name\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === 'entity.displayName'\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ShareTable-headerCell--owner\\\\\\\" ng-click=\\\\\\\"setSort(isOwner)\\\\\\\" sort-header>\\\\n Owner\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === isOwner\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ShareTable-headerCell--scheduled\\\\\\\" ng-click=\\\\\\\"setSort(isScheduled)\\\\\\\" sort-header ng-show=\\\\\\\"false\\\\\\\">\\\\n Scheduled\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === isScheduled\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n </tr>\\\\n </thead>\\\\n <tbody>\\\\n <tr class=\\\\\\\"coral-Table-row\\\\\\\" ng-repeat=\\\\\\\"participant in getParticipants() | orderBy:sortPredicate:sortReverse\\\\\\\">\\\\n <td class=\\\\\\\"coral-Table-cell totem-ShareTable-cell--remove\\\\\\\">\\\\n <button ng-click=\\\\\\\"removeParticipant(participant, $event)\\\\\\\" ng-show=\\\\\\\"invalidRemoveOwnerParticipant !== participant\\\\\\\" class=\\\\\\\"coral-Button coral-Button--square coral-Button--quiet\\\\\\\" title=\\\\\\\"{{ 'removeParticipant' | i18n }}\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--sizeXS coral-Icon--close\\\\\\\"></i>\\\\n </button>\\\\n <invalid-share-action-alert show=\\\\\\\"invalidRemoveOwnerParticipant === participant\\\\\\\" message=\\\\\\\"'invalidRemoveOwnerDescription' | i18n:{NAME: participant.entity.displayName}\\\\\\\"></invalid-share-action-alert>\\\\n </td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ShareTable-cell--name\\\\\\\">{{ participant.entity.displayName }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ShareTable-cell--owner\\\\\\\">\\\\n <label class=\\\\\\\"coral-Switch\\\\\\\" ng-show=\\\\\\\"invalidRevokeOwnershipParticipant !== participant\\\\\\\">\\\\n <input class=\\\\\\\"coral-Switch-input\\\\\\\" type=\\\\\\\"checkbox\\\\\\\" ng-checked=\\\\\\\"{{ participant.isOwner }}\\\\\\\" ng-click=\\\\\\\"setOwnerRole(participant, $event)\\\\\\\">\\\\n <span class=\\\\\\\"coral-Switch-offLabel\\\\\\\">No</span><span class=\\\\\\\"coral-Switch-onLabel\\\\\\\">Yes</span>\\\\n </label>\\\\n <invalid-share-action-alert show=\\\\\\\"invalidRevokeOwnershipParticipant === participant\\\\\\\" message=\\\\\\\"'invalidRevokeOwnershipDescription' | i18n:{NAME: participant.entity.displayName}\\\\\\\"></invalid-share-action-alert>\\\\n </td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ShareTable-cell--scheduled\\\\\\\" ng-show=\\\\\\\"false\\\\\\\">\\\\n <label class=\\\\\\\"coral-Checkbox\\\\\\\">\\\\n <input class=\\\\\\\"coral-Checkbox-input\\\\\\\" type=\\\\\\\"checkbox\\\\\\\" ng-checked=\\\\\\\"participant.isScheduled\\\\\\\" ng-click=\\\\\\\"setScheduled(participant, $event.target.checked)\\\\\\\">\\\\n <span class=\\\\\\\"coral-Checkbox-checkmark\\\\\\\"></span>\\\\n </label>\\\\n </td>\\\\n </tr>\\\\n </tbody>\\\\n </table>\\\\n\\\\n <div template class=\\\\\\\"coral-Modal totem-ShareModal\\\\\\\">\\\\n <div class=\\\\\\\"coral-Modal-header totem-ShareModal-header\\\\\\\">\\\\n <i class=\\\\\\\"coral-Modal-typeIcon coral-Icon coral-Icon--sizeS\\\\\\\"></i>\\\\n <h2 class=\\\\\\\"coral-Modal-title coral-Heading coral-Heading--2\\\\\\\"></h2>\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-MinimalButton coral-Modal-closeButton\\\\\\\" title=\\\\\\\"{{ 'cancel' | i18n }}\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--sizeXS coral-Icon--close coral-MinimalButton-icon\\\\\\\"></i>\\\\n </button>\\\\n <user-search select-user=\\\\\\\"addParticipant(user)\\\\\\\" select-group=\\\\\\\"addParticipant(group)\\\\\\\"></user-search>\\\\n </div>\\\\n <div class=\\\\\\\"coral-Modal-body totem-ShareModal-body\\\\\\\">Content</div>\\\\n <div class=\\\\\\\"coral-Modal-footer\\\\\\\">\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-Button coral-Button--quiet\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\">{{ 'cancel' | i18n }}</button>\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-Button coral-Button--primary\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\" ng-click=\\\\\\\"save()\\\\\\\">{{ 'save' | i18n }}</button>\\\\n </div>\\\\n </div>\\\\n</cui-modal>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/share.tpl.html\\n ** module id = 94\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-AdHocDataUpload-dropTarget\\\\\\\">\\\\n <span ng-if=\\\\\\\"!uploadFileName && !uploading\\\\\\\" ng-bind-html=\\\\\\\"dropLabel\\\\\\\"></span>\\\\n <div ng-if=\\\\\\\"uploading\\\\\\\" class=\\\\\\\"coral-Progress\\\\\\\"><div class=\\\\\\\"coral-Progress-bar\\\\\\\"><div class=\\\\\\\"coral-Progress-status\\\\\\\" ng-style=\\\\\\\"{width: percentProgress}\\\\\\\"></div></div></div>\\\\n <span ng-if=\\\\\\\"uploadFileName\\\\\\\">{{ uploadFileName }}</span>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/directives/ad-hoc-file-upload.tpl.html\\n ** module id = 95\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.dragResizeUtil', [])\\n .factory('dragResizeUtil', function($document) {\\n\\n /**\\n * Gets the X position of the pointer within the page. Works with touch events.\\n * @param {Event} event\\n * @returns {Number}\\n */\\n var getPageX = function(event) {\\n return event.pageX !== undefined ? event.pageX : event.originalEvent.pageX;\\n };\\n\\n /**\\n * Gets the Y position of the pointer within the page. Works with touch events.\\n * @param {Event} event\\n * @returns {Number}\\n */\\n var getPageY = function(event) {\\n return event.pageY !== undefined ? event.pageY : event.originalEvent.pageY;\\n };\\n\\n /**\\n * Gets the X position of the pointer within a container. On a container that's scrollable, this is the X position\\n * within the scrolling content.\\n *\\n * @param {Event} event\\n * @param {jQuery} container\\n * @returns {Number}\\n */\\n var getXWithinContainer = function(event, container) {\\n var offset = container.offset();\\n var scrollLeft = container[0].scrollLeft;\\n // Check for undefined offset and scrollLeft in case container is document.\\n return getPageX(event) - (offset ? offset.left : 0) + (scrollLeft || 0);\\n };\\n\\n /**\\n * Gets the Y position of the pointer within a container. On a container that's scrollable, this is the Y position\\n * within the scrolling content.\\n *\\n * @param {Event} event\\n * @param {jQuery} container\\n * @returns {Number}\\n */\\n var getYWithinContainer = function(event, container) {\\n var offset = container.offset();\\n var scrollTop = container[0].scrollTop;\\n // Check for undefined offset and scrollTop in case container is document.\\n return getPageY(event) - (offset ? offset.top : 0) + (scrollTop || 0);\\n };\\n\\n /**\\n * A set of utilities to be used by draggable and resizable directives.\\n */\\n return {\\n getPageX: getPageX,\\n getPageY: getPageY,\\n getXWithinContainer: getXWithinContainer,\\n getYWithinContainer: getYWithinContainer\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/drag-resize-util.js\\n ** module id = 96\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.autoScroll', [\\n require('./drag-resize-util').name\\n ])\\n .factory('AutoScroll', function($interval, dragResizeUtil, $rootScope) {\\n\\n /**\\n * Provides auto-scrolling capabilities for use with drag operations. When a user is dragging an element and gets\\n * near the edge of an ancestor that scrolls, this will scroll the ancestor so that user can easily continue\\n * dragging without having to let go, manually scroll the parent container, then drag again.\\n *\\n * @param options\\n * @param {Number} options.scrollInterval The interval, in milliseconds, at which the pointer location should be\\n * evaluated to see if the container should be auto-scrolled.\\n * @param {Number} options.scrollDistance The number of pixels the container should be scrolled.\\n * @param {Number} options.edgeThreshold The number of pixels from the edge of the container that should trigger\\n * an auto-scroll.\\n * @constructor\\n */\\n var AutoScroll = function(options) {\\n angular.extend(this, {\\n scrollInterval: 30, // milliseconds to check for scrolling needs\\n scrollDistance: 15, // pixels per interval\\n edgeThreshold: 25 // pixels from the edge of the scroll parent\\n }, options);\\n };\\n\\n AutoScroll.prototype._tick = function() {\\n if (!this._lastEvent) {\\n return;\\n }\\n\\n var scrollWeight,\\n pageX = dragResizeUtil.getPageX(this._lastEvent),\\n pageY = dragResizeUtil.getPageY(this._lastEvent),\\n scrollParentOffset = this._scrollParent.offset(),\\n xOnScrollParent = pageX - scrollParentOffset.left,\\n yOnScrollParent = pageY - scrollParentOffset.top,\\n topThreshold = this.edgeThreshold,\\n bottomThreshold = this._scrollParent.height() - this.edgeThreshold,\\n leftThreshold = this.edgeThreshold,\\n rightThreshold = this._scrollParent.width() - this.edgeThreshold,\\n autoScrolled = false;\\n\\n if (yOnScrollParent < topThreshold) {\\n scrollWeight = Math.min(1 - (yOnScrollParent / topThreshold), 1);\\n this._scrollParent[0].scrollTop -= this.scrollDistance * scrollWeight;\\n autoScrolled = true;\\n } else if (yOnScrollParent > bottomThreshold) {\\n scrollWeight = Math.min((yOnScrollParent - bottomThreshold) / this.edgeThreshold, 1);\\n this._scrollParent[0].scrollTop += this.scrollDistance * scrollWeight;\\n autoScrolled = true;\\n }\\n\\n if (xOnScrollParent < leftThreshold) {\\n scrollWeight = Math.min(1 - (xOnScrollParent / leftThreshold), 1);\\n this._scrollParent[0].scrollLeft -= this.scrollDistance * scrollWeight;\\n autoScrolled = true;\\n } else if (xOnScrollParent > rightThreshold) {\\n scrollWeight = Math.min((xOnScrollParent - rightThreshold) / this.edgeThreshold, 1);\\n this._scrollParent[0].scrollLeft += this.scrollDistance * scrollWeight;\\n autoScrolled = true;\\n }\\n\\n if (autoScrolled && this.onScroll) {\\n var self = this;\\n $rootScope.$apply(function() {\\n self.onScroll(self._lastEvent);\\n });\\n }\\n };\\n\\n /**\\n * Begin monitoring for auto-scrolling needs.\\n * @param {jQuery|HTMLElement} The container that should be auto-scrolled the pointer gets close to the edge.\\n */\\n AutoScroll.prototype.start = function(scrollParent) {\\n this._scrollParent = $(scrollParent);\\n\\n if (!this._intervalPromise) {\\n // We check on an interval instead of on every mouse event because the user may not be holding the cursor\\n // steady while container needs to continue scrolling.\\n this._intervalPromise = $interval(this._tick.bind(this), this.scrollInterval, 0, false);\\n }\\n };\\n\\n /**\\n * Stop monitoring for auto-scrolling needs.\\n */\\n AutoScroll.prototype.stop = function() {\\n if (this._intervalPromise) {\\n $interval.cancel(this._intervalPromise);\\n this._intervalPromise = null;\\n }\\n this._scrollParent = null;\\n this._lastEvent = null;\\n };\\n\\n /**\\n * Notify auto-scroll of the most recent known location of the user's pointer.\\n * @param {Event} event Mouse event.\\n */\\n AutoScroll.prototype.updatePointerLocation = function(event) {\\n this._lastEvent = event;\\n };\\n\\n return AutoScroll;\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/auto-scroll.js\\n ** module id = 97\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-MediaDefinitionRange\\\\\\\" ng-class=\\\\\\\"{ 'totem-MediaDefinitionRange--active': isActive }\\\\\\\">\\\\n <div class=\\\\\\\"totem-MediaDefinitionRange-name\\\\\\\">{{ name }}</div>\\\\n <div class=\\\\\\\"totem-MediaDefinitionRange-activeStrip\\\\\\\"></div>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/media-definition-range.tpl.html\\n ** module id = 98\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.mediaDefinitionPopover', [])\\n .directive('mediaDefinitionPopover', function() {\\n return {\\n restrict: 'AE',\\n transclude: true,\\n scope: {\\n thumb: '=',\\n visible: '=',\\n hideFromClickOutside: '&'\\n },\\n template: require('./media-definition-popover.tpl.html'),\\n link: function(scope, element, attrs) {\\n var popover;\\n var popoverElement = element.children().eq(0);\\n\\n var nudge = function() {\\n popoverElement.css('top', '+=6px'); // Because it looks better...I guess.\\n };\\n\\n scope.$watch('visible', function(visible) {\\n if (visible) {\\n // We have to evalAsync because we can't guarantee that the contents of the popover will\\n // be populated until the end of the digest cycle. If we show the popover before then, it has a good\\n // chance of appearing mis-positioned because its width/height would likely change afterward due to\\n // content changing.\\n scope.$evalAsync(function() {\\n if (!popover) {\\n popover = new CUI.Popover({\\n element: popoverElement,\\n pointAt: scope.thumb\\n });\\n\\n popover.on('hide', function() {\\n // If visible is already false then we're probably already in a digest and reacting to it being set\\n // to false. We'd get a digest-in-progress error if we tried kicking off another digest via\\n // scope.$apply. If visible is true, then it's likely the user clicked outside of the popover\\n // and we need to let others know about the visibility change.\\n if (scope.visible) {\\n scope.$apply(function() {\\n scope.hideFromClickOutside();\\n scope.visible = false;\\n });\\n }\\n });\\n }\\n\\n popover.show();\\n nudge();\\n });\\n } else if (popover) {\\n popover.hide();\\n }\\n });\\n\\n scope.$watch('thumb', function(thumb) {\\n if (popover) {\\n popover.set('pointAt', thumb);\\n nudge();\\n }\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/media-definition-popover.js\\n ** module id = 99\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<media-definition-popover thumb=\\\\\\\"thumb\\\\\\\" visible=\\\\\\\"visible\\\\\\\" hide-from-click-outside=\\\\\\\"hideFromClickOutside()\\\\\\\">\\\\n <form class=\\\\\\\"totem-RenameMediaDefinition\\\\\\\" ng-submit=\\\\\\\"complete()\\\\\\\">\\\\n <div class=\\\\\\\"totem-MediaDefinitionPopover-content\\\\\\\">\\\\n <label class=\\\\\\\"totem-RenameMediaDefinition-label\\\\\\\">{{ 'viewportName' | i18n }} <input class=\\\\\\\"totem-RenameMediaDefinition-input coral-Textfield\\\\\\\" type=\\\\\\\"text\\\\\\\" ng-model=\\\\\\\"editing.name\\\\\\\"></label>\\\\n </div>\\\\n <div class=\\\\\\\"totem-MediaDefinitionPopover-footer\\\\\\\">\\\\n <button class=\\\\\\\"totem-MediaDefinitionPopover-footerButton coral-Button\\\\\\\" type=\\\\\\\"button\\\\\\\" ng-click=\\\\\\\"cancel()\\\\\\\">{{ 'cancel' | i18n }}</button>\\\\n <button class=\\\\\\\"totem-MediaDefinitionPopover-footerButton coral-Button coral-Button--primary\\\\\\\" type=\\\\\\\"submit\\\\\\\">{{ getSaveLabel() }}</button>\\\\n </div>\\\\n </form>\\\\n</media-definition-popover>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/media-definition-rename-popover.tpl.html\\n ** module id = 100\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<media-definition-popover thumb=\\\\\\\"thumb\\\\\\\" visible=\\\\\\\"visible\\\\\\\" hide-from-click-outside=\\\\\\\"hideFromClickOutside()\\\\\\\">\\\\n <form class=\\\\\\\"totem-DeleteMediaDefinition\\\\\\\" ng-submit=\\\\\\\"complete()\\\\\\\">\\\\n <div class=\\\\\\\"totem-MediaDefinitionPopover-content totem-DeleteMediaDefinition-content\\\\\\\">{{ mediaDefinition.name }}</div>\\\\n <div class=\\\\\\\"totem-MediaDefinitionPopover-footer\\\\\\\">\\\\n <button class=\\\\\\\"totem-MediaDefinitionPopover-footerButton coral-Button\\\\\\\" type=\\\\\\\"button\\\\\\\" ng-click=\\\\\\\"cancel()\\\\\\\">{{ 'cancel' | i18n }}</button>\\\\n <button class=\\\\\\\"totem-MediaDefinitionPopover-footerButton coral-Button coral-Button--warning\\\\\\\" type=\\\\\\\"submit\\\\\\\">{{ 'delete' | i18n }}</button>\\\\n </div>\\\\n </form>\\\\n</media-definition-popover>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/media-definition-delete-popover.tpl.html\\n ** module id = 101\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div ng-controller=\\\\\\\"DataPanelCtrl\\\\\\\" class=\\\\\\\"totem-dv-Editor\\\\\\\">\\\\n <div class=\\\\\\\"totem-Rail\\\\\\\">\\\\n <div class=\\\\\\\"totem-dv-DataSourceSelect\\\\\\\">\\\\n <cui-select options=\\\\\\\"dataSources\\\\\\\" label=\\\\\\\"'label'\\\\\\\" selection=\\\\\\\"selectedDataSource\\\\\\\" change=\\\\\\\"dataSourceChange()\\\\\\\" placeholder=\\\\\\\"Select a Data Store\\\\\\\"></cui-select>\\\\n </div>\\\\n <div class=\\\\\\\"totem-DimensionTabPanel coral-TabPanel\\\\\\\" data-init=\\\\\\\"tabs\\\\\\\">\\\\n <nav class=\\\\\\\"coral-TabPanel-navigation\\\\\\\">\\\\n <a class=\\\\\\\"coral-TabPanel-tab\\\\\\\" data-toggle=\\\\\\\"tab\\\\\\\">Metrics</a>\\\\n <a class=\\\\\\\"coral-TabPanel-tab\\\\\\\" data-toggle=\\\\\\\"tab\\\\\\\">Variables</a>\\\\n </nav>\\\\n <div class=\\\\\\\"totem-DimensionTabPanel-content coral-TabPanel-content\\\\\\\">\\\\n <section class=\\\\\\\"coral-TabPanel-pane\\\\\\\">\\\\n <ul class=\\\\\\\"u-totem-noPadding\\\\\\\">\\\\n <li class=\\\\\\\"totem-dv-Dimension coral-Draggable\\\\\\\" ad-draggable draggable-model=\\\\\\\"metric\\\\\\\" ng-repeat=\\\\\\\"metric in metrics\\\\\\\">\\\\n <span class=\\\\\\\"totem-dv-Dimension-itemIcon coral-Icon coral-Icon--sizeS coral-Icon--calculator\\\\\\\"></span>\\\\n <span class=\\\\\\\"totem-dv-Dimension-itemLabel\\\\\\\">{{ metric.name }}</span>\\\\n </li>\\\\n </ul>\\\\n </section>\\\\n <section class=\\\\\\\"coral-TabPanel-pane\\\\\\\">\\\\n <ul class=\\\\\\\"u-totem-noPadding\\\\\\\">\\\\n <li class=\\\\\\\"coral-Draggable\\\\\\\" ad-draggable draggable-model=\\\\\\\"variable\\\\\\\" ng-repeat=\\\\\\\"variable in variables\\\\\\\">\\\\n <span class=\\\\\\\"totem-dv-Dimension-itemIcon coral-Icon coral-Icon--sizeS coral-Icon--dimension\\\\\\\"></span>\\\\n <span class=\\\\\\\"totem-dv-Dimension-itemLabel\\\\\\\">{{ variable.name }}</span>\\\\n </li>\\\\n </ul>\\\\n </section>\\\\n </div>\\\\n </div>\\\\n <div class=\\\\\\\"coral-Wait coral-Wait--large coral-Wait--center\\\\\\\" ng-show=\\\\\\\"showDataSourceProgress\\\\\\\"></div>\\\\n </div>\\\\n <div class=\\\\\\\"totem-NonRail\\\\\\\">\\\\n <div class=\\\\\\\"totem-ActionBar\\\\\\\" ng-if=\\\\\\\"!editable\\\\\\\">\\\\n <div class=\\\\\\\"coral-ButtonGroup\\\\\\\">\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--graphTrend\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">Line</span></a>\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--addCircle\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">Add Facets</span></a>\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--addCircle\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">Add Geometry</span></a>\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--addCircle\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">Add Annotation</span></a>\\\\n </div>\\\\n </div>\\\\n <div class=\\\\\\\"totem-dv-Editor-content\\\\\\\" ng-controller=\\\\\\\"LineCtrl\\\\\\\">\\\\n <div class=\\\\\\\"totem-dv-Editor-leftContent\\\\\\\">\\\\n <div class=\\\\\\\"totem-dv-Editor-mappingPod\\\\\\\">\\\\n <div class=\\\\\\\"totem-dv-Editor-mappingTitle\\\\\\\">\\\\n Y Axis\\\\n <button class=\\\\\\\"totem-dv-Editor-editButton coral-Button coral-Button--square coral-Button--quiet\\\\\\\" ng-click=\\\\\\\"yAxisConfigVisible = true\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--sizeXS coral-Icon--edit\\\\\\\"></i>\\\\n </button>\\\\n </div>\\\\n <dimension-pod dimensions=\\\\\\\"dimensionsByAesthetic.y\\\\\\\"\\\\n dropzone-label=\\\\\\\"Add a Metric\\\\\\\"\\\\n enter-dimension=\\\\\\\"enterDimension('y', event, dimension)\\\\\\\"\\\\n drop-dimension=\\\\\\\"dropDimension('y', dimension)\\\\\\\"\\\\n remove-dimension=\\\\\\\"removeDimension('y', dimension)\\\\\\\"></dimension-pod>\\\\n </div>\\\\n </div>\\\\n <div class=\\\\\\\"totem-dv-Editor-centerContent\\\\\\\">\\\\n <div class=\\\\\\\"totem-dv-Editor-renderer\\\\\\\"></div>\\\\n <div class=\\\\\\\"totem-dv-Editor-mappingPod\\\\\\\">\\\\n <div class=\\\\\\\"totem-dv-Editor-mappingTitle\\\\\\\">\\\\n X Axis\\\\n <button class=\\\\\\\"totem-dv-Editor-editButton coral-Button coral-Button--square coral-Button--quiet\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--sizeXS coral-Icon--edit\\\\\\\"></i>\\\\n </button>\\\\n </div>\\\\n <dimension-pod dimensions=\\\\\\\"dimensionsByAesthetic.x\\\\\\\"></dimension-pod>\\\\n </div>\\\\n </div>\\\\n <div class=\\\\\\\"totem-dv-Editor-rightContent\\\\\\\">\\\\n <div class=\\\\\\\"totem-dv-Editor-mappingPod\\\\\\\">\\\\n <div class=\\\\\\\"totem-dv-Editor-mappingTitle\\\\\\\">\\\\n <div class=\\\\\\\"totem-dv-MappingSwatch totem-dv-ColorSwatch\\\\\\\"></div>\\\\n Color\\\\n <button class=\\\\\\\"totem-dv-Editor-editButton coral-Button coral-Button--square coral-Button--quiet\\\\\\\"\\\\n ng-click=\\\\\\\"showVariableConfig('stroke')\\\\\\\"\\\\n ng-show=\\\\\\\"isVariableEditingEnabled('stroke')\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--sizeXS coral-Icon--edit\\\\\\\"></i>\\\\n </button>\\\\n </div>\\\\n <dimension-pod dimensions=\\\\\\\"dimensionsByAesthetic.stroke\\\\\\\"\\\\n dropzone-label=\\\\\\\"Add a Variable\\\\\\\"\\\\n enter-dimension=\\\\\\\"enterDimension('stroke', event, dimension)\\\\\\\"\\\\n drop-dimension=\\\\\\\"dropDimension('stroke', dimension)\\\\\\\"\\\\n remove-dimension=\\\\\\\"removeDimension('stroke', dimension)\\\\\\\"></dimension-pod>\\\\n </div>\\\\n <div class=\\\\\\\"totem-dv-Editor-mappingPod\\\\\\\">\\\\n <div class=\\\\\\\"totem-dv-Editor-mappingTitle\\\\\\\">\\\\n <div class=\\\\\\\"totem-dv-MappingSwatch totem-dv-LineSwatch\\\\\\\"></div>\\\\n Thickness\\\\n </div>\\\\n <cui-slider ticks=\\\\\\\"true\\\\\\\" min=\\\\\\\"1\\\\\\\" max=\\\\\\\"6\\\\\\\" step=\\\\\\\"1\\\\\\\" value=\\\\\\\"size\\\\\\\" class=\\\\\\\"totem-dv-MappingSlider\\\\\\\"></cui-slider>\\\\n </div>\\\\n <div class=\\\\\\\"totem-dv-Editor-mappingPod\\\\\\\">\\\\n <div class=\\\\\\\"totem-dv-Editor-mappingTitle\\\\\\\">\\\\n <div class=\\\\\\\"totem-dv-MappingSwatch totem-dv-LineSwatch\\\\\\\"></div>\\\\n Line Type\\\\n <button class=\\\\\\\"totem-dv-Editor-editButton coral-Button coral-Button--square coral-Button--quiet\\\\\\\"\\\\n ng-click=\\\\\\\"showVariableConfig('linetype')\\\\\\\"\\\\n ng-show=\\\\\\\"isVariableEditingEnabled('linetype')\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--sizeXS coral-Icon--edit\\\\\\\"></i>\\\\n </button>\\\\n </div>\\\\n <dimension-pod dimensions=\\\\\\\"dimensionsByAesthetic.linetype\\\\\\\"\\\\n dropzone-label=\\\\\\\"Add a Variable\\\\\\\"\\\\n enter-dimension=\\\\\\\"enterDimension('linetype', event, dimension)\\\\\\\"\\\\n drop-dimension=\\\\\\\"dropDimension('linetype', dimension)\\\\\\\"\\\\n remove-dimension=\\\\\\\"removeDimension('linetype', dimension)\\\\\\\"></dimension-pod>\\\\n </div>\\\\n </div>\\\\n <y-aesthetic-configuration visible=\\\\\\\"yAxisConfigVisible\\\\\\\"></y-aesthetic-configuration>\\\\n <variable-configuration visible=\\\\\\\"variableConfigVisible\\\\\\\" variable=\\\\\\\"variableConfigDimension\\\\\\\" metrics=\\\\\\\"dimensionsByAesthetic.y\\\\\\\" save=\\\\\\\"write()\\\\\\\"></variable-configuration>\\\\n </div>\\\\n </div>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/editor.html\\n ** module id = 102\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div ng-controller=\\\\\\\"TxtCtrl\\\\\\\" class=\\\\\\\"totem-text-Editor\\\\\\\">\\\\n\\\\t<quill></quill>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/text/editor/editor.html\\n ** module id = 103\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div>\\\\n\\\\t<quill-toolbar></quill-toolbar>\\\\n\\\\t<quill-editor></quill-editor>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/text/editor/directives/quill.html\\n ** module id = 104\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div>\\\\n\\\\t<cui-select options=\\\\\\\"fontOptions\\\\\\\" label=\\\\\\\"'label'\\\\\\\" selection=\\\\\\\"format.font\\\\\\\" change=\\\\\\\"applyFormat('font')\\\\\\\"></cui-select>\\\\n\\\\t<cui-select options=\\\\\\\"sizeOptions\\\\\\\" label=\\\\\\\"'label'\\\\\\\" selection=\\\\\\\"format.size\\\\\\\" change=\\\\\\\"applyFormat('size')\\\\\\\"></cui-select>\\\\n\\\\t<div class=\\\\\\\"coral-Selector\\\\\\\">\\\\n\\\\t\\\\t<label class=\\\\\\\"coral-Selector-option\\\\\\\">\\\\n\\\\t\\\\t\\\\t<input class=\\\\\\\"coral-Selector-input\\\\\\\" type=\\\\\\\"checkbox\\\\\\\" ng-model=\\\\\\\"format.bold\\\\\\\" ng-change=\\\\\\\"applyFormat('bold')\\\\\\\" />\\\\n\\\\t\\\\t\\\\t<span class=\\\\\\\"coral-Selector-description\\\\\\\">\\\\n\\\\t\\\\t\\\\t\\\\t<i class=\\\\\\\"coral-Icon coral-Icon--textBold\\\\\\\"></i>\\\\n\\\\t\\\\t\\\\t</span>\\\\n\\\\t\\\\t</label>\\\\n\\\\t\\\\t<label class=\\\\\\\"coral-Selector-option\\\\\\\">\\\\n\\\\t\\\\t\\\\t<input class=\\\\\\\"coral-Selector-input\\\\\\\" type=\\\\\\\"checkbox\\\\\\\" ng-model=\\\\\\\"format.italic\\\\\\\" ng-change=\\\\\\\"applyFormat('italic')\\\\\\\" />\\\\n\\\\t\\\\t\\\\t<span class=\\\\\\\"coral-Selector-description\\\\\\\">\\\\n\\\\t\\\\t\\\\t\\\\t<i class=\\\\\\\"coral-Icon coral-Icon--textItalic\\\\\\\"></i>\\\\n\\\\t\\\\t\\\\t</span>\\\\n\\\\t\\\\t</label>\\\\n\\\\t\\\\t<label class=\\\\\\\"coral-Selector-option\\\\\\\">\\\\n\\\\t\\\\t\\\\t<input class=\\\\\\\"coral-Selector-input\\\\\\\" type=\\\\\\\"checkbox\\\\\\\" ng-model=\\\\\\\"format.underline\\\\\\\" ng-change=\\\\\\\"applyFormat('underline')\\\\\\\" />\\\\n\\\\t\\\\t\\\\t<span class=\\\\\\\"coral-Selector-description\\\\\\\">\\\\n\\\\t\\\\t\\\\t\\\\t<i class=\\\\\\\"coral-Icon coral-Icon--textUnderline\\\\\\\"></i>\\\\n\\\\t\\\\t\\\\t</span>\\\\n\\\\t\\\\t</label>\\\\n\\\\t</div>\\\\n\\\\t<div class=\\\\\\\"coral-Selector\\\\\\\">\\\\n\\\\t\\\\t<label class=\\\\\\\"coral-Selector-option\\\\\\\">\\\\n\\\\t\\\\t\\\\t<input class=\\\\\\\"coral-Selector-input\\\\\\\" type=\\\\\\\"radio\\\\\\\" name=\\\\\\\"align\\\\\\\" ng-model=\\\\\\\"format.align\\\\\\\" ng-value=\\\\\\\"alignOptions[1]\\\\\\\" ng-change=\\\\\\\"applyFormat('align')\\\\\\\">\\\\n\\\\t\\\\t\\\\t<span class=\\\\\\\"coral-Selector-description\\\\\\\">\\\\n\\\\t\\\\t\\\\t\\\\t<i class=\\\\\\\"coral-Icon coral-Icon--textLeft coral-Selector-icon\\\\\\\"></i>\\\\n\\\\t\\\\t\\\\t</span>\\\\n\\\\t\\\\t</label>\\\\n\\\\t\\\\t<label class=\\\\\\\"coral-Selector-option\\\\\\\">\\\\n\\\\t\\\\t\\\\t<input class=\\\\\\\"coral-Selector-input\\\\\\\" type=\\\\\\\"radio\\\\\\\" name=\\\\\\\"align\\\\\\\" ng-model=\\\\\\\"format.align\\\\\\\" ng-value=\\\\\\\"alignOptions[2]\\\\\\\" ng-change=\\\\\\\"applyFormat('align')\\\\\\\">\\\\n\\\\t\\\\t\\\\t<span class=\\\\\\\"coral-Selector-description\\\\\\\">\\\\n\\\\t\\\\t\\\\t\\\\t<i class=\\\\\\\"coral-Icon coral-Icon--textCenter coral-Selector-icon\\\\\\\"></i>\\\\n\\\\t\\\\t\\\\t</span>\\\\n\\\\t\\\\t</label>\\\\n\\\\t\\\\t<label class=\\\\\\\"coral-Selector-option\\\\\\\">\\\\n\\\\t\\\\t\\\\t<input class=\\\\\\\"coral-Selector-input\\\\\\\" type=\\\\\\\"radio\\\\\\\" name=\\\\\\\"align\\\\\\\" ng-model=\\\\\\\"format.align\\\\\\\" ng-value=\\\\\\\"alignOptions[3]\\\\\\\"ng-change=\\\\\\\"applyFormat('align')\\\\\\\">\\\\n\\\\t\\\\t\\\\t<span class=\\\\\\\"coral-Selector-description\\\\\\\">\\\\n\\\\t\\\\t\\\\t\\\\t<i class=\\\\\\\"coral-Icon coral-Icon--textRight coral-Selector-icon\\\\\\\"></i>\\\\n\\\\t\\\\t\\\\t</span>\\\\n\\\\t\\\\t</label>\\\\n\\\\t\\\\t<label class=\\\\\\\"coral-Selector-option\\\\\\\">\\\\n\\\\t\\\\t\\\\t<input class=\\\\\\\"coral-Selector-input\\\\\\\" type=\\\\\\\"radio\\\\\\\" name=\\\\\\\"align\\\\\\\" ng-model=\\\\\\\"format.align\\\\\\\" ng-value=\\\\\\\"alignOptions[4]\\\\\\\"ng-change=\\\\\\\"applyFormat('align')\\\\\\\">\\\\n\\\\t\\\\t\\\\t<span class=\\\\\\\"coral-Selector-description\\\\\\\">\\\\n\\\\t\\\\t\\\\t\\\\t<i class=\\\\\\\"coral-Icon coral-Icon--textJustified coral-Selector-icon\\\\\\\"></i>\\\\n\\\\t\\\\t\\\\t</span>\\\\n\\\\t\\\\t</label>\\\\n\\\\t</div>\\\\n\\\\t<div class=\\\\\\\"coral-Selector\\\\\\\">\\\\n\\\\t\\\\t<label class=\\\\\\\"coral-Selector-option\\\\\\\">\\\\n\\\\t\\\\t\\\\t<input class=\\\\\\\"coral-Selector-input\\\\\\\" type=\\\\\\\"checkbox\\\\\\\" ng-model=\\\\\\\"format.bullet\\\\\\\" ng-change=\\\\\\\"applyFormat('bullet')\\\\\\\">\\\\n\\\\t\\\\t\\\\t<span class=\\\\\\\"coral-Selector-description\\\\\\\">\\\\n\\\\t\\\\t\\\\t\\\\t<i class=\\\\\\\"coral-Icon coral-Icon--textBulleted coral-Selector-icon\\\\\\\"></i>\\\\n\\\\t\\\\t\\\\t</span>\\\\n\\\\t\\\\t</label>\\\\n\\\\t\\\\t<label class=\\\\\\\"coral-Selector-option\\\\\\\">\\\\n\\\\t\\\\t\\\\t<input class=\\\\\\\"coral-Selector-input\\\\\\\" type=\\\\\\\"checkbox\\\\\\\" ng-model=\\\\\\\"format.list\\\\\\\" ng-change=\\\\\\\"applyFormat('list')\\\\\\\">\\\\n\\\\t\\\\t\\\\t<span class=\\\\\\\"coral-Selector-description\\\\\\\">\\\\n\\\\t\\\\t\\\\t\\\\t<i class=\\\\\\\"coral-Icon coral-Icon--textNumbered coral-Selector-icon\\\\\\\"></i>\\\\n\\\\t\\\\t\\\\t</span>\\\\n\\\\t\\\\t</label>\\\\n\\\\t</div>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/text/editor/directives/quill-toolbar.html\\n ** module id = 105\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div></div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/text/editor/directives/quill-editor.html\\n ** module id = 106\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nvar DIMENSION_TYPE = require('../../enum/dimension-type');\\n\\nmodule.exports = function($http, $q, ims) {\\n var dimensionsPromisesByDataSource = {};\\n var dataSourcesPromise = null;\\n var rsURL = '/reporting-services/0.5';\\n\\n var assignDimensionUrn = function(dimension) {\\n if (dimension.type === 'time') {\\n // TODO: Not sure how this will end up.\\n dimension.resourceUrn = 'time';\\n } else {\\n dimension.resourceUrn = dimension.dataStore + '/' + dimension.type + '/' + dimension.id;\\n }\\n return dimension;\\n };\\n\\n return {\\n getDataSources: function() {\\n if (dataSourcesPromise) {\\n return dataSourcesPromise;\\n }\\n else {\\n var validDataSources = ['dms', 'adhoc'];\\n var promises = {};\\n\\n validDataSources.forEach(function(dataSource) {\\n promises[dataSource] = $http({\\n method: 'POST',\\n url: rsURL + '/' + dataSource + '?depth=1',\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n return response.data;\\n });\\n });\\n\\n return $q.all(promises).then(function(d) {\\n var results = [];\\n for (var sourceKey in d) {\\n var source = d[sourceKey];\\n for (var storeKey in source) {\\n var store = source[storeKey];\\n store.label = sourceKey + '/' + store.name; // TODO: this will go away once we get designs on what the label should be\\n store.resourceUrn = sourceKey + '/' + storeKey;\\n results.push(store);\\n }\\n }\\n return results;\\n });\\n }\\n },\\n\\n /**\\n * Returns metrics and variables for each data store that has been requested. Returns cached promises if\\n * results have already been fulfilled.\\n * @param {Array} dataSourceArray An array of RS data-source strings ('/dms/reportsuitename')\\n * @return {Object<data-source name, {metrics, variables}>} A collection of all report suite variables and metrics we've fetched\\n */\\n getDimensionsByDataSources: function(dataSourceArray) {\\n var dataSourcesMap = {};\\n dataSourceArray.forEach(function(dataSource) {\\n dataSourcesMap[dataSource] = this.getDimensionsByDataSource(dataSource);\\n }, this);\\n\\n return $q.all(dataSourcesMap).then(function(dataSources) {\\n return dataSources;\\n });\\n },\\n\\n getDimensionsByDataSource: function(dataSource) {\\n var query = function(dataSource, dimensionType) {\\n return $http({\\n method: 'POST',\\n url: rsURL + '/' + dataSource + '/' + dimensionType + '?depth=1',\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(\\n function(response) {\\n var data = response.data;\\n var dimensions = [];\\n for (var id in data) {\\n var dimension = data[id];\\n dimensions.push(assignDimensionUrn({\\n type: dimensionType,\\n id: id,\\n name: dimension.name,\\n dataStore: dataSource\\n }));\\n }\\n return dimensions;\\n }\\n );\\n };\\n\\n // Check if our dimensions are already cached for this dataSource.\\n var dimensionsPromise = dimensionsPromisesByDataSource[dataSource];\\n if (dimensionsPromise) {\\n return dimensionsPromise.then(function(dimensionPromises) {\\n return dimensionPromises;\\n });\\n }\\n\\n return dimensionsPromisesByDataSource[dataSource] = $q.all({\\n metric: query(dataSource, DIMENSION_TYPE.METRIC),\\n variable: query(dataSource, DIMENSION_TYPE.VARIABLE)\\n }).then(function(dimensions) {\\n return dimensions;\\n });\\n },\\n\\n assignDimensionUrn: assignDimensionUrn,\\n\\n currentDataSource: null\\n };\\n\\n};\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/services/data-sources-service.js\\n ** module id = 107\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = function() {\\n return {\\n /**\\n * Creates a new configuration object for situations where we don't already have one, like when a new DV\\n * instrument is created.\\n * @return {Config} Configuration object\\n */\\n createConfig: function() {\\n return {\\n source: {},\\n sourceMappings: {},\\n spec: {\\n data: {}\\n }\\n };\\n },\\n\\n validateConfig: function(config) {\\n if (!config.source) {\\n throw new Error('Configuration object should have a source object');\\n }\\n if (!config.spec) {\\n throw new Error('Configuration object should have a DV spec object');\\n }\\n if (!config.spec.data) {\\n throw new Error('Configuration object should have a DV spec object with a data block inside.');\\n }\\n }\\n };\\n};\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/services/dv-config-service.js\\n ** module id = 108\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\n/**\\n * Default values that should be used for geoms. These are defined here so\\n * we don't rely on DV's defaults and even if DV's defaults change we can retain\\n * consistency.\\n */\\n// Some of these values are strings where you may think they should be\\n// numbers. The controls that are used to modify aesthetics like size, for example,\\n// deal in strings so by keeping them strings here we simplify the process.\\nmodule.exports = Object.freeze({\\n LINE: {\\n MAPPINGS: {\\n SIZE: '2'\\n }\\n }\\n});\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/services/aesthetic-defaults.js\\n ** module id = 109\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = function() {\\n return {\\n restrict: 'AE',\\n scope: {\\n visible: '='\\n },\\n template: require('./y-aesthetic-configuration.tpl.html'),\\n link: function(scope, element, attrs) {\\n\\n }\\n };\\n};\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/directives/y-aesthetic-configuration.js\\n ** module id = 110\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = function(rsDataAdapter) {\\n return {\\n restrict: 'AE',\\n scope: {\\n visible: '=',\\n variable: '=',\\n metrics: '=',\\n externalSave: '&save'\\n },\\n template: require('./variable-configuration.tpl.html'),\\n controller: function($scope) {\\n $scope.deselectedValues = ['one', 'two', 'three', 'four'];\\n $scope.selectedValues = ['http://onereallylongurltosimulaterealworldcrazinesswillitwraporwillitexplode.com', 'B val', 'C val', 'D val'];\\n $scope.selectionType = 'ranked';\\n $scope.rankedCount = 4;\\n\\n var colors = [];\\n\\n for (var key in dv.COLOR) {\\n colors.push(dv.COLOR[key]);\\n }\\n\\n $scope.getSwatchColor = function(index) {\\n return colors[index % colors.length];\\n };\\n\\n $scope.allOthersColor = '#afafaf';\\n\\n $scope.selectValue = function(value) {\\n var deselectedValues = $scope.getDeselectedValues();\\n var selectedValues = $scope.getSelectedValues();\\n\\n var index = deselectedValues.indexOf(value);\\n\\n if (index > -1) {\\n deselectedValues.splice(index, 1);\\n }\\n\\n selectedValues.push(value);\\n };\\n\\n $scope.deselectValue = function(value) {\\n var deselectedValues = $scope.getDeselectedValues();\\n var selectedValues = $scope.getSelectedValues();\\n\\n var index = selectedValues.indexOf(value);\\n\\n if (index > -1) {\\n selectedValues.splice(index, 1);\\n }\\n\\n deselectedValues.push(value);\\n };\\n\\n $scope.loadingValues = false;\\n var loadedValues = [];\\n\\n var rankedDeselectedValues = [];\\n var rankedSelectedValues = [];\\n\\n var pickedDeselectedValues = [];\\n var pickedSelectedValues = [];\\n\\n $scope.getDeselectedValues = function() {\\n return $scope.selectionType === 'ranked' ? rankedDeselectedValues : pickedDeselectedValues;\\n };\\n\\n $scope.getSelectedValues = function() {\\n return $scope.selectionType === 'ranked' ? rankedSelectedValues : pickedSelectedValues;\\n };\\n\\n $scope.loadMoreValues = function() {\\n if ($scope.visible && $scope.variable && $scope.sortMetric) {\\n $scope.loadingValues = true;\\n rsDataAdapter.loadValues($scope.variable.id, $scope.sortMetric.id, loadedValues.length + 1, 50).then(function (values) {\\n loadedValues = loadedValues.concat(values);\\n\\n values.forEach(function(value) {\\n if (rankedSelectedValues.indexOf(value) === -1) {\\n rankedDeselectedValues.push(value);\\n }\\n\\n if (pickedSelectedValues.indexOf(value) === -1) {\\n pickedDeselectedValues.push(value);\\n }\\n });\\n\\n updateRankedSelectedValues();\\n\\n $scope.loadingValues = false;\\n });\\n }\\n };\\n\\n var updateRankedSelectedValues = function() {\\n rankedSelectedValues = loadedValues.slice(0, $scope.rankedCount);\\n };\\n\\n $scope.$watch('rankedCount', updateRankedSelectedValues);\\n\\n $scope.$watchGroup([\\n 'visible',\\n 'variable',\\n 'metrics'\\n ], function() {\\n if ($scope.visible && $scope.variable && $scope.metrics && $scope.metrics.length) {\\n $scope.filter = angular.copy($scope.variable.filter);\\n $scope.sortMetric = $scope.metrics[0];\\n\\n loadedValues = [];\\n rankedDeselectedValues = [];\\n rankedSelectedValues = [];\\n pickedDeselectedValues = [];\\n pickedSelectedValues = [];\\n\\n $scope.loadMoreValues();\\n $scope.infiniteScrollContainer = '#infinite-scroll-container';\\n }\\n });\\n\\n $scope.save = function() {\\n angular.copy($scope.filter, $scope.variable.filter);\\n $scope.externalSave();\\n };\\n },\\n link: function(scope, element, attrs) {\\n\\n }\\n };\\n};\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/directives/variable-configuration.js\\n ** module id = 111\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = function() {\\n return {\\n restrict: 'AE',\\n scope: {\\n dimensions: '=',\\n dropzoneLabel: '@',\\n enterDimension: '&',\\n dropDimension: '&',\\n removeDimension: '&'\\n },\\n template: require('./dimension-pod.tpl.html')\\n };\\n};\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/directives/dimension-pod.js\\n ** module id = 112\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = function($scope, $q, dataSourcesService) {\\n var ignorablePromise;\\n\\n $scope.showDataSourceProgress = true;\\n $scope.metrics = [];\\n $scope.variables = [];\\n\\n dataSourcesService.getDataSources().then(function(dataSources) {\\n $scope.dataSources = dataSources;\\n\\n if ($scope.dataSources && $scope.dataSources.length) {\\n dataSourcesService.currentDataSource = $scope.dataSources[0];\\n }\\n });\\n\\n $scope.dataSourceChange = function() {\\n dataSourcesService.currentDataSource = $scope.selectedDataSource;\\n };\\n\\n $scope.$watch(function() {\\n return dataSourcesService.currentDataSource;\\n }, function(currentDataSource) {\\n if (currentDataSource) {\\n // Ignore a previous request if it hasn't returned yet.\\n if (ignorablePromise) {\\n ignorablePromise.ignore();\\n }\\n ignorablePromise = dataSourcesService.getDimensionsByDataSource(currentDataSource.resourceUrn);\\n ignorablePromise = $q.when(ignorablePromise).ignorify();\\n ignorablePromise.then(function(dataSource) {\\n $scope.metrics = dataSource.metric;\\n $scope.variables = dataSource.variable;\\n $scope.showDataSourceProgress = false;\\n });\\n $scope.selectedDataSource = currentDataSource;\\n }\\n $scope.metrics = [];\\n $scope.variables = [];\\n $scope.showDataSourceProgress = true;\\n });\\n};\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/controllers/data-panel-ctrl.js\\n ** module id = 113\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nvar MELT_COLUMN = require('../../enum/melt-column'),\\n DIMENSION_TYPE = require('../../enum/dimension-type'),\\n FILTER_TYPE = require('../../enum/filter-type');\\n\\nvar getRefIdProvider = function() {\\n var refIdCounter = 1;\\n var dimensionByRefId = {};\\n var refIdByDimensionHash = {};\\n var provider = function(dimension) {\\n // Create an identifying hash for the dimension so tha we can retrieve the ref ID for the dimension\\n // later without looping. This also allows us to compare two dimension objects that aren't the same object\\n // in memory but represent the same dimension entity.\\n var hash = dimension.resourceUrn;\\n var existingRefId = refIdByDimensionHash[hash];\\n\\n if (existingRefId) {\\n return existingRefId;\\n } else {\\n var newId = 'dim' + refIdCounter++;\\n dimensionByRefId[newId] = dimension;\\n refIdByDimensionHash[hash] = newId;\\n return newId;\\n }\\n };\\n provider.getMap = function() {\\n return dimensionByRefId;\\n };\\n return provider;\\n};\\n\\nvar getNameForDimension = function(dimension) {\\n return dimension.name;\\n};\\n\\nvar addFilterToDimension = function(dimension) {\\n // Derived is handled when the data is melted. Reporting Services doesn't need a filter for it.\\n if (dimension.type !== DIMENSION_TYPE.DERIVED) {\\n dimension.filter = {\\n type: FILTER_TYPE.RANKED,\\n count: 5\\n };\\n }\\n};\\n\\nvar getGuide = function(aesthetic, dimensions) {\\n var guide = {};\\n switch (aesthetic) {\\n case 'y':\\n if (dimensions.length == 1) {\\n guide.title = dimensions[0].name;\\n } else {\\n guide.hideTitle = true;\\n }\\n return guide;\\n case 'x':\\n guide.hideTitle = true;\\n return guide;\\n default:\\n if (dimensions.length === 1) {\\n var dimension = dimensions[0];\\n if (dimension.type === DIMENSION_TYPE.DERIVED) {\\n guide.hideTitle = true;\\n guide.labels = dimension.dimensions.map(getNameForDimension);\\n } else {\\n guide.hideTitle = true; // TODO...I believe filters are going to come into play here.\\n }\\n }\\n return guide;\\n }\\n};\\n\\nvar getDataType = function(aesthetic, dimensions) {\\n switch (aesthetic) {\\n case 'y':\\n return dv.VALUE_TYPE.NUMERIC;\\n case 'x':\\n return dv.VALUE_TYPE.TIME;\\n default:\\n return dv.VALUE_TYPE.CATEGORICAL;\\n }\\n};\\n\\nvar getSourceMapping = function(aesthetic, dimensions, refIdProvider) {\\n if (dimensions.length === 1) {\\n var dimension = dimensions[0];\\n if (dimension.type === DIMENSION_TYPE.DERIVED) {\\n return {\\n refIds: dimension.dimensions.map(refIdProvider),\\n column: MELT_COLUMN.VARIABLE\\n };\\n } else {\\n return refIdProvider(dimension);\\n }\\n } else if (dimensions.length > 1) {\\n return {\\n refIds: dimensions.map(refIdProvider),\\n column: MELT_COLUMN.VALUE\\n };\\n }\\n};\\n\\nvar getLineLayer = function(spec) {\\n if (spec.layers) {\\n for (var i = 0; i < spec.layers.length; i++) {\\n var layer = spec.layers[i];\\n if (layer.type === 'line') {\\n return layer;\\n }\\n }\\n }\\n};\\n\\nvar addDefaultLineAesthetics = function(dimensionsByAesthetic, assignUrn) {\\n if (!dimensionsByAesthetic.x) {\\n var granularity = 'week';\\n dimensionsByAesthetic.x = [\\n assignUrn({\\n type: DIMENSION_TYPE.TIME,\\n name: granularity,\\n granularity: granularity\\n })\\n ];\\n }\\n};\\n\\nvar createSpec = function(dimensionsByAesthetic, constantByAesthetic) {\\n var columnIdCounter = 1,\\n mappings = {},\\n dataTypes = {},\\n guides = {},\\n aesthetic,\\n columnIdByAesthetic = {};\\n\\n for (aesthetic in constantByAesthetic) {\\n mappings[aesthetic] = constantByAesthetic[aesthetic];\\n }\\n\\n for (aesthetic in dimensionsByAesthetic) {\\n var dimensions = dimensionsByAesthetic[aesthetic];\\n\\n if (!dimensions || !dimensions.length) {\\n continue;\\n }\\n\\n var columnId = 'col' + columnIdCounter++;\\n mappings[aesthetic] = '{{' + columnId + '}}';\\n columnIdByAesthetic[aesthetic] = columnId;\\n\\n if (aesthetic !== 'group') { // Group aesthetics cannot have guides in DV\\n guides[aesthetic] = getGuide(aesthetic, dimensions);\\n }\\n\\n dataTypes[columnId] = getDataType(aesthetic, dimensions);\\n }\\n\\n var spec = {\\n data: {\\n types: dataTypes\\n },\\n layers: [\\n {\\n type: 'line',\\n mappings: mappings\\n }\\n ],\\n guides: guides\\n };\\n\\n return {\\n spec: spec,\\n columnIdByAesthetic: columnIdByAesthetic\\n };\\n};\\n\\nvar validateAddYDimension = function(dimensionsByAesthetic, dimension) {\\n return (dimension.type === DIMENSION_TYPE.METRIC);\\n};\\n\\nvar addYDimension = function(dimensionsByAesthetic, dimension) {\\n dimensionsByAesthetic.y = dimensionsByAesthetic.y || [];\\n dimensionsByAesthetic.y.push(dimension);\\n\\n dimensionsByAesthetic.stroke = dimensionsByAesthetic.stroke || [];\\n\\n // We will need a melted column if we have more than one variable mapped to y.\\n if (dimensionsByAesthetic.y.length > 1) {\\n // Preferred destinations for our melted variables column.\\n var eligibleDerivedDestinations = ['stroke', 'linetype'];\\n for (var i = 0; i < eligibleDerivedDestinations.length; i++) {\\n var mapping = eligibleDerivedDestinations[i];\\n // Does the aesthetic already have mappings? If no, let's add our melted mapping.\\n // Otherwise move on to the next eligible derived destination.\\n var mappingDimensions = dimensionsByAesthetic[mapping] || [];\\n if (!mappingDimensions.length) {\\n var add = operations[mapping].add;\\n if (add) {\\n add(dimensionsByAesthetic, {\\n type: DIMENSION_TYPE.DERIVED,\\n name: 'Y Axis Measures',\\n dimensions: dimensionsByAesthetic.y\\n });\\n break;\\n }\\n }\\n }\\n }\\n};\\n\\nvar removeYDimension = function(dimensionsByAesthetic, dimension) {\\n var yDims = dimensionsByAesthetic.y;\\n if (yDims.length > 1) {\\n yDims.splice(yDims.indexOf(dimension), 1);\\n\\n if (yDims.length === 1) {\\n // Try to find derived dimension in other aesthetics and remove it.\\n for (var aesthetic in dimensionsByAesthetic) {\\n // we are already looking at y\\n if (aesthetic === 'y') {\\n continue;\\n }\\n var dimensions = dimensionsByAesthetic[aesthetic];\\n var index = -1;\\n for (var i = 0; i < dimensions.length; i++) {\\n var dim = dimensions[i];\\n if (dim.type === DIMENSION_TYPE.DERIVED) {\\n index = i;\\n break;\\n }\\n }\\n\\n if (index >= 0) {\\n dimensionsByAesthetic[aesthetic].splice(index, 1);\\n }\\n }\\n }\\n }\\n else {\\n dimensionsByAesthetic.y = [];\\n }\\n};\\n\\nvar validateAddStrokeDimension = function(dimensionsByAesthetic, dimension) {\\n return (dimension.type === DIMENSION_TYPE.VARIABLE || dimension.type === DIMENSION_TYPE.DERIVED);\\n};\\n\\nvar addStrokeDimension = function(dimensionsByAesthetic, dimension) {\\n // Creates a new object that uses the original dimension as its prototype. We do this so we can attach a filter\\n // onto the dimension without modifying the original dimension object.\\n dimension = Object.create(dimension);\\n addFilterToDimension(dimension);\\n dimensionsByAesthetic.stroke = [dimension];\\n};\\n\\nvar removeStrokeDimension = function(dimensionsByAesthetic, dimension) {\\n dimensionsByAesthetic.stroke = [];\\n dimension.filter = null;\\n};\\n\\nvar validateAddLinetypeDimension = function(dimensionsByAesthetic, dimension) {\\n return (dimension.type === DIMENSION_TYPE.VARIABLE || dimension.type === DIMENSION_TYPE.DERIVED);\\n};\\n\\nvar addLinetypeDimension = function(dimensionsByAesthetic, dimension) {\\n // Creates a new object that uses the original dimension as its prototype. We do this so we can attach a filter\\n // onto the dimension without modifying the original dimension object.\\n dimension = Object.create(dimension);\\n addFilterToDimension(dimension);\\n dimensionsByAesthetic.linetype = [dimension];\\n};\\n\\nvar removeLinetypeDimension = function(dimensionsByAesthetic, dimension) {\\n dimensionsByAesthetic.linetype = [];\\n dimension.filter = null;\\n};\\n\\nvar getMappings = function(spec) {\\n var layer = getLineLayer(spec);\\n var layerMappings = layer ? layer.mappings : null;\\n return angular.extend({}, spec.mappings, layerMappings);\\n};\\n\\nvar getAestheticMappings = function(config, dimensionByRefId, assignUrn) {\\n var dimensionsByAesthetic = {};\\n var constantByAesthetic = {};\\n\\n // A config spec won't exist when we create a brand new instrument.\\n if (config.spec) {\\n var mappings = getMappings(config.spec);\\n\\n var getDimensionByRefId = function(refId) {\\n return dimensionByRefId[refId];\\n };\\n\\n for (var aesthetic in mappings) {\\n var mapping = mappings[aesthetic];\\n var expressionVariables = dv.expressionParser.getVariables(mapping);\\n\\n if (expressionVariables.length === 0) {\\n constantByAesthetic[aesthetic] = mapping;\\n } else if (expressionVariables.length === 1) {\\n var columnId = expressionVariables[0];\\n var sourceMapping = config.sourceMappings[columnId];\\n\\n if (angular.isObject(sourceMapping)) {\\n var dimensions = sourceMapping.refIds.map(getDimensionByRefId);\\n if (sourceMapping.column === MELT_COLUMN.VALUE) {\\n dimensionsByAesthetic[aesthetic] = dimensions;\\n } else if (sourceMapping.column === MELT_COLUMN.VARIABLE) {\\n dimensionsByAesthetic[aesthetic] = [{\\n type: DIMENSION_TYPE.DERIVED,\\n name: 'Y Axis Measures',\\n dimensions: dimensions\\n }];\\n }\\n } else {\\n dimensionsByAesthetic[aesthetic] = [getDimensionByRefId(sourceMapping)];\\n }\\n }\\n }\\n }\\n\\n addDefaultLineAesthetics(dimensionsByAesthetic, assignUrn); // TODO\\n\\n return {\\n dimensionsByAesthetic: dimensionsByAesthetic,\\n constantByAesthetic: constantByAesthetic\\n };\\n};\\n\\nvar operations = {\\n y: {\\n validateAdd: validateAddYDimension,\\n add: addYDimension,\\n remove: removeYDimension\\n },\\n stroke: {\\n validateAdd: validateAddStrokeDimension,\\n add: addStrokeDimension,\\n remove: removeStrokeDimension\\n },\\n linetype: {\\n validateAdd: validateAddLinetypeDimension,\\n add: addLinetypeDimension,\\n remove: removeLinetypeDimension\\n }\\n};\\n\\nmodule.exports = function($scope, $q, dataSourcesService, aestheticDefaults, dvConfigService, rsDataAdapter) {\\n $scope.dimensionsByAesthetic = {};\\n $scope.instrument.config = $scope.instrument.config || dvConfigService.createConfig();\\n console.log('creating config', $scope.instrument.config);\\n dvConfigService.validateConfig($scope.instrument.config);\\n if ($scope.instrument.config) {\\n // Wrap the result in a promise if it didn't return one.\\n $q.when(rsDataAdapter.readQuery($scope.instrument.config.source, dataSourcesService))\\n .then(function(dimensionByRefId) {\\n dimensionByRefId = dimensionByRefId || {};\\n var aestheticMappings = getAestheticMappings($scope.instrument.config, dimensionByRefId, dataSourcesService.assignDimensionUrn);\\n $scope.dimensionsByAesthetic = aestheticMappings.dimensionsByAesthetic;\\n $scope.constantByAesthetic = aestheticMappings.constantByAesthetic;\\n });\\n }\\n\\n $scope.enterDimension = function(aesthetic, event, dimension) {\\n var validateAdd = operations[aesthetic].validateAdd;\\n if (!validateAdd($scope.dimensionsByAesthetic, dimension)) {\\n event.preventDragDrop();\\n }\\n };\\n\\n var getSourceMappings = function(columnIdByAesthetic, refIdProvider) {\\n var sourceMappings = {};\\n\\n for (var aesthetic in columnIdByAesthetic) {\\n var columnId = columnIdByAesthetic[aesthetic];\\n sourceMappings[columnId] = getSourceMapping(aesthetic, $scope.dimensionsByAesthetic[aesthetic], refIdProvider);\\n }\\n\\n return sourceMappings;\\n };\\n\\n var write = function() {\\n var createSpecResult = createSpec($scope.dimensionsByAesthetic, $scope.constantByAesthetic);\\n $scope.instrument.config.spec = createSpecResult.spec;\\n\\n var refIdProvider = getRefIdProvider();\\n $scope.instrument.config.sourceMappings = getSourceMappings(createSpecResult.columnIdByAesthetic, refIdProvider);\\n\\n var dimensionByRefId = refIdProvider.getMap();\\n $scope.instrument.config.source = rsDataAdapter.writeQuery(dimensionByRefId);\\n };\\n\\n $scope.dropDimension = function(aesthetic, dimension) {\\n var add = operations[aesthetic].add;\\n add($scope.dimensionsByAesthetic, dimension);\\n write();\\n };\\n\\n $scope.removeDimension = function(aesthetic, dimension) {\\n var remove = operations[aesthetic].remove;\\n remove($scope.dimensionsByAesthetic, dimension);\\n write();\\n };\\n\\n $scope.showVariableConfig = function(aesthetic) {\\n var dimensions = $scope.dimensionsByAesthetic[aesthetic];\\n if (dimensions.length > 0) {\\n $scope.variableConfigDimension = dimensions[0];\\n $scope.variableConfigVisible = true;\\n }\\n };\\n\\n $scope.isVariableEditingEnabled = function(aesthetic) {\\n var yDimensions = $scope.dimensionsByAesthetic['y'],\\n aestheticDimensions = $scope.dimensionsByAesthetic[aesthetic];\\n\\n return yDimensions &&\\n yDimensions.length > 0 &&\\n aestheticDimensions &&\\n aestheticDimensions.length > 0;\\n };\\n\\n $scope.size = aestheticDefaults.LINE.MAPPINGS.SIZE;\\n\\n $scope.write = write;\\n\\n // Optimally we would make $scope.size a getter/setter so we don't have to have the two watchers below for syncing\\n // between $scope.size and $scope.constantByAesthetic.size. Unfortunately with coral-support-angular and CoralUI\\n // there's too much underlying baggage to make that a reality anytime soon.\\n $scope.$watch('size', function(size, previousSize) {\\n if (size === previousSize) {\\n return;\\n }\\n\\n if ($scope.constantByAesthetic) {\\n if (size === aestheticDefaults.LINE.MAPPINGS.SIZE) {\\n delete $scope.constantByAesthetic.size;\\n } else {\\n $scope.constantByAesthetic.size = size;\\n }\\n\\n // They'll be the same first time when the watcher is initialized. We don't want to write if it hasn't changed.\\n if (size !== previousSize) {\\n write();\\n }\\n }\\n });\\n\\n $scope.$watch('constantByAesthetic.size', function(size) {\\n if (size === undefined) {\\n $scope.size = aestheticDefaults.LINE.MAPPINGS.SIZE;\\n } else {\\n $scope.size = size;\\n }\\n });\\n};\\n\\n\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/controllers/line-ctrl.js\\n ** module id = 114\\n ** module chunks = 0\\n **/\",\"var MELT_COLUMN = Object.freeze({\\n VARIABLE: 'variable',\\n VALUE: 'value'\\n});\\n\\nmodule.exports = MELT_COLUMN;\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/enum/melt-column.js\\n ** module id = 115\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = function($http, $q, $timeout) {\\n return {\\n readQuery: require('./query-reader'),\\n writeQuery: require('./query-writer'),\\n loadValues: require('./value-loader')($http, $q, $timeout)\\n };\\n};\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/adapters/rs/adapter.js\\n ** module id = 116\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-RemoveParticipantAlert\\\\\\\" ng-show=\\\\\\\"show\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--sizeS coral-Icon--alert totem-RemoveParticipantAlert-icon js-totem-RemoveParticipantAlert-icon\\\\\\\"></i>\\\\n <span data-init=\\\\\\\"tooltip\\\\\\\" class=\\\\\\\"coral-Tooltip coral-Tooltip--error totem-RemoveParticipantAlert-tooltip js-totem-RemoveParticipantAlert-tooltip\\\\\\\" style=\\\\\\\"display: none\\\\\\\">{{ message }}</span>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/invalid-share-action-alert.tpl.html\\n ** module id = 117\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.userService', [])\\n .factory('userService', function($http, $q, eventBus, i18nFilter) {\\n var canceler;\\n var search = function(query) {\\n if (canceler) {\\n canceler.resolve();\\n }\\n\\n canceler = $q.defer();\\n\\n return $http({\\n method: 'GET',\\n url: '/share/search/' + query,\\n timeout: canceler.promise\\n }).then(function(response) {\\n return response.data;\\n }).catch(function(error) {\\n eventBus.publish('processFailed', i18nFilter('userSearchError'));\\n $q.reject(error);\\n });\\n };\\n\\n return {\\n search: search\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/user-service.js\\n ** module id = 118\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"coral-Autocomplete totem-ShareModal-search\\\\\\\">\\\\n <span class=\\\\\\\"coral-DecoratedTextfield js-coral-Autocomplete-field\\\\\\\">\\\\n <i class=\\\\\\\"coral-DecoratedTextfield-icon coral-Icon coral-Icon--sizeXS coral-Icon--search\\\\\\\"></i>\\\\n <input class=\\\\\\\"coral-DecoratedTextfield-input coral-Textfield js-coral-Autocomplete-textfield\\\\\\\" type=\\\\\\\"text\\\\\\\" name=\\\\\\\"name1\\\\\\\"\\\\n placeholder=\\\\\\\"{{ 'userSearchPlaceholder' | i18n }}\\\\\\\">\\\\n </span>\\\\n <ul class=\\\\\\\"coral-SelectList js-coral-Autocomplete-selectList\\\\\\\"></ul>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/user-search.tpl.html\\n ** module id = 119\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-MediaDefinitionPopover\\\\\\\" ng-transclude></div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/media-definition-popover.tpl.html\\n ** module id = 120\\n ** module chunks = 0\\n **/\",\"var DIMENSION_TYPE = Object.freeze({\\n METRIC: 'metric',\\n VARIABLE: 'variable',\\n TIME: 'time',\\n DERIVED: 'derived'\\n});\\n\\nmodule.exports = DIMENSION_TYPE;\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/enum/dimension-type.js\\n ** module id = 121\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<cui-modal visible=\\\\\\\"visible\\\\\\\">\\\\n <span header>Y-Axis Configuration</span>\\\\n <span content>\\\\n test content\\\\n </span>\\\\n <div template class=\\\\\\\"coral-Modal\\\\\\\">\\\\n <div class=\\\\\\\"coral-Modal-header\\\\\\\">\\\\n <i class=\\\\\\\"coral-Modal-typeIcon coral-Icon coral-Icon--sizeS\\\\\\\"></i>\\\\n <h2 class=\\\\\\\"coral-Modal-title coral-Heading coral-Heading--2\\\\\\\"></h2>\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-MinimalButton coral-Modal-closeButton\\\\\\\" title=\\\\\\\"{{ 'cancel' | i18n }}\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--sizeXS coral-Icon--close coral-MinimalButton-icon \\\\\\\"></i>\\\\n </button>\\\\n </div>\\\\n <div class=\\\\\\\"coral-Modal-body\\\\\\\"></div>\\\\n <div class=\\\\\\\"coral-Modal-footer\\\\\\\">\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-Button coral-Button--quiet\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\">Cancel</button>\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-Button coral-Button--primary coral-Button--warning\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\">Save</button>\\\\n </div>\\\\n </div>\\\\n</cui-modal>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/directives/y-aesthetic-configuration.tpl.html\\n ** module id = 122\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<cui-modal visible=\\\\\\\"visible\\\\\\\">\\\\n <span header>{{ variable.name }}</span>\\\\n <span content>\\\\n <div class=\\\\\\\"coral-Selector\\\\\\\" style=\\\\\\\"margin-bottom: 8px\\\\\\\">\\\\n <label class=\\\\\\\"coral-Selector-option\\\\\\\">\\\\n <input class=\\\\\\\"coral-Selector-input\\\\\\\" type=\\\\\\\"radio\\\\\\\" ng-model=\\\\\\\"selectionType\\\\\\\" value=\\\\\\\"ranked\\\\\\\">\\\\n <span class=\\\\\\\"coral-Selector-description\\\\\\\">\\\\n Ranked\\\\n </span>\\\\n </label>\\\\n <label class=\\\\\\\"coral-Selector-option\\\\\\\">\\\\n <input class=\\\\\\\"coral-Selector-input\\\\\\\" type=\\\\\\\"radio\\\\\\\" ng-model=\\\\\\\"selectionType\\\\\\\" value=\\\\\\\"picked\\\\\\\">\\\\n <span class=\\\\\\\"coral-Selector-description\\\\\\\">\\\\n Hand-picked\\\\n </span>\\\\n </label>\\\\n </div>\\\\n <div ng-show=\\\\\\\"selectionType === 'ranked'\\\\\\\" style=\\\\\\\"margin-bottom: 8px\\\\\\\">\\\\n Top\\\\n <cui-number-input style=\\\\\\\"vertical-align: middle\\\\\\\" value=\\\\\\\"rankedCount\\\\\\\" min=\\\\\\\"0\\\\\\\" max=\\\\\\\"10\\\\\\\" step=\\\\\\\"1\\\\\\\"></cui-number-input>\\\\n Ranked by\\\\n <cui-select options=\\\\\\\"metrics\\\\\\\" label=\\\\\\\"'name'\\\\\\\" selection=\\\\\\\"sortMetric\\\\\\\"></cui-select>\\\\n </div>\\\\n <div>\\\\n <div style=\\\\\\\"float: left; padding-right:20px\\\\\\\">\\\\n <span style=\\\\\\\"font-weight: bold\\\\\\\">Excluded Values</span>\\\\n <span class=\\\\\\\"coral-DecoratedTextfield\\\\\\\" ng-show=\\\\\\\"selectionType === 'picked'\\\\\\\" style=\\\\\\\"display: block\\\\\\\">\\\\n <i class=\\\\\\\"coral-DecoratedTextfield-icon coral-Icon coral-Icon--sizeXS coral-Icon--search\\\\\\\"></i>\\\\n <input type=\\\\\\\"text\\\\\\\" class=\\\\\\\"coral-DecoratedTextfield-input coral-Textfield\\\\\\\" placeholder=\\\\\\\"Search\\\\\\\">\\\\n </span>\\\\n <div id=\\\\\\\"infinite-scroll-container\\\\\\\" style=\\\\\\\"width: 250px; height: 300px; overflow-y: auto\\\\\\\">\\\\n <ul class=\\\\\\\"u-totem-noPadding u-totem-noMargin\\\\\\\" style=\\\\\\\"width:100%;\\\\\\\" infinite-scroll=\\\\\\\"loadMoreValues()\\\\\\\" infinite-scroll-container=\\\\\\\"infiniteScrollContainer\\\\\\\" infinite-scroll-disabled=\\\\\\\"loadingValues\\\\\\\" infinite-scroll-distance=\\\\\\\".5\\\\\\\">\\\\n <li class=\\\\\\\"coral-Draggable\\\\\\\" ng-class=\\\\\\\"{'is-disabled': selectionType === 'ranked', 'coral-Draggable--noThumb': selectionType === 'ranked'}\\\\\\\" ad-draggable draggable-model=\\\\\\\"value\\\\\\\" ng-repeat=\\\\\\\"value in getDeselectedValues()\\\\\\\" style=\\\\\\\"width: 100%;\\\\\\\">\\\\n {{ value }}\\\\n </li>\\\\n </ul>\\\\n </div>\\\\n </div>\\\\n <div style=\\\\\\\"float: left;\\\\\\\">\\\\n <span style=\\\\\\\"font-weight: bold\\\\\\\">Included Values</span>\\\\n <ul class=\\\\\\\"u-totem-noPadding\\\\\\\" style=\\\\\\\"width: 250px; margin-top: 0;\\\\\\\">\\\\n <li class=\\\\\\\"coral-Draggable coral-Draggable--removable\\\\\\\" ng-class=\\\\\\\"{'coral-Draggable--noThumb': selectionType === 'ranked'}\\\\\\\" ng-repeat=\\\\\\\"value in getSelectedValues()\\\\\\\" style=\\\\\\\"width: 100%;\\\\\\\">\\\\n <span style=\\\\\\\"position: absolute; display: inline-block; top: 7px; width: 24px; height: 24px;\\\\\\\" ng-style=\\\\\\\"{ 'background-color': getSwatchColor($index) }\\\\\\\"></span>\\\\n <span style=\\\\\\\"padding-left: 32px; display: inline-block; width: 100%; box-sizing: border-box;\\\\\\\">\\\\n {{ value }}\\\\n </span>\\\\n <button class=\\\\\\\"coral-Draggable-removeButton coral-Button coral-Button--square coral-Button--quiet\\\\\\\"\\\\n ng-click=\\\\\\\"deselectValue(value)\\\\\\\" ng-show=\\\\\\\"selectionType === 'picked'\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--close coral-Icon--sizeXS\\\\\\\"></i>\\\\n </button>\\\\n </li>\\\\n <li class=\\\\\\\"totem-dv-Dimension coral-Dropzone\\\\\\\"\\\\n ad-drag-drop=\\\\\\\"selectValue($draggableModel)\\\\\\\"\\\\n ng-show=\\\\\\\"selectionType === 'picked'\\\\\\\">Add Value</li>\\\\n </ul>\\\\n <ul class=\\\\\\\"u-totem-noPadding u-totem-noMargin\\\\\\\">\\\\n <li class=\\\\\\\"coral-Draggable coral-Draggable--noThumb\\\\\\\" style=\\\\\\\"width: 250px;\\\\\\\">\\\\n <span style=\\\\\\\"position: absolute; display: inline-block; top: 50%; transform: translateY(-50%); width: 24px; height: 24px;\\\\\\\" ng-style=\\\\\\\"{ 'background-color': allOthersColor }\\\\\\\"></span>\\\\n <span style=\\\\\\\"padding-left: 32px; display: inline-block; width: 100%; box-sizing: border-box;\\\\\\\">\\\\n All others\\\\n </span>\\\\n <label class=\\\\\\\"coral-Switch\\\\\\\" style=\\\\\\\"position: absolute; top: 0; right: 14px\\\\\\\">\\\\n <input class=\\\\\\\"coral-Switch-input\\\\\\\" type=\\\\\\\"checkbox\\\\\\\">\\\\n <span class=\\\\\\\"coral-Switch-offLabel\\\\\\\">Off</span><span class=\\\\\\\"coral-Switch-onLabel\\\\\\\">On</span>\\\\n </label>\\\\n </li>\\\\n </ul>\\\\n </div>\\\\n </div>\\\\n </span>\\\\n <div template class=\\\\\\\"coral-Modal\\\\\\\">\\\\n <div class=\\\\\\\"coral-Modal-header\\\\\\\">\\\\n <i class=\\\\\\\"coral-Modal-typeIcon coral-Icon coral-Icon--sizeS\\\\\\\"></i>\\\\n <h2 class=\\\\\\\"coral-Modal-title coral-Heading coral-Heading--2\\\\\\\"></h2>\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-MinimalButton coral-Modal-closeButton\\\\\\\" title=\\\\\\\"{{ 'cancel' | i18n }}\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--sizeXS coral-Icon--close coral-MinimalButton-icon \\\\\\\"></i>\\\\n </button>\\\\n </div>\\\\n <div class=\\\\\\\"coral-Modal-body\\\\\\\"></div>\\\\n <div class=\\\\\\\"coral-Modal-footer\\\\\\\">\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-Button coral-Button--quiet\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\">Cancel</button>\\\\n <button type=\\\\\\\"button\\\\\\\" class=\\\\\\\"coral-Button coral-Button--primary\\\\\\\" data-dismiss=\\\\\\\"modal\\\\\\\" ng-click=\\\\\\\"save()\\\\\\\">Save</button>\\\\n </div>\\\\n </div>\\\\n</cui-modal>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/directives/variable-configuration.tpl.html\\n ** module id = 123\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<ul class=\\\\\\\"u-totem-noPadding\\\\\\\">\\\\n <li class=\\\\\\\"totem-dv-Dimension coral-Draggable coral-Draggable--removable\\\\\\\" ng-repeat=\\\\\\\"dimension in dimensions\\\\\\\">\\\\n <span class=\\\\\\\"totem-dv-Dimension-itemIcon coral-Icon coral-Icon--sizeS\\\\\\\" ng-class=\\\\\\\"{ 'coral-Icon--calculator': dimension.type=='metric', 'coral-Icon--dimension': dimension.type=='variable' || dimension.type=='derived', 'coral-Icon--clock': dimension.type=='time' }\\\\\\\"></span>\\\\n <span class=\\\\\\\"totem-dv-Dimension-itemLabel\\\\\\\">\\\\n {{ dimension.name }}\\\\n </span>\\\\n <button class=\\\\\\\"coral-Draggable-removeButton coral-Button coral-Button--square coral-Button--quiet\\\\\\\"\\\\n ng-click=\\\\\\\"removeDimension({dimension: dimension})\\\\\\\" ng-if=\\\\\\\"dropzoneLabel\\\\\\\">\\\\n <i class=\\\\\\\"coral-Icon coral-Icon--close coral-Icon--sizeXS\\\\\\\"></i>\\\\n </button>\\\\n </li>\\\\n <li class=\\\\\\\"totem-dv-Dimension coral-Dropzone\\\\\\\" ng-if=\\\\\\\"dropzoneLabel\\\\\\\"\\\\n ad-drag-enter=\\\\\\\"enterDimension({event: $event, dimension: $draggableModel})\\\\\\\"\\\\n ad-drag-drop=\\\\\\\"dropDimension({dimension: $draggableModel})\\\\\\\">{{ dropzoneLabel }}</li>\\\\n</ul>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/directives/dimension-pod.tpl.html\\n ** module id = 124\\n ** module chunks = 0\\n **/\",\"var FILTER_TYPE = Object.freeze({\\n RANKED: 'ranked',\\n PICKED: 'picked'\\n});\\n\\nmodule.exports = FILTER_TYPE;\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/enum/filter-type.js\\n ** module id = 125\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nvar DIMENSION_TYPE = require('../../../enum/dimension-type'),\\n FILTER_TYPE = require('../../../enum/filter-type');\\n\\nvar getQueryFromSource = function(source) {\\n // rawData is technically is the data and not the query, but it basically the same structure and info\\n // as the query...plus the data.\\n return source.rawData ? source.rawData : source.query;\\n};\\n\\n/**\\n * Determines the unique data stores present on a query. That information is used to pull the dimension\\n * metadata from Reporting Services. This metadata will be used to add information to the raw dimension\\n * object in the query that doesn't have sufficient metadata.\\n * @param {DataSourcesService} dataSourcesService A service to pull the proper dimension metadata\\n * @param {Object} query The raw Reporting Services query\\n * @return {Promise} Asynchronous promise\\n */\\nvar getDimensionMetadataFromConfig = function(dataSourcesService, query) {\\n var uniqueDataStores = [];\\n query.filters.forEach(function(filter) {\\n var dataStore = filter.data_store;\\n if (uniqueDataStores.indexOf(dataStore) < 0) {\\n uniqueDataStores.push(dataStore);\\n }\\n });\\n\\n // Select the first data store that we run across as the default whose metrics/variables we'll load.\\n if (uniqueDataStores.length) {\\n var defaultDataSource = uniqueDataStores[0];\\n dataSourcesService.getDataSources()\\n .then(function(dataSources) {\\n for (var i = 0; i < dataSources.length; i++) {\\n var dataSource = dataSources[i];\\n if (defaultDataSource === dataSource.resourceUrn) {\\n dataSourcesService.currentDataSource = dataSource;\\n }\\n }\\n });\\n }\\n\\n return dataSourcesService.getDimensionsByDataSources(uniqueDataStores);\\n};\\n\\n/**\\n * Determines what the pretty name of a dimension will be.\\n * @param {Array} dimensions An array of dimension objects from Reporting Services that contain pretty names and other metadata\\n * @param {String} dimensionId The id of the dimension we are looking for that exists in the query\\n * @param {DIMENSION_TYPE} dimensionType The type of dimension we are looking for (metric, variable)\\n * @return {String} The pretty name of the dimension\\n */\\nvar getDimensionName = function(dimensions, dimensionId, dimensionType) {\\n var dimensionsOfType = dimensions[dimensionType];\\n for (var i = 0; i < dimensionsOfType.length; i++) {\\n var dimension = dimensionsOfType[i];\\n if (dimension.id === dimensionId) {\\n return dimension.name;\\n }\\n }\\n throw new Error('Didn\\\\'t find a name for a dimension in the query');\\n};\\n\\nvar getRefIdDimensionMap = function(query, dimensionsByDataStore, assignUrn) {\\n var dimensionByRefId = {};\\n var type, name, dataStore;\\n\\n query.metrics.forEach(function(metric) {\\n if (metric.hasOwnProperty('ref_id')) {\\n // When the query we're inspecting is actually coming from raw data, the metric's filter reference attribute is\\n // \\\"filter_ref\\\" whereas if it's a normal query it's \\\"filters\\\". This is an unfortunate disparity that may eventually\\n // get normalized in a later Reporting Services version.\\n var filterRefAttr = metric.hasOwnProperty('filters') ? 'filters' : 'filter_ref';\\n dataStore = query.filters[metric[filterRefAttr][0]].data_store;\\n type = DIMENSION_TYPE.METRIC;\\n name = getDimensionName(dimensionsByDataStore[dataStore], metric.id, type);\\n\\n dimensionByRefId[metric.ref_id] = assignUrn({\\n type: type,\\n id: metric.id,\\n name: name,\\n dataStore: dataStore\\n });\\n }\\n });\\n\\n query.filters.forEach(function(filter) {\\n if (filter.ref_id && filter.filter_def) {\\n var filterDef = filter.filter_def[0];\\n dataStore = filter.data_store;\\n type = DIMENSION_TYPE.VARIABLE;\\n name = getDimensionName(dimensionsByDataStore[dataStore], filterDef.var, type);\\n\\n dimensionByRefId[filter.ref_id] = assignUrn({\\n type: type,\\n id: filterDef.var,\\n name: name,\\n dataStore: dataStore,\\n filter: {\\n type: FILTER_TYPE.RANKED,\\n count: 5\\n }\\n });\\n }\\n });\\n\\n if (query.dates.length) {\\n var date = query.dates[0];\\n\\n if (date.hasOwnProperty('ref_id')) {\\n dimensionByRefId[date.ref_id] = assignUrn({\\n type: DIMENSION_TYPE.TIME,\\n name: date.gran,\\n granularity: date.gran\\n });\\n }\\n }\\n\\n return dimensionByRefId;\\n};\\n\\nmodule.exports = function(source, dataSourcesService) {\\n var query = getQueryFromSource(source);\\n if (query) {\\n return getDimensionMetadataFromConfig(dataSourcesService, query)\\n .then(function(dimensionsByDataStore) {\\n return getRefIdDimensionMap(query, dimensionsByDataStore, dataSourcesService.assignDimensionUrn);\\n });\\n }\\n return null;\\n};\\n\\n\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/adapters/rs/query-reader.js\\n ** module id = 126\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nvar DIMENSION_TYPE = require('../../../enum/dimension-type'),\\n FILTER_TYPE = require('../../../enum/filter-type');\\n\\nmodule.exports = function(dimensionByRefId) {\\n var query = {\\n metrics: [],\\n filters: [],\\n dates: []\\n };\\n\\n var filterIndex = 0;\\n var filterIndices = [];\\n var refId;\\n var dimension;\\n\\n // Create the filters first and apply them to metrics later\\n for (refId in dimensionByRefId) {\\n dimension = dimensionByRefId[refId];\\n var filter = dimension.filter;\\n if (filter) {\\n switch (filter.type) {\\n case FILTER_TYPE.RANKED:\\n query.filters.push({\\n ref_id: refId,\\n data_store: dimension.dataStore,\\n filter_def: [{\\n var: dimension.id,\\n op: 'select',\\n val: {\\n order: [0], // TODO: What metric the results should be ordered by.\\n limit: [1, filter.count]\\n }\\n }]\\n });\\n break;\\n case FILTER_TYPE.PICKED:\\n var pickIds = filter.pickIds;\\n for (var i = 0; i < pickIds.length; i++) {\\n var id = pickIds[i];\\n query.filters.push({\\n ref_id: refId,\\n data_store: filter.dataStore,\\n filter_def: [{\\n var: filter.variableId,\\n op: 'id',\\n val: id\\n }]\\n });\\n }\\n break;\\n }\\n\\n filterIndices.push(filterIndex++);\\n }\\n }\\n\\n for (refId in dimensionByRefId) {\\n dimension = dimensionByRefId[refId];\\n switch (dimension.type) {\\n case DIMENSION_TYPE.METRIC:\\n // Handle the case of no filters that have been defined\\n // This should only run on the first encountered metric\\n if (!filterIndices.length) {\\n query.filters.push({\\n data_store: dimension.dataStore\\n });\\n filterIndices.push(0);\\n }\\n\\n query.metrics.push({\\n ref_id: refId,\\n id: dimension.id,\\n filters: filterIndices,\\n dates: [0]\\n });\\n break;\\n case DIMENSION_TYPE.TIME:\\n query.dates.push({\\n ref_id: refId,\\n start: '2014/01/01',\\n end: '2014/07/30',\\n gran: 'week'\\n });\\n break;\\n }\\n }\\n\\n return {\\n version: '0.5',\\n query: query\\n };\\n};\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/adapters/rs/query-writer.js\\n ** module id = 127\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = function($http, $q, $timeout) {\\n return function(variableId, sortMetricId, startIndex, count) {\\n // TODO: Swap with real endpoint.\\n\\n var deferred = $q.defer();\\n\\n $timeout(function() {\\n var results = [];\\n\\n for (var i = startIndex; i < startIndex + count; i++) {\\n results.push('Value ' + i);\\n }\\n\\n deferred.resolve(results);\\n }, 2000);\\n\\n return deferred.promise;\\n };\\n};\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments/dv/editor/adapters/rs/value-loader.js\\n ** module id = 128\\n ** module chunks = 0\\n **/\"],\"sourceRoot\":\"\",\"file\":\"totem.min.js\"}\n\n/Users/nross/Work/javascript/totem/client/instruments/dv/editor/adapters/rs/query-reader.js:\n 14 * metadata from Reporting Services. This metadata will be used to add information to the raw dimension\n 15 * object in the query that doesn't have sufficient metadata.\n 16: * @param {DataSourcesService} dataSourcesService A service to pull the proper dimension metadata\n 17 * @param {Object} query The raw Reporting Services query\n 18 * @return {Promise} Asynchronous promise\n 19 */\n 20: var getDimensionMetadataFromConfig = function(dataSourcesService, query) {\n 21 var uniqueDataStores = [];\n 22 query.filters.forEach(function(filter) {\n ..\n 30 if (uniqueDataStores.length) {\n 31 var defaultDataSource = uniqueDataStores[0];\n 32: dataSourcesService.getDataSources()\n 33 .then(function(dataSources) {\n 34 for (var i = 0; i < dataSources.length; i++) {\n 35 var dataSource = dataSources[i];\n 36 if (defaultDataSource === dataSource.resourceUrn) {\n 37: dataSourcesService.currentDataSource = dataSource;\n 38 }\n 39 }\n ..\n 41 }\n 42 \n 43: return dataSourcesService.getDimensionsByDataSources(uniqueDataStores);\n 44 };\n 45 \n ..\n 120 };\n 121 \n 122: module.exports = function(source, dataSourcesService) {\n 123 var query = getQueryFromSource(source);\n 124 if (query) {\n 125: return getDimensionMetadataFromConfig(dataSourcesService, query)\n 126 .then(function(dimensionsByDataStore) {\n 127: return getRefIdDimensionMap(query, dimensionsByDataStore, dataSourcesService.assignDimensionUrn);\n 128 });\n 129 }\n\n/Users/nross/Work/javascript/totem/client/instruments/dv/editor/controllers/data-panel-ctrl.js:\n 21 \n 22 $scope.$watch(function() {\n 23: return dataSourcesService.getCurrentDataSource();\n 24 }, function(currentDataSource) {\n 25 if (currentDataSource) {\n\n/Users/nross/Work/javascript/totem/client/instruments/dv/editor/controllers/line-ctrl.js:\n 348 };\n 349 \n 350: module.exports = function($scope, $q, dataSourcesService, aestheticDefaults, dvConfigService, rsDataAdapter) {\n 351 $scope.dimensionsByAesthetic = {};\n 352 $scope.instrument.config = $scope.instrument.config || dvConfigService.createConfig();\n ...\n 355 if ($scope.instrument.config) {\n 356 // Wrap the result in a promise if it didn't return one.\n 357: $q.when(rsDataAdapter.readQuery($scope.instrument.config.source, dataSourcesService))\n 358 .then(function(dimensionByRefId) {\n 359 dimensionByRefId = dimensionByRefId || {};\n 360: var aestheticMappings = getAestheticMappings($scope.instrument.config, dimensionByRefId, dataSourcesService.assignDimensionUrn);\n 361 $scope.dimensionsByAesthetic = aestheticMappings.dimensionsByAesthetic;\n 362 $scope.constantByAesthetic = aestheticMappings.constantByAesthetic;\n\n/Users/nross/Work/javascript/totem/client/instruments/dv/editor/editor.js:\n 8 ])\n 9 .service('rsDataAdapter', require('./adapters/rs/adapter'))\n 10: .service('dataSourcesService', require('./services/data-sources-service'))\n 11 .service('dvConfigService', require('./services/dv-config-service'))\n 12 .constant('aestheticDefaults', require('./services/aesthetic-defaults'))\n\n52 matches across 6 files\n\n\nSearching 220 files for \"dataSourcesService\"\n\n/Users/nross/Work/javascript/totem/client/dist/scripts/totem.min.js:\n 5074 ])\n 5075 .service('rsDataAdapter', __webpack_require__(116))\n 5076: .service('dataSourcesService', __webpack_require__(107))\n 5077 .service('dvConfigService', __webpack_require__(108))\n 5078 .constant('aestheticDefaults', __webpack_require__(109))\n ....\n 6612 'use strict';\n 6613 \n 6614: module.exports = function($scope, $q, dataSourcesService) {\n 6615 var ignorablePromise;\n 6616 \n ....\n 6619 $scope.variables = [];\n 6620 \n 6621: dataSourcesService.getDataSources().then(function(dataSources) {\n 6622 $scope.dataSources = dataSources;\n 6623 \n 6624 if ($scope.dataSources && $scope.dataSources.length) {\n 6625: dataSourcesService.currentDataSource = $scope.dataSources[0];\n 6626 }\n 6627 });\n 6628 \n 6629 $scope.dataSourceChange = function() {\n 6630: dataSourcesService.currentDataSource = $scope.selectedDataSource;\n 6631 };\n 6632 \n 6633 $scope.$watch(function() {\n 6634: return dataSourcesService.currentDataSource;\n 6635 }, function(currentDataSource) {\n 6636 if (currentDataSource) {\n ....\n 6639 ignorablePromise.ignore();\n 6640 }\n 6641: ignorablePromise = dataSourcesService.getDimensionsByDataSource(currentDataSource.resourceUrn);\n 6642 ignorablePromise = $q.when(ignorablePromise).ignorify();\n 6643 ignorablePromise.then(function(dataSource) {\n ....\n 7008 };\n 7009 \n 7010: module.exports = function($scope, $q, dataSourcesService, aestheticDefaults, dvConfigService, rsDataAdapter) {\n 7011 $scope.dimensionsByAesthetic = {};\n 7012 $scope.instrument.config = $scope.instrument.config || dvConfigService.createConfig();\n ....\n 7015 if ($scope.instrument.config) {\n 7016 // Wrap the result in a promise if it didn't return one.\n 7017: $q.when(rsDataAdapter.readQuery($scope.instrument.config.source, dataSourcesService))\n 7018 .then(function(dimensionByRefId) {\n 7019 dimensionByRefId = dimensionByRefId || {};\n 7020: var aestheticMappings = getAestheticMappings($scope.instrument.config, dimensionByRefId, dataSourcesService.assignDimensionUrn);\n 7021 $scope.dimensionsByAesthetic = aestheticMappings.dimensionsByAesthetic;\n 7022 $scope.constantByAesthetic = aestheticMappings.constantByAesthetic;\n ....\n 7262 * metadata from Reporting Services. This metadata will be used to add information to the raw dimension\n 7263 * object in the query that doesn't have sufficient metadata.\n 7264: * @param {DataSourcesService} dataSourcesService A service to pull the proper dimension metadata\n 7265 * @param {Object} query The raw Reporting Services query\n 7266 * @return {Promise} Asynchronous promise\n 7267 */\n 7268: var getDimensionMetadataFromConfig = function(dataSourcesService, query) {\n 7269 var uniqueDataStores = [];\n 7270 query.filters.forEach(function(filter) {\n ....\n 7278 if (uniqueDataStores.length) {\n 7279 var defaultDataSource = uniqueDataStores[0];\n 7280: dataSourcesService.getDataSources()\n 7281 .then(function(dataSources) {\n 7282 for (var i = 0; i < dataSources.length; i++) {\n 7283 var dataSource = dataSources[i];\n 7284 if (defaultDataSource === dataSource.resourceUrn) {\n 7285: dataSourcesService.currentDataSource = dataSource;\n 7286 }\n 7287 }\n ....\n 7289 }\n 7290 \n 7291: return dataSourcesService.getDimensionsByDataSources(uniqueDataStores);\n 7292 };\n 7293 \n ....\n 7368 };\n 7369 \n 7370: module.exports = function(source, dataSourcesService) {\n 7371 var query = getQueryFromSource(source);\n 7372 if (query) {\n 7373: return getDimensionMetadataFromConfig(dataSourcesService, query)\n 7374 .then(function(dimensionsByDataStore) {\n 7375: return getRefIdDimensionMap(query, dimensionsByDataStore, dataSourcesService.assignDimensionUrn);\n 7376 });\n 7377 }\n\n/Users/nross/Work/javascript/totem/client/dist/scripts/totem.min.js.map:\n 1: {\"version\":3,\"sources\":[\"webpack:///webpack/bootstrap 6c4786d82bd4d974f2e9\",\"webpack:///./client/scripts/main.js\",\"webpack:///./client/instruments ^\\\\.\\\\/.*(\\\\/editor\\\\/editor|\\\\/renderer\\\\/renderer)$\",\"webpack:///./client/scripts/manage/controllers/manage-ctrl.js\",\"webpack:///./client/scripts/ad-hoc/controllers/ad-hoc-manage-ctrl.js\",\"webpack:///./client/scripts/ad-hoc/controllers/collection-ctrl.js\",\"webpack:///./client/scripts/ad-hoc/controllers/validate-upload-ctrl.js\",\"webpack:///./client/scripts/dashboard/controllers/dashboard-ctrl.js\",\"webpack:///./client/scripts/instrument/controllers/instrument-ctrl.js\",\"webpack:///./client/scripts/common/filters/i18n.js\",\"webpack:///./client/scripts/common/services/post-message.js\",\"webpack:///./client/scripts/common/services/q-all-settled.js\",\"webpack:///./client/scripts/common/services/q-ignorify.js\",\"webpack:///./client/scripts/common/services/exception-handler.js\",\"webpack:///./client/scripts/common/services/sso.js\",\"webpack:///./client/scripts/common/directives/app.js\",\"webpack:///./client/scripts/common/services/dashboard-service.js\",\"webpack:///./client/scripts/common/services/tag-service.js\",\"webpack:///./client/scripts/common/services/tag-enum.js\",\"webpack:///./client/scripts/common/directives/selection-table.js\",\"webpack:///./client/scripts/common/directives/sort-header.js\",\"webpack:///./client/scripts/common/services/ad-hoc-service.js\",\"webpack:///./client/scripts/common/directives/name-editor.js\",\"webpack:///./client/scripts/common/services/dashboard-workspace.js\",\"webpack:///./client/scripts/common/directives/alert.js\",\"webpack:///./client/scripts/common/directives/modal-progress-indicator.js\",\"webpack:///./client/scripts/manage/directives/manage-toolbar.js\",\"webpack:///./client/scripts/manage/directives/dashboard-search.js\",\"webpack:///./client/scripts/manage/views/manage.tpl.html\",\"webpack:///./client/scripts/ad-hoc/views/ad-hoc.tpl.html\",\"webpack:///./client/scripts/ad-hoc/views/collection.tpl.html\",\"webpack:///./client/scripts/ad-hoc/views/validate-upload.tpl.html\",\"webpack:///./client/scripts/dashboard/views/dashboard.tpl.html\",\"webpack:///./client/scripts/instrument/views/instrument.tpl.html\",\"webpack:///./client/scripts/instrument/views/render-instrument.tpl.html\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-manage-toolbar.js\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-search.js\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-capacity.js\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-data-upload.js\",\"webpack:///./client/scripts/dashboard/directives/dashboard-canvas.js\",\"webpack:///./client/scripts/dashboard/directives/dashboard-rail.js\",\"webpack:///./client/scripts/dashboard/directives/responsive-evaluator.js\",\"webpack:///./client/scripts/dashboard/directives/dashboard-instrument-chrome.js\",\"webpack:///./client/scripts/dashboard/directives/media-definition-track.js\",\"webpack:///./client/scripts/dashboard/directives/media-definition-menu.js\",\"webpack:///./client/scripts/dashboard/directives/ruler.js\",\"webpack:///./client/scripts/instrument/directives/instrument.js\",\"webpack:///./client/scripts/instrument/directives/new-instrument-configuration.js\",\"webpack:///./client/scripts/instrument/directives/instrument-editor-bootstrap.js\",\"webpack:///./client/scripts/dashboard/services/event-bus.js\",\"webpack:///./client/scripts/instrument/services/instrument-event-bus.js\",\"webpack:///./client/scripts/common/directives/app.tpl.html\",\"webpack:///./client/scripts/common/services/uuid.js\",\"webpack:///./client/scripts/common/services/dashboard-mixin.js\",\"webpack:///./client/scripts/common/services/sequence.js\",\"webpack:///./client/scripts/common/services/participable-mixin.js\",\"webpack:///./client/instruments ^\\\\.\\\\/.*\\\\/renderer\\\\/renderer$\",\"webpack:///./client/instruments ^\\\\.\\\\/.*\\\\/editor\\\\/editor$\",\"webpack:///./client/scripts/common/directives/steal-focus.js\",\"webpack:///./client/scripts/common/directives/name-editor.tpl.html\",\"webpack:///./client/scripts/common/directives/alert.tpl.html\",\"webpack:///./client/scripts/common/directives/modal-progress-indicator.tpl.html\",\"webpack:///./client/scripts/common/directives/share.js\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-file-upload.js\",\"webpack:///./client/scripts/common/services/debounce.js\",\"webpack:///./client/scripts/common/directives/draggable.js\",\"webpack:///./client/scripts/common/directives/resizeable.js\",\"webpack:///./client/scripts/common/directives/tap.js\",\"webpack:///./client/scripts/dashboard/directives/media-definition-range.js\",\"webpack:///./client/scripts/dashboard/directives/media-definition-rename-popover.js\",\"webpack:///./client/scripts/dashboard/directives/media-definition-delete-popover.js\",\"webpack:///./client/scripts/manage/directives/dashboard-search.tpl.html\",\"webpack:///./client/scripts/manage/directives/manage-toolbar.tpl.html\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-search.tpl.html\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-capacity.tpl.html\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-manage-toolbar.tpl.html\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-data-upload.tpl.html\",\"webpack:///./client/scripts/dashboard/directives/dashboard-canvas.tpl.html\",\"webpack:///./client/scripts/dashboard/directives/dashboard-instrument-chrome.tpl.html\",\"webpack:///./client/scripts/dashboard/directives/dashboard-rail.tpl.html\",\"webpack:///./client/scripts/dashboard/directives/media-definition-track.tpl.html\",\"webpack:///./client/scripts/dashboard/directives/media-definition-menu.tpl.html\",\"webpack:///./client/scripts/instrument/directives/instrument.tpl.html\",\"webpack:///./client/scripts/instrument/directives/new-instrument-configuration.tpl.html\",\"webpack:///./common/dashboard-util.js\",\"webpack:///./client/instruments/demo-html/renderer/renderer.js\",\"webpack:///./client/instruments/dv/editor/editor.js\",\"webpack:///./client/instruments/dv/renderer/renderer.js\",\"webpack:///./client/instruments/key-metric/renderer/renderer.js\",\"webpack:///./client/instruments/starfield/renderer/renderer.js\",\"webpack:///./client/instruments/text/editor/editor.js\",\"webpack:///./client/instruments/text/renderer/renderer.js\",\"webpack:///./client/instruments/twitter-trends/renderer/renderer.js\",\"webpack:///./client/scripts/common/directives/invalid-share-action-alert.js\",\"webpack:///./client/scripts/common/directives/user-search.js\",\"webpack:///./client/scripts/common/directives/share.tpl.html\",\"webpack:///./client/scripts/ad-hoc/directives/ad-hoc-file-upload.tpl.html\",\"webpack:///./client/scripts/common/services/drag-resize-util.js\",\"webpack:///./client/scripts/common/services/auto-scroll.js\",\"webpack:///./client/scripts/dashboard/directives/media-definition-range.tpl.html\",\"webpack:///./client/scripts/dashboard/directives/media-definition-popover.js\",\"webpack:///./client/scripts/dashboard/directives/media-definition-rename-popover.tpl.html\",\"webpack:///./client/scripts/dashboard/directives/media-definition-delete-popover.tpl.html\",\"webpack:///./client/instruments/dv/editor/editor.html\",\"webpack:///./client/instruments/text/editor/editor.html\",\"webpack:///./client/instruments/text/editor/directives/quill.html\",\"webpack:///./client/instruments/text/editor/directives/quill-toolbar.html\",\"webpack:///./client/instruments/text/editor/directives/quill-editor.html\",\"webpack:///./client/instruments/dv/editor/services/data-sources-service.js\",\"webpack:///./client/instruments/dv/editor/services/dv-config-service.js\",\"webpack:///./client/instruments/dv/editor/services/aesthetic-defaults.js\",\"webpack:///./client/instruments/dv/editor/directives/y-aesthetic-configuration.js\",\"webpack:///./client/instruments/dv/editor/directives/variable-configuration.js\",\"webpack:///./client/instruments/dv/editor/directives/dimension-pod.js\",\"webpack:///./client/instruments/dv/editor/controllers/data-panel-ctrl.js\",\"webpack:///./client/instruments/dv/editor/controllers/line-ctrl.js\",\"webpack:///./client/instruments/dv/enum/melt-column.js\",\"webpack:///./client/instruments/dv/editor/adapters/rs/adapter.js\",\"webpack:///./client/scripts/common/directives/invalid-share-action-alert.tpl.html\",\"webpack:///./client/scripts/common/services/user-service.js\",\"webpack:///./client/scripts/common/directives/user-search.tpl.html\",\"webpack:///./client/scripts/dashboard/directives/media-definition-popover.tpl.html\",\"webpack:///./client/instruments/dv/enum/dimension-type.js\",\"webpack:///./client/instruments/dv/editor/directives/y-aesthetic-configuration.tpl.html\",\"webpack:///./client/instruments/dv/editor/directives/variable-configuration.tpl.html\",\"webpack:///./client/instruments/dv/editor/directives/dimension-pod.tpl.html\",\"webpack:///./client/instruments/dv/enum/filter-type.js\",\"webpack:///./client/instruments/dv/editor/adapters/rs/query-reader.js\",\"webpack:///./client/instruments/dv/editor/adapters/rs/query-writer.js\",\"webpack:///./client/instruments/dv/editor/adapters/rs/value-loader.js\"],\"names\":[],\"mappings\":\";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,wC;;;;;;;ACtCA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA0B,YAAY,aAAa,aAAa;AAChE;AACA;AACA,QAAO;AACP;AACA;AACA,QAAO;AACP;AACA,2BAA0B,YAAY,aAAa,aAAa;AAChE;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;;AAEP;;AAEA;AACA,eAAc;AACd,MAAK;AACL,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;;;;;;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAiC,uDAAuD;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrBA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,yCAAwC,gEAAgE;AACxG;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP,gBAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;;;;;;AChFH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;;;;;;AC1CH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAgC,2EAA2E;AAC3G;AACA,UAAS;AACT;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAA+B,wCAAwC;AACvE;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,IAAG;;;;;;;ACjFH;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO,qDAAqD;AAC5D,QAAO,qDAAqD;AAC5D,QAAO,wDAAwD;AAC/D,QAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAoB,qBAAqB;AACzC;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,mBAAkB,8BAA8B;AAChD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAkB,4BAA4B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX,UAAS;AACT,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAgB;AAChB;AACA;AACA;AACA;AACA,mBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;AACA,IAAG;;;;;;;ACrHH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;AACL;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACrHH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,sCAAqC,uCAAuC;AAC5E;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,IAAG;;;;;;;AC9DH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,qDAAoD;AACpD;AACA,6DAA4D;AAC5D;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACjBH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;AC/DH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAoB;AACpB,YAAW;AACX,qBAAoB;AACpB,YAAW;AACX,UAAS;AACT;AACA;AACA,MAAK;AACL,IAAG;;;;;;;ACtBH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,MAAK;AACL,IAAG;;;;;;;ACpEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,IAAG;;;;;;;;ACzBH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;AC5BD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACXH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA,sBAAqB,uBAAuB;AAC5C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA,UAAS;;AAET;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT,QAAO;;AAEP;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT,QAAO;;AAEP;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACrSH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,YAAW;AACX;AACA;AACA,YAAW;AACX;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX,UAAS;AACT;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;AC7FH;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACJH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACxDH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;AC9BH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAuB,wBAAwB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB;AACnB;AACA,kBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACraH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACbH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,wBAAuB,iCAAiC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA,iBAAgB,0BAA0B,EAAE;AAC5C,iBAAgB,qBAAqB,EAAE;AACvC,iBAAgB,gCAAgC;AAChD;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;;AAGH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,EAAC;;;;;;;AC5GD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,YAAW;AACX,UAAS;AACT;AACA;AACA,IAAG;;;;;;;AC1BH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACzBH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,cAAa;AACb,YAAW;AACX;;AAEA;AACA;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;AACb,YAAW;;AAEX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,cAAa;AACb,YAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAAyB,qCAAqC;AAC9D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,0BAAyB,qCAAqC;AAC9D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAAyB,qCAAqC;AAC9D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAAyB,qCAAqC;AAC9D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA,IAAG;;;;;;;ACpNH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACjBH,2/BAA0/B,iBAAiB,yUAAyU,mBAAmB,wVAAwV,oBAAoB,wUAAwU,kBAAkB,wQAAwQ,sBAAsB,kLAAkL,oBAAoB,+0BAA+0B,6IAA6I,uIAAuI,2BAA2B,MAAM,kBAAkB,2EAA2E,6CAA6C,mKAAmK,0CAA0C,qKAAqK,oBAAoB,wPAAwP,2CAA2C,uD;;;;;;ACAx8I,85BAA65B,iBAAiB,6RAA6R,sBAAsB,yPAAyP,uBAAuB,mRAAmR,oBAAoB,kUAAkU,qBAAqB,ysBAAysB,2BAA2B,MAAM,mBAAmB,UAAU,wBAAwB,kKAAkK,iBAAiB,sEAAsE,cAAc,sEAAsE,gCAAgC,qHAAqH,qBAAqB,gBAAgB,oBAAoB,sF;;;;;;ACAz6G,qHAAoH,8BAA8B,gLAAgL,mBAAmB,uNAAuN,iBAAiB,+8CAA+8C,iBAAiB,0OAA0O,wBAAwB,uWAAuW,uBAAuB,6RAA6R,0BAA0B,gRAAgR,qBAAqB,4HAA4H,yBAAyB,uHAAuH,oBAAoB,8HAA8H,uBAAuB,wHAAwH,qBAAqB,oUAAoU,oBAAoB,uOAAuO,gCAAgC,0SAA0S,qBAAqB,gBAAgB,oBAAoB,8PAA8P,mFAAmF,yQAAyQ,iDAAiD,qGAAqG,8BAA8B,qGAAqG,4BAA4B,6gB;;;;;;ACA5oL,kMAAiM,iCAAiC,qLAAqL,mBAAmB,iKAAiK,iBAAiB,kWAAkW,sBAAsB,gOAAgO,+BAA+B,mFAAmF,+BAA+B,+MAA+M,uBAAuB,kmBAAkmB,wCAAwC,oiBAAoiB,qCAAqC,sEAAsE,SAAS,2UAA2U,2BAA2B,qE;;;;;;ACAnrG,mbAAkb,mBAAmB,mIAAmI,iBAAiB,oYAAoY,+BAA+B,6JAA6J,2BAA2B,wIAAwI,iBAAiB,wJAAwJ,eAAe,+JAA+J,qBAAqB,4JAA4J,eAAe,2eAA2e,0BAA0B,sDAAsD,0FAA0F,0hB;;;;;;ACAx+E,yRAAwR,mBAAmB,wHAAwH,iBAAiB,uH;;;;;;ACApb,sQ;;;;;;ACAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA,YAAW;;AAEX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb,YAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,6BAA4B,sCAAsC;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAAyB,sCAAsC;AAC/D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mCAAkC,kBAAkB;AACpD;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;AC1GH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACjBH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,8BAA6B,eAAe;AAC5C;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;;AAEA;AACA,uDAAsD;AACtD;AACA,qDAAoD;AACpD;AACA,6B;AACA,uDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACpCH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;ACdD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,gBAAe;;AAEf,qDAAoD;AACpD,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA,uBAAsB,8CAA8C,EAAE;AACtE,uBAAsB,+CAA+C;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf,cAAa;;AAEb;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA2B,yBAAyB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA,gBAAe;AACf;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA,IAAG;;;;;;;AC1OH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;AClBH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,YAAW;AACX,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA,UAAS;;AAET;AACA;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACtFH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACpCH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAyB,mBAAmB;AAC5C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,0CAAyC;AACzC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0CAAyC;AACzC,0CAAyC;AACzC,0CAAyC;;AAEzC;AACA;AACA;AACA,8BAA6B;;AAE7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,cAAa;AACb,YAAW;AACX;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;AC1MH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACnEH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,wBAAuB,eAAe;AACtC;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,IAAG;;;;;;;AChCH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA,cAAa;;AAEb;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;AChGH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb,YAAW;AACX;AACA;AACA;AACA,IAAG;;;;;;;AC5CH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;;;;;;ACnDH;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;AChBH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,gBAAe,OAAO;AACtB,gBAAe,OAAO;AACtB,gBAAe,cAAc;AAC7B;AACA,gBAAe,cAAc;AAC7B;AACA,gBAAe,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAAyB,0BAA0B;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA,gBAAe,OAAO;AACtB,gBAAe,OAAO;AACtB,gBAAe,SAAS;AACxB;AACA,gBAAe,cAAc;AAC7B;AACA,gBAAe,cAAc;AAC7B;AACA,gBAAe,OAAO;AACtB;AACA,kBAAiB,SAAS;AAC1B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe,cAAc;AAC7B,mBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;;AAEA;AACA,IAAG;AACH;;;;;;;AClHA,sI;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;;;;;;ACTH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,0BAAyB,sBAAsB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAO;AACP;AACA;AACA;AACA,UAAS;AACT,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,oBAAmB;AACnB;AACA;AACA,iEAAgE,gCAAgC,EAAE;AAClG,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,0BAAyB,yBAAyB;AAClD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT,QAAO;AACP;AACA;;AAEA;;AAEA,wBAAuB,yBAAyB;AAChD;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA,YAAW;AACX;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;;AAET;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;;AAEA;AACA,6CAA4C;AAC5C;AACA;;AAEA;AACA;;AAEA;AACA,QAAO;;AAEP;AACA;AACA,kBAAiB,OAAO;AACxB;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA,QAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB,MAAM;AACvB;AACA;AACA,kBAAiB,MAAM;AACvB,kBAAiB,OAAO;AACxB;AACA;AACA,kBAAiB,OAAO;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT,QAAO;;AAEP;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;;;;;;;AChSH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;;;;;;AChBH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,wBAAuB,8BAA8B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,QAAO;AACP;AACA;AACA,wBAAuB,8BAA8B;AACrD;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,wBAAuB,8BAA8B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,UAAS;AACT,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,IAAG;;;;;;;ACtEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAiC,uDAAuD;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAiC,uDAAuD;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACfA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACvBH,gLAA+K,QAAQ,+S;;;;;;ACAvL,sEAAqE,0GAA0G,qVAAqV,QAAQ,kDAAkD,WAAW,iB;;;;;;ACAzkB,2EAA0E,sBAAsB,uF;;;;;;ACAhG;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB,gBAAe;AACf,cAAa;AACb,YAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB,gBAAe;AACf,cAAa;AACb,YAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,+BAA8B,mCAAmC;AACjE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;;;;;;ACrIH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf,cAAa;AACb;AACA;AACA;AACA;AACA,gBAAe;AACf,cAAa;AACb;AACA,cAAa;AACb;AACA,cAAa;AACb,UAAS;AACT;AACA;AACA,IAAG;;;;;;;AC/DH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,EAAC;;;;;;;ACrBD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,+BAA8B,yBAAyB;AACvD;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA,0CAAyC,yBAAyB;AAClE;;AAEA;AACA;AACA,kCAAiC,WAAW;AAC5C;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAiC,uBAAuB;AACxD;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf,cAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf,cAAa;AACb,YAAW;AACX,UAAS;AACT;AACA;AACA,IAAG;;;;;;;AC7JH;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iCAAgC,wCAAwC;AACxE;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb,YAAW;AACX;AACA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA,4CAA2C,wCAAwC;AACnF;;AAEA;AACA;AACA,oCAAmC,wCAAwC;AAC3E;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;;AAEA;AACA;AACA;AACA,oCAAmC,uBAAuB;AAC1D;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf,cAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf,cAAa;AACb,YAAW;AACX,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACnJH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;AACA,cAAa;AACb;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACrBH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,IAAG;;;;;;;ACbH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,0BAAyB;;AAEzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,kCAAiC;AACjC;AACA,cAAa;AACb;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;AC3DH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;ACrCH,y/D;;;;;;ACAA,4iBAA2iB,mBAAmB,8jBAA8jB,kBAAkB,mTAAmT,iBAAiB,wTAAwT,sBAAsB,opCAAopC,2BAA2B,iTAAiT,iBAAiB,0VAA0V,mBAAmB,6OAA6O,gCAAgC,2BAA2B,sCAAsC,8UAA8U,mBAAmB,oVAAoV,iCAAiC,oJAAoJ,kCAAkC,6HAA6H,iCAAiC,2BAA2B,0BAA0B,8UAA8U,mBAAmB,oVAAoV,kCAAkC,2KAA2K,mCAAmC,gD;;;;;;ACAh9L,s+D;;;;;;ACAA,2FAA0F,8BAA8B,+IAA+I,gCAAgC,wGAAwG,uCAAuC,8B;;;;;;ACAtb,6iBAA4iB,mBAAmB,gSAAgS,gBAAgB,oTAAoT,iBAAiB,4VAA4V,mBAAmB,4TAA4T,kBAAkB,+OAA+O,yBAAyB,2BAA2B,+BAA+B,8UAA8U,mBAAmB,oVAAoV,mCAAmC,4KAA4K,oCAAoC,gD;;;;;;ACA3lG,oSAAmS,kCAAkC,4JAA4J,0CAA0C,+CAA+C,wCAAwC,+CAA+C,uCAAuC,+CAA+C,2CAA2C,+CAA+C,yCAAyC,6L;;;;;;ACA12B,oEAAmE,4CAA4C,w+BAAw+B,+BAA+B,uB;;;;;;ACAtnC,4HAA2H,2DAA2D,8BAA8B,oBAAoB,wyC;;;;;;ACAxO,oUAAmU,2BAA2B,yBAAyB,4CAA4C,KAAK,kBAAkB,wC;;;;;;ACA1b,k0CAAi0C,oS;;;;;;ACAj0C,2GAA0G,oCAAoC,+CAA+C,GAAG,qjBAAqjB,wBAAwB,qMAAqM,+BAA+B,2BAA2B,GAAG,ygBAAygB,iCAAiC,2BAA2B,GAAG,q5BAAq5B,+BAA+B,2C;;;;;;ACA3gF,kRAAiR,wEAAwE,wFAAwF,8BAA8B,iB;;;;;;ACA/c,8RAA6R,qKAAqK,8D;;;;;;ACAlc;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,KAAI;AACJ,IAAG;AACH;AACA,G;;;;;;AChCA;;AAEA;AACA;AACA;AACA;;;;;;;ACLA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;ACtBA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,0BAAyB,kBAAkB;AAC3C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA2B;AAC3B;AACA;AACA;AACA,YAAW;AACX;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;;AAEb;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;;;;;;AC/QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACZA;AACA;AACA;AACA;AACA;;;;;;;ACJA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA,yBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAoC,mBAAmB;AACvD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAoC,mBAAmB;AACvD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB;AACnB,mCAAkC,uCAAuC;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;;;;;;;ACrSA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAsC,qBAAqB;AAC3D;AACA,sDAAqD,YAAY,kBAAkB,YAAY;AAC/F;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;;;;;;ACnCA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA,cAAa;;AAEb;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;ACpCH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wBAAuB,qBAAqB;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,kBAAiB;AACjB;AACA,kBAAiB;AACjB,gBAAe;AACf;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA,4BAA2B,kBAAkB;AAC7C;AACA;AACA,mCAAkC,WAAW;AAC7C;AACA;;AAEA,4BAA2B,mBAAmB;AAC9C;AACA;AACA,oCAAmC,aAAa;AAChD;AACA;;AAEA;AACA,YAAW;AACX,UAAS;AACT;AACA;AACA,IAAG;;;;;;;AC5GH,qEAAoE,qBAAqB,yhDAAyhD,8BAA8B,wPAAwP,qCAAqC,sHAAsH,kCAAkC,sQAAsQ,uBAAuB,2UAA2U,qCAAqC,41BAA41B,mBAAmB,+dAA+d,mBAAmB,mIAAmI,iBAAiB,gD;;;;;;ACAvsI,gSAA+R,uBAAuB,0DAA0D,kBAAkB,kB;;;;;;ACAlY;AACA;AACA;;AAEA;AACA;AACA,gBAAe,MAAM;AACrB,kBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAe,MAAM;AACrB,kBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAe,MAAM;AACrB,gBAAe,OAAO;AACtB,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAe,MAAM;AACrB,gBAAe,OAAO;AACtB,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;;;;;;AC7DH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe,OAAO;AACtB;AACA,gBAAe,OAAO;AACtB,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA,gBAAe,mBAAmB;AAClC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAe,MAAM;AACrB;AACA;AACA;AACA;;AAEA;AACA,IAAG;;;;;;;AC3GH,yEAAwE,iDAAiD,wDAAwD,QAAQ,iF;;;;;;ACAzL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA,8CAA6C;AAC7C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA,kBAAiB;AACjB;;AAEA;AACA;AACA,cAAa;AACb,YAAW;AACX;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,IAAG;;;;;;;AChEH,oUAAmU,yBAAyB,kTAAkT,mBAAmB,kIAAkI,kBAAkB,gE;;;;;;ACArzB,6SAA4S,wBAAwB,wLAAwL,mBAAmB,kIAAkI,mBAAmB,gE;;;;;;ACApqB,mmCAAkmC,eAAe,2cAA2c,iBAAiB,+3K;;;;;;ACA7kD,4G;;;;;;ACAA,uG;;;;;;ACAA,m8G;;;;;;ACAA,iC;;;;;;ACAA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA,YAAW;AACX,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,0DAAyD;AACzD;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,MAAK;;AAEL;AACA;AACA;AACA,iBAAgB,MAAM;AACtB,iBAAgB,0BAA0B,mBAAmB,EAAE;AAC/D;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;AACP,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT,MAAK;;AAEL;;AAEA;AACA;;AAEA;;;;;;;ACxHA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB,OAAO;AACvB;AACA;AACA;AACA,mBAAkB;AAClB,2BAA0B;AAC1B;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC/BA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;AChBD;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;;;;;;;ACZA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;;AAEA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;;;;;;;ACnIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;;;;;;ACbA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;;;;;;AC1CA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT,kCAAiC;AACjC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAmB,wBAAwB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA,oBAAmB;AACnB,qBAAoB;AACpB,kBAAiB;AACjB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,8BAA6B,kBAAkB;AAC/C;;AAEA,iCAAgC;AAChC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,wCAAwC;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB,uBAAuB;AAC9C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA0B;AAC1B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,cAAa;AACb;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;AAEA,8DAA6D;;AAE7D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;AACH;;;;;;;;;ACzcA;AACA;AACA;AACA,EAAC;;AAED;;;;;;;ACLA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACRA,+YAA8Y,WAAW,kB;;;;;;ACAzZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA,IAAG;;;;;;;AC1BH,wZAAuZ,kCAAkC,kG;;;;;;ACAzb,sF;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;;;;;;;ACPA,odAAmd,mBAAmB,+gB;;;;;;ACAte,qEAAoE,iBAAiB,q/BAAq/B,8fAA8f,eAAe,oGAAoG,iOAAiO,kGAAkG,2GAA2G,qBAAqB,SAAS,mGAAmG,oIAAoI,eAAe,oFAAoF,uDAAuD,kEAAkE,kDAAkD,uBAAuB,UAAU,aAAa,cAAc,eAAe,6CAA6C,yDAAyD,uBAAuB,aAAa,wBAAwB,qBAAqB,SAAS,8rBAA8rB,kDAAkD,uBAAuB,UAAU,6BAA6B,aAAa,cAAc,eAAe,qCAAqC,yDAAyD,uBAAuB,aAAa,wBAAwB,yHAAyH,QAAQ,qmBAAqmB,mBAAmB,6gB;;;;;;ACAlnJ,oQAAmQ,oLAAoL,uEAAuE,kBAAkB,6JAA6J,qBAAqB,gPAAgP,0CAA0C,yCAAyC,2BAA2B,MAAM,iBAAiB,e;;;;;;ACAvjC;AACA;AACA;AACA,EAAC;;AAED;;;;;;;ACLA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAY,mBAAmB;AAC/B,aAAY,OAAO;AACnB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,wBAAuB,wBAAwB;AAC/C;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA,aAAY,MAAM;AAClB,aAAY,OAAO;AACnB,aAAY,eAAe;AAC3B,aAAY,OAAO;AACnB;AACA;AACA;AACA,kBAAiB,6BAA6B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;;;;;;;;AClIA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb,YAAW;AACX;AACA;AACA;AACA,0BAAyB,oBAAoB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf,cAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;AC7FA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,+BAA8B,wBAAwB;AACtD;AACA;;AAEA;AACA,MAAK;;AAEL;AACA;AACA\",\"sourcesContent\":[\" \\t// The module cache\\n \\tvar installedModules = {};\\n\\n \\t// The require function\\n \\tfunction __webpack_require__(moduleId) {\\n\\n \\t\\t// Check if module is in cache\\n \\t\\tif(installedModules[moduleId])\\n \\t\\t\\treturn installedModules[moduleId].exports;\\n\\n \\t\\t// Create a new module (and put it into the cache)\\n \\t\\tvar module = installedModules[moduleId] = {\\n \\t\\t\\texports: {},\\n \\t\\t\\tid: moduleId,\\n \\t\\t\\tloaded: false\\n \\t\\t};\\n\\n \\t\\t// Execute the module function\\n \\t\\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\\n\\n \\t\\t// Flag the module as loaded\\n \\t\\tmodule.loaded = true;\\n\\n \\t\\t// Return the exports of the module\\n \\t\\treturn module.exports;\\n \\t}\\n\\n\\n \\t// expose the modules object (__webpack_modules__)\\n \\t__webpack_require__.m = modules;\\n\\n \\t// expose the module cache\\n \\t__webpack_require__.c = installedModules;\\n\\n \\t// __webpack_public_path__\\n \\t__webpack_require__.p = \\\"\\\";\\n\\n \\t// Load entry module and return exports\\n \\treturn __webpack_require__(0);\\n\\n\\n/** WEBPACK FOOTER **\\n ** webpack/bootstrap 6c4786d82bd4d974f2e9\\n **/\",\"'use strict';\\n/* global window: true */\\n\\nangular\\n .module('totem', [\\n 'ui.router',\\n 'ngCoral',\\n require('./manage/controllers/manage-ctrl').name,\\n require('./ad-hoc/controllers/ad-hoc-manage-ctrl').name,\\n require('./ad-hoc/controllers/collection-ctrl').name,\\n require('./ad-hoc/controllers/validate-upload-ctrl').name,\\n require('./dashboard/controllers/dashboard-ctrl').name,\\n require('./instrument/controllers/instrument-ctrl').name,\\n require('./common/filters/i18n').name,\\n require('./common/services/post-message').name,\\n require('./common/directives/app').name,\\n require('./common/services/q-all-settled').name,\\n require('./common/services/q-ignorify').name,\\n require('./common/services/exception-handler').name,\\n require('./common/services/sso').name\\n ])\\n .constant('gridSpacing', window.Totem ? window.Totem.config.gridSpacing : null)\\n .constant('user', window.Totem ? window.Totem.config.user : null)\\n .constant('minMediaDefinitionWidth', window.Totem ? window.Totem.config.minMediaDefinitionWidth : null)\\n .constant('minInstrumentWidth', window.Totem ? window.Totem.config.minInstrumentWidth : null)\\n .constant('minInstrumentHeight', window.Totem ? window.Totem.config.minInstrumentHeight : null)\\n .constant('duplicateInstrumentOffset', window.Totem ? window.Totem.config.duplicateInstrumentOffset : null)\\n .constant('ims', window.Totem ? window.Totem.config.ims : null)\\n .constant('env', window.Totem ? window.Totem.config.env : null)\\n .constant('externalServices', window.Totem ? window.Totem.config.externalServices : null)\\n .config(function(i18nBundleProvider, $controllerProvider, $compileProvider, $provide, $stateProvider, $urlRouterProvider, $httpProvider) {\\n i18nBundleProvider.bundle = window.i18n[window.Totem.config.locale];\\n\\n $stateProvider\\n .state('instrument', {\\n abstract: 'true',\\n url: '/dashboard/{dashboardId}/instrument/{instrumentId}',\\n template: require('./instrument/views/instrument.tpl.html'),\\n controller: 'InstrumentCtrl'\\n })\\n .state('instrument.edit', {\\n url: '/edit'\\n })\\n .state('renderInstrument', {\\n url: '/dashboard/{dashboardId}/instrument/{instrumentId}/render',\\n template: require('./instrument/views/render-instrument.tpl.html'),\\n controller: 'InstrumentCtrl'\\n })\\n .state('manage', {\\n url: '/dashboard/manage',\\n template: require('./manage/views/manage.tpl.html'),\\n controller: 'ManageCtrl'\\n })\\n .state('dashboard', {\\n abstract: true,\\n template: require('./dashboard/views/dashboard.tpl.html'),\\n controller: 'DashboardCtrl',\\n url: '/dashboard'\\n })\\n .state('dashboard.view', {\\n // If this dashboard ID param were on the parent \\\"dashboard\\\" state, it would reload the controller\\n // whenever going from viewing one dashboard to viewing another dashboard.\\n url: '/:dashboardId'\\n })\\n .state('dashboard.edit', {\\n // If this dashboard ID param were on the parent \\\"dashboard\\\" state, it would reload the controller\\n // whenever going from viewing one dashboard to viewing another dashboard.\\n url: '/:dashboardId/edit'\\n })\\n .state('ad-hoc',{\\n url: '/ad-hoc',\\n template: require('./ad-hoc/views/ad-hoc.tpl.html'),\\n controller: 'AdHocManageCtrl'\\n })\\n .state('collection', {\\n url:'/ad-hoc/:collectionId',\\n template: require('./ad-hoc/views/collection.tpl.html'),\\n controller: 'CollectionCtrl'\\n })\\n .state('validate', {\\n url:'/ad-hoc/validate/:pastebinId?collectionId',\\n template: require('./ad-hoc/views/validate-upload.tpl.html'),\\n controller: 'ValidateUploadCtrl'\\n });\\n\\n $urlRouterProvider.otherwise('dashboard/manage');\\n\\n $httpProvider.interceptors.push(function($q, sso) {\\n return {'request': sso.requestInterceptor.bind(sso)};\\n });\\n })\\n .run(function(postMessageService) {\\n // start the postMessage listeners.\\n postMessageService.listen();\\n })\\n;\\n\\n// Initialize instrument renderer and editor code. This should be done before the application is initialized since\\n// some of these instruments create angular directives, services, etc.\\nvar instrumentRequireContext = require.context('../instruments/', true, /^\\\\.\\\\/.*(\\\\/editor\\\\/editor|\\\\/renderer\\\\/renderer)$/);\\ninstrumentRequireContext.keys().forEach(instrumentRequireContext);\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/main.js\\n ** module id = 0\\n ** module chunks = 0\\n **/\",\"var map = {\\n\\t\\\"./demo-html/renderer/renderer\\\": 84,\\n\\t\\\"./dv/editor/editor\\\": 85,\\n\\t\\\"./dv/renderer/renderer\\\": 86,\\n\\t\\\"./key-metric/renderer/renderer\\\": 87,\\n\\t\\\"./starfield/renderer/renderer\\\": 88,\\n\\t\\\"./text/editor/editor\\\": 89,\\n\\t\\\"./text/renderer/renderer\\\": 90,\\n\\t\\\"./twitter-trends/renderer/renderer\\\": 91\\n};\\nfunction webpackContext(req) {\\n\\treturn __webpack_require__(webpackContextResolve(req));\\n};\\nfunction webpackContextResolve(req) {\\n\\treturn map[req] || (function() { throw new Error(\\\"Cannot find module '\\\" + req + \\\"'.\\\") }());\\n};\\nwebpackContext.keys = function webpackContextKeys() {\\n\\treturn Object.keys(map);\\n};\\nwebpackContext.resolve = webpackContextResolve;\\nmodule.exports = webpackContext;\\nwebpackContext.id = 1;\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/instruments ^\\\\.\\\\/.*(\\\\/editor\\\\/editor|\\\\/renderer\\\\/renderer)$\\n ** module id = 1\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.ManageCtrl', [\\n require('../../common/services/dashboard-service').name,\\n require('../../common/services/tag-service').name,\\n require('../../common/services/tag-enum').name,\\n require('../../common/directives/selection-table').name,\\n require('../../common/directives/sort-header').name,\\n require('../directives/manage-toolbar').name,\\n require('../directives/dashboard-search').name,\\n require('../../common/services/post-message').name\\n ])\\n .controller('ManageCtrl', function($scope, dashboardService, tagService, tagEnum, i18nFilter, postMessageService) {\\n var postTitle = function() {\\n postMessageService.post('external.pageTitle', i18nFilter('manageDashboards'));\\n };\\n\\n postTitle();\\n dashboardService.query().then(function(dashboards) {\\n $scope.dashboards = dashboards;\\n });\\n $scope.selectedDashboards = [];\\n $scope.sortPredicate = 'name';\\n $scope.sortReverse = false;\\n\\n $scope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {\\n // If we switch states within manage, make sure the page title remains.\\n if (fromState.name === 'manage' && toState.name !== 'manage') {\\n postTitle();\\n }\\n });\\n\\n $scope.getPluralizedOwners = function(owners) {\\n return i18nFilter('ownersValue', { OWNER: owners[0].entity.displayName, NUM_OWNERS: owners.length});\\n };\\n\\n $scope.getOwners = function(dashboard) {\\n return dashboard.getOwners();\\n };\\n\\n $scope.getFirstOwnerName = function(dashboard) {\\n var owners = dashboard.getOwners();\\n if (owners.length) {\\n return owners[0].entity.displayName;\\n }\\n return '';\\n };\\n\\n $scope.setSort = function(predicate) {\\n if ($scope.sortPredicate === predicate) {\\n $scope.sortReverse = !$scope.sortReverse;\\n } else {\\n $scope.sortReverse = false;\\n }\\n $scope.sortPredicate = predicate;\\n };\\n\\n $scope.isDashboardFavorited = function(dashboard) {\\n return dashboard.getFavoriteTag() != null;\\n };\\n\\n $scope.toggleFavorite = function(dashboard) {\\n var tag = dashboard.getFavoriteTag();\\n if (tag) {\\n dashboard.removeTag(tag);\\n tagService.destroy(tag);\\n } else {\\n tag = {dashboardId: dashboard._id, tag: tagEnum.FAVORITE};\\n dashboard.tags.push(tag);\\n tagService.save(tag);\\n }\\n };\\n\\n $scope.getSortDirection = function(predicate) {\\n if (predicate === $scope.sortPredicate) {\\n return $scope.sortReverse ? 'descending' : 'ascending';\\n }\\n\\n return null;\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/manage/controllers/manage-ctrl.js\\n ** module id = 2\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.AdHocManageCtrl', [\\n require('../../common/services/ad-hoc-service').name,\\n require('../../common/directives/selection-table').name,\\n require('../../common/directives/sort-header').name,\\n require('../directives/ad-hoc-manage-toolbar').name,\\n require('../directives/ad-hoc-search').name,\\n require('../directives/ad-hoc-capacity').name\\n ])\\n .controller('AdHocManageCtrl', function($scope, adHocService) {\\n adHocService.getAll().then(function(response) {\\n $scope.adHocCollections = response;\\n });\\n $scope.selectedAdHocCollections = [];\\n $scope.sortPredicate = 'name';\\n $scope.sortReverse = false;\\n\\n // This is really only used for sorting. Technically, straight up rowCount could be used instead, but if two\\n // different columns (records and capacity) used rowCount as their sort predicate, the sort direction icon on both\\n // columns would be active (showing) when the user sorted either of the rows. We don't want that so we have to\\n // distinguish...and why not distinguish by created a function that provides a true capacity number?\\n $scope.getCapacity = function(collection) {\\n return collection.rowCount / collection.maxRows;\\n };\\n\\n $scope.setSort = function(predicate) {\\n if ($scope.sortPredicate === predicate) {\\n $scope.sortReverse = !$scope.sortReverse;\\n } else {\\n $scope.sortReverse = false;\\n }\\n $scope.sortPredicate = predicate;\\n };\\n\\n $scope.getSortDirection = function(predicate) {\\n if (predicate === $scope.sortPredicate) {\\n return $scope.sortReverse ? 'descending' : 'ascending';\\n }\\n\\n return null;\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/controllers/ad-hoc-manage-ctrl.js\\n ** module id = 3\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.CollectionCtrl', [\\n require('../../common/services/ad-hoc-service').name,\\n require('../directives/ad-hoc-data-upload').name,\\n require('../directives/ad-hoc-capacity').name\\n ])\\n .controller('CollectionCtrl', function($scope, $stateParams, $state, adHocService, eventBus, i18nFilter) {\\n if ($stateParams.collectionId) {\\n adHocService.get($stateParams.collectionId).then(function(collection) {\\n $scope.collection = collection;\\n // make sure we set the current collection for state maintenance\\n adHocService.setCurrentCollection(collection);\\n });\\n } else {\\n if(!$scope.collection) {\\n $scope.collection = adHocService.getCurrentCollection();\\n }\\n }\\n\\n $scope.saveDisabled = false;\\n $scope.showDetails = false;\\n $scope.uploadFileName = null;\\n $scope.forceUploadVisibility = false;\\n\\n // saves collection meta-data\\n $scope.saveCollection = function() {\\n // save states\\n // 1) a file is uploaded and this is a new collection\\n // -> go to validate file and build directives for upload\\n // 2) a file is uploaded and this is an existing collection\\n // -> (validate) Use directives from existing collection\\n // 3) a file is not uploaded and this is an existing collection\\n // -> simply save the meta-data\\n // 4) if a file is not uploaded and this is not an existing collection then we are in a bad state and bail out\\n if(!$scope.collection) {\\n eventBus.publish('processFailed', i18nFilter('adhocCollectionSaveError'));\\n return;\\n }\\n if($scope.collection.id) {\\n if($scope.uploadFileName) {\\n $state.go('validate',{pastebinId:$scope.collection.pastebinId, collectionId:$scope.collection.id});\\n return;\\n } else {\\n adHocService.saveMetaData({\\n name:$scope.collection.name,\\n description:$scope.collection.description\\n },$stateParams.collectionId).then(function() {\\n adHocService.resetCurrentCollection();\\n $state.go('ad-hoc');\\n return;\\n });\\n }\\n } else {\\n if(!$scope.uploadFileName) {\\n eventBus.publish('processFailed', i18nFilter('adhocCollectionSaveError'));\\n adHocService.resetCurrentCollection();\\n $state.go('ad-hoc');\\n return;\\n }\\n if(!$scope.collection.pastebinId) {\\n eventBus.publish('processFailed', i18nFilter('adhocCollectionSaveError'));\\n return;\\n }\\n $state.go('validate', {pastebinId:$scope.collection.pastebinId});\\n return;\\n }\\n };\\n\\n $scope.cancelEditing = function() {\\n adHocService.resetCurrentCollection();\\n $state.go('ad-hoc');\\n };\\n\\n $scope.deleteUpload = function (collection, upload) {\\n adHocService.deleteUpload(collection, upload).then(function(result) {\\n // @todo: success message?\\n }, function(reason) {\\n console.log(reason);\\n });\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/controllers/collection-ctrl.js\\n ** module id = 4\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.ValidateUploadCtrl', [\\n require('../../common/services/ad-hoc-service').name\\n ])\\n .controller('ValidateUploadCtrl', function($scope, $stateParams, $state, adHocService, i18nFilter) {\\n $scope.columnOptions = new Array(\\n {label: i18nFilter('columnTypeText'), value:'string' },\\n {label: i18nFilter('columnTypeInteger'), value:'int' },\\n {label: i18nFilter('columnTypeDecimal'), value:'decimal'},\\n {label: i18nFilter('columnTypeDate'), value:'datetime'}\\n );\\n\\n $scope.selectedTypes = [];\\n $scope.saveDisabled = true;\\n $scope.schemaEditable = !$stateParams.collectionId;\\n\\n // if we don't have a pastebin ID go back to the upload screen, something wrong has happened\\n // we may have had a refresh, in which case we have lost context and need to go back to that\\n // screen anyways\\n var collection = adHocService.getCurrentCollection();\\n var pastebinId = $stateParams.pastebinId || collection.pastebinId;\\n if(!pastebinId) {\\n var params = {};\\n if($stateParams.collectionId) {\\n params.collectionId = $stateParams.collectionId;\\n }\\n $state.go('collection', params);\\n return;\\n }\\n\\n // do a test run on the pastebin data\\n adHocService.preRunFromPastebin(pastebinId, 20, $stateParams.collectionId).then( function(data) {\\n if(!data || data.status) {\\n $scope.uploadError = true;\\n if(data.status == 409) {\\n $scope.uploadErrorMessage = i18nFilter('fileUploadConflict');\\n } else {\\n $scope.uploadErrorMessage = i18nFilter('fileUploadFailure');\\n }\\n } else {\\n $scope.saveDisabled = false;\\n $scope.adHocSchema = data.schema;\\n $scope.adHocDirectives = data.directives;\\n $scope.adHocData = data.data;\\n\\n // I am unable to bind directly to my model for the select so I am creating a proxy\\n // the model will need to be updated from the proxy before uploading\\n for(var i=0;i<data.schema.length;i++) {\\n $scope.selectedTypes[i] = $scope.getSelectedType($scope.adHocSchema[i].type);\\n }\\n }\\n });\\n\\n $scope.getSelectedType = function(type) {\\n var option = $scope.columnOptions[0];\\n for(var i=0;i<$scope.columnOptions.length;i++) {\\n if($scope.columnOptions[i].value == type) {\\n option = $scope.columnOptions[i];\\n }\\n }\\n return option;\\n };\\n\\n $scope.cancelUpload = function() {\\n var params = {};\\n if($stateParams.collectionId) {\\n params.collectionId = $stateParams.collectionId;\\n }\\n $state.go('collection', params);\\n };\\n\\n $scope.saveCollection = function() {\\n // go through the selected types and update the actual model from our proxy object\\n for(var i=0;i<$scope.adHocSchema.length;i++) {\\n if($scope.selectedTypes[i] && $scope.selectedTypes[i].value) {\\n $scope.adHocSchema[i].type = $scope.selectedTypes[i].value;\\n }\\n }\\n var err = verifySchemaAndDirectives($scope.adHocDirectives, $scope.adHocSchema);\\n if(err == null) {\\n $scope.saveDisabled = true;\\n adHocService.createFromPastebin(pastebinId, $scope.adHocDirectives, $scope.adHocSchema, $stateParams.collectionId).then(function(data) {\\n if(!data) {\\n console.log('error processing complete file');\\n }\\n // need to refresh collection cache\\n adHocService.getAll(true).then(function(result) {\\n adHocService.resetCurrentCollection();\\n $state.go('ad-hoc');\\n });\\n });\\n } else {\\n // alert the customer to the error\\n $scope.uploadError = true;\\n $scope.uploadErrorMessage = err.msg;\\n }\\n };\\n\\n /**\\n * return null if valid and an error object if invalid\\n * error = {msg:i18nFilter(\\\"message\\\")}\\n */\\n var verifySchemaAndDirectives = function(directives, schema) {\\n var err = null;\\n // schema\\n for(var i=0;i<schema.length;i++) {\\n if(!schema[i].prettyName) {\\n err = {\\n msg:i18nFilter('allNameFieldsRequiredError')\\n };\\n }\\n }\\n // directives\\n // err = {msg:i18nFilter('badDirective')};\\n return err;\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/controllers/validate-upload-ctrl.js\\n ** module id = 5\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.DashboardEditCtrl', [\\n require('../directives/dashboard-canvas').name,\\n require('../directives/dashboard-rail').name,\\n require('../directives/responsive-evaluator').name,\\n require('../directives/dashboard-instrument-chrome').name,\\n require('../../instrument/directives/instrument').name,\\n require('../../instrument/directives/new-instrument-configuration').name,\\n require('../../common/directives/name-editor').name,\\n require('../directives/media-definition-track').name,\\n require('../directives/media-definition-menu').name,\\n require('../directives/ruler').name,\\n require('../../common/services/dashboard-service').name,\\n require('../services/event-bus').name,\\n require('../../common/services/dashboard-workspace').name,\\n require('../../common/services/post-message').name\\n ])\\n .controller('DashboardCtrl', function($scope, $state, $window, dashboardService, dashboardWorkspaceService, i18nFilter, eventBus, postMessageService) {\\n $scope.editable = false;\\n $scope.showRail = false;\\n $scope.newInstrumentConfigVisible = false;\\n\\n $scope.toggleRail = function() {\\n $scope.showRail = !$scope.showRail;\\n eventBus.publish('resetActiveMediaDefinition');\\n };\\n\\n var updateEditable = function() {\\n $scope.editable = $state.is('dashboard.edit');\\n };\\n\\n var loadDashboard = function(dashboardId) {\\n if (!dashboardWorkspaceService.dashboard || dashboardWorkspaceService.dashboard._id !== dashboardId) {\\n postMessageService.post('external.pageTitle', i18nFilter('dashboard'));\\n dashboardService.get(dashboardId).then(function(dashboard) {\\n dashboardWorkspaceService.pristineDashboard = dashboard;\\n dashboardWorkspaceService.dashboard = angular.copy(dashboard);\\n dashboardWorkspaceService.page = dashboard.pages[0];\\n postMessageService.post('external.pageTitle', dashboard.name);\\n });\\n } else {\\n postMessageService.post('external.pageTitle', dashboardWorkspaceService.dashboard.name);\\n }\\n };\\n\\n $scope.setActiveMediaDefinition = function(mediaDefinition) {\\n dashboardWorkspaceService.mediaDefinition = mediaDefinition;\\n };\\n\\n $scope.saveDashboard = function() {\\n dashboardService.save(dashboardWorkspaceService.dashboard).then(function() {\\n dashboardWorkspaceService.updatePristineCopy();\\n $state.go('dashboard.view', {\\n dashboardId: dashboardWorkspaceService.dashboard._id\\n });\\n });\\n };\\n\\n $scope.cancelEditing = function() {\\n dashboardWorkspaceService.revertChanges();\\n $state.go('dashboard.view', {\\n dashboardId: dashboardWorkspaceService.dashboard._id\\n });\\n };\\n\\n $scope.getRailToggleText = function() {\\n return i18nFilter($scope.showRail ? 'hideDashboardRail' : 'showDashboardRail');\\n };\\n\\n $scope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {\\n // Would love to show the user a prompt asking if they wish to continue their navigation or stay on the\\n // edit screen but this bug prevents it from happening without super-hax:\\n // https://github.com/angular-ui/ui-router/issues/273\\n if (fromState.name === 'dashboard.edit' && toState.name !== 'instrument.edit') {\\n dashboardWorkspaceService.revertChanges();\\n }\\n });\\n\\n $scope.$on('$stateChangeSuccess', function(e, to, toParams) {\\n if (to.name.indexOf('dashboard.') === 0) {\\n updateEditable();\\n loadDashboard(toParams.dashboardId);\\n }\\n });\\n\\n updateEditable();\\n\\n angular.element($window).on('beforeunload', function() {\\n if ($state.is('dashboard.edit') &&\\n !angular.equals(dashboardWorkspaceService.dashboard, dashboardWorkspaceService.pristineDashboard)) {\\n return i18nFilter('unsavedChangesPrompt');\\n }\\n });\\n\\n $scope.$watch(function() {\\n return dashboardWorkspaceService.dashboard;\\n }, function(dashboard) {\\n $scope.dashboard = dashboard;\\n });\\n\\n $scope.getMeasurementsStyle = function() {\\n var largestWidth = 0;\\n\\n // Arbitrary width that provides some room for the the last media definition label.\\n var buffer = 100;\\n\\n if (dashboardWorkspaceService.dashboard) {\\n dashboardWorkspaceService.dashboard.mediaDefinitions.forEach(function(mediaDefinition) {\\n largestWidth = Math.max(largestWidth, mediaDefinition.width);\\n });\\n }\\n\\n return {\\n width: largestWidth + buffer\\n };\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/controllers/dashboard-ctrl.js\\n ** module id = 6\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.InstrumentCtrl', [\\n require('../directives/instrument').name,\\n require('../directives/instrument-editor-bootstrap').name,\\n require('../../common/directives/name-editor').name,\\n require('../services/instrument-event-bus').name\\n ])\\n .controller('InstrumentCtrl', function($scope, $stateParams, $state, $window, dashboardService, dashboardWorkspaceService, instrumentEventBus, i18nFilter) {\\n $scope.instrument = null;\\n\\n var init = function(dashboard) {\\n $scope.dashboard = dashboard;\\n $scope.dashboard.instruments.forEach(function(instrument) {\\n if (instrument._id === $stateParams.instrumentId) {\\n $scope.instrument = angular.copy(instrument);\\n $scope.pristineInstrument = instrument;\\n return false;\\n }\\n });\\n if(!$scope.instrument) {\\n $state.go('dashboard.edit', {dashboardId: $state.params.dashboardId});\\n }\\n };\\n\\n angular.element($window).on('beforeunload', function() {\\n if ($state.is('instrument.edit') &&\\n !angular.equals($scope.instrument, $scope.pristineInstrument)) {\\n return i18nFilter('unsavedChangesPrompt');\\n }\\n });\\n\\n // If the dashboard workspace's active dashboard contains the instrument we want to use it's dashboard copy since it\\n // is the working copy (instead of the pristine dashboard object). This way when the user saves instrument changes\\n // and navigates back to the dashboard view the view is properly updated because it's the same object reference.\\n if (dashboardWorkspaceService.dashboard && dashboardWorkspaceService.dashboard._id === $stateParams.dashboardId) {\\n init(dashboardWorkspaceService.dashboard);\\n } else {\\n dashboardService.get($stateParams.dashboardId).then(function(dashboard) {\\n init(dashboard);\\n });\\n }\\n\\n var navigateToDashboard = function() {\\n $state.go('dashboard.edit', {\\n dashboardId: $scope.dashboard._id\\n });\\n };\\n\\n $scope.cancel = function() {\\n $scope.instrument = angular.copy($scope.pristineInstrument);\\n navigateToDashboard();\\n };\\n\\n $scope.save = function() {\\n angular.copy($scope.instrument, $scope.pristineInstrument);\\n instrumentEventBus.publish({\\n from: $scope.instrument._id,\\n topic: 'configChanged'\\n });\\n dashboardService.save($scope.dashboard).then(navigateToDashboard);\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/instrument/controllers/instrument-ctrl.js\\n ** module id = 7\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.i18n', [])\\n .provider('i18nBundle', function() {\\n this.$get = function() {\\n return this.bundle;\\n };\\n })\\n .filter('i18n', function(i18nBundle) {\\n // If additional arguments are provided, those additional arguments will be replaced into the target string.\\n // For example, if the localized key is \\\"viewingBooks\\\" and the value is \\\"Viewing %s books\\\" then the appropriate\\n // call would be i18nFilter('viewingBooks', 15); to produce \\\"Viewing 15 books\\\".\\n // If the localized key is \\\"authors\\\" and the value is \\\"Authors %1$s and %2$s others\\\" then the appropriate\\n // call would be i18nFilter('authors', 'Bob Marley', 8); to produce \\\"Authors Bob Marley and 8 others\\\".\\n return function(key, replacements) {\\n var formatter = i18nBundle[key];\\n return formatter ? formatter(replacements) : key;\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/filters/i18n.js\\n ** module id = 8\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.postMessageService', [\\n ])\\n .factory('postMessageService', function($window, $rootScope, $location, eventBus) {\\n var listen = function() {\\n var self = this;\\n\\n // Listen for state changes that external applications should know about.\\n $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {\\n switch(toState.name) {\\n case 'dashboard.edit':\\n case 'instrument.edit':\\n case 'collection':\\n case 'validate':\\n self.post('external.hideShell');\\n break;\\n default:\\n self.post('external.showShell');\\n }\\n });\\n\\n $rootScope.$on('$stateChangeSuccess', function() {\\n // For some reason $location.hash() doesn't return anything. I believe it is because\\n // we are using Angular UI's UI-Router which does its own thing.\\n var hash = '#' + $location.absUrl().split('#')[1];\\n self.post('external.stateChange', hash);\\n });\\n\\n // Listen for other post messages that come across the wire.\\n $window.addEventListener('message', function(event) {\\n if (event.origin !== $window.location.origin) {\\n return;\\n }\\n self._handleMessage(event);\\n });\\n };\\n\\n var post = function(type, message) {\\n var packet = { type: type };\\n if (arguments.length > 1) {\\n packet.message = message;\\n }\\n // Need to stringify the post message because <IE10 requires the post message to only be a string\\n // and not an object.\\n // use the window's parent (the iframe parent to post into)\\n $window.parent.postMessage(JSON.stringify(packet), $window.location.origin);\\n };\\n\\n var _handleMessage = function(event) {\\n var packet = JSON.parse(event.data);\\n switch(packet.type) {\\n case 'external.viewportResize': {\\n eventBus.publish('resetActiveMediaDefinition');\\n break;\\n }\\n }\\n };\\n\\n return {\\n listen: listen,\\n post: post,\\n _handleMessage: _handleMessage\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/post-message.js\\n ** module id = 9\\n ** module chunks = 0\\n **/\",\"'use strict';\\n/**\\n * A port of Q's allSettled API. While $q.all is rejected as soon as any child promise is rejected, allSettled will\\n * allow all child promises to settle (be resolved or rejected) before resolving the master promise.\\n * The master promise will be resolved with an array of objects that represent the state of the child promises.\\n * See https://github.com/kriskowal/q/wiki/API-Reference#promiseallsettled fore more information.\\n */\\nmodule.exports = angular.module('qAllSettled', [])\\n .config(function($provide) {\\n $provide.decorator('$q', function($delegate) {\\n var $q = $delegate;\\n $q.allSettled = function(promises) {\\n return $q.all(promises.map(function(promise) {\\n return promise.then(function(value) {\\n return { state: 'fulfilled', value: value };\\n }, function(reason) {\\n return { state: 'rejected', reason: reason };\\n });\\n }));\\n };\\n return $q;\\n });\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/q-all-settled.js\\n ** module id = 10\\n ** module chunks = 0\\n **/\",\"'use strict';\\n/**\\n * A port of Q's allSettled API. While $q.all is rejected as soon as any child promise is rejected, allSettled will\\n * allow all child promises to settle (be resolved or rejected) before resolving the master promise.\\n * The master promise will be resolved with an array of objects that represent the state of the child promises.\\n * See https://github.com/kriskowal/q/wiki/API-Reference#promiseallsettled fore more information.\\n */\\nmodule.exports = angular.module('qIgnorify', [])\\n .config(function($provide) {\\n $provide.decorator('$q', function($delegate) {\\n var defer = $delegate.defer;\\n var when = $delegate.when;\\n var reject = $delegate.reject;\\n var all = $delegate.all;\\n\\n function decoratePromise(promise) {\\n promise.ignorify = function() {\\n promise._ignore = false;\\n promise._then = promise.then;\\n\\n promise.ignore = function() {\\n promise._ignore = true;\\n };\\n\\n promise.then = function(thenFn, errFn, notifyFn) {\\n return promise._then(\\n function() {\\n if (!promise._ignore) {\\n thenFn.apply(this, arguments);\\n }\\n },\\n function() {\\n if (!promise._ignore) {\\n errFn.apply(this, arguments);\\n }\\n },\\n function() {\\n if (!promise._ignore) {\\n notifyFn.apply(this, arguments);\\n }\\n }\\n );\\n };\\n return promise;\\n };\\n return promise;\\n }\\n\\n $delegate.defer = function() {\\n var deferred = defer();\\n decoratePromise(deferred.promise);\\n return deferred;\\n };\\n\\n $delegate.when = function() {\\n return decoratePromise(when.apply(this, arguments));\\n };\\n\\n $delegate.reject = function() {\\n return decoratePromise(reject.apply(this, arguments));\\n };\\n\\n $delegate.all = function() {\\n return decoratePromise(all.apply(this, arguments));\\n };\\n\\n return $delegate;\\n });\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/q-ignorify.js\\n ** module id = 11\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.exceptionHandler', [])\\n .factory('$exceptionHandler', function($log, $injector, env, uuid) {\\n return function(exception, cause) {\\n var id = uuid(),\\n $http = $injector.get('$http');\\n\\n $http.post('/ui/errorLog', {\\n id: id,\\n message: exception.message,\\n stack: exception.stack,\\n cause: cause\\n }).catch(function() {\\n if (env === 'development') {\\n $log.error('UI Error could not be logged successfully.');\\n }\\n });\\n\\n if (env === 'development') {\\n $log.error(exception);\\n } else {\\n $log.error('Error ID: ' + id);\\n }\\n };\\n });\\n\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/exception-handler.js\\n ** module id = 12\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.sso', [\\n require('../../dashboard/services/event-bus').name\\n])\\n.factory('sso', function(eventBus, i18nFilter, $window, ims) {\\n var lastChecked = null;\\n var expires = 60000;\\n return {\\n requestInterceptor: function(config) {\\n var now = new Date().getTime();\\n if(!lastChecked || now - lastChecked > expires) {\\n var url = 'https://' + ims.host + '/ims/check/v1/token?' +\\n 'callback=?' +\\n '&client_id=' + ims.clientId +\\n '&scope=AdobeID,openid' +\\n '&_=' + now\\n ;\\n $.getJSON(url, function(sessionData) {\\n if(sessionData.error || sessionData.error_flag) {\\n eventBus.publish('processFailed', i18nFilter('loggedOutError'));\\n }\\n });\\n lastChecked = now;\\n }\\n return config;\\n }\\n };\\n});\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/sso.js\\n ** module id = 13\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.app', [\\n require('./alert').name,\\n require('./modal-progress-indicator').name\\n ])\\n .directive('app', function() {\\n return {\\n restrict: 'EA',\\n template: require('./app.tpl.html')\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/app.js\\n ** module id = 14\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.dashboardService', [\\n require('./tag-service').name,\\n require('./uuid').name,\\n require('./dashboard-mixin').name\\n ])\\n .factory('dashboardService', function($http, $q, user, tagService, eventBus, i18nFilter, dashboardMixin) {\\n var dashboardCache;\\n var allDashboardsPromiseById;\\n var fullDashboardPromiseById = {};\\n\\n var removeDependenciesRequestTransformer = function(data) {\\n return JSON.stringify(data, function(key, val) {\\n if (key === 'tags') {\\n return undefined;\\n }\\n return val;\\n });\\n };\\n\\n var removeFromCache = function(dashboard) {\\n if (dashboardCache) {\\n var i = dashboardCache.length;\\n while (i--) {\\n if (dashboardCache[i]._id === dashboard._id) {\\n dashboardCache.splice(i, 1);\\n }\\n // Continue looping in case the dashboard is there more than once. (shouldn't happen)\\n }\\n }\\n };\\n\\n /**\\n * Loads and joins dependencies (e.g., tags) onto dashboards.\\n * @param dashboardsPromise The promise for dashboards that are loading. This takes a promise so that dashboards\\n * can be loading in parallel to dependencies loading instead of sequentially.\\n * @returns {Promise}\\n */\\n var joinDependencies = function(dashboardsPromise) {\\n return $q.all([dashboardsPromise, tagService.query()]).then(function(responses) {\\n return joinTags(responses[0], responses[1]);\\n });\\n };\\n\\n var joinTags = function(dashboards, tags) {\\n // We convert dashboards to an array below to make it easier to work with\\n // but we want to return what the user gave us.\\n var origDashboards = dashboards;\\n\\n if (!angular.isArray(dashboards)) {\\n dashboards = [dashboards];\\n }\\n\\n var tagsByDashboardId = {};\\n tags.forEach(function(tag) {\\n var tagsWithId = tagsByDashboardId[tag.dashboardId];\\n\\n if (!tagsWithId) {\\n tagsWithId = tagsByDashboardId[tag.dashboardId] = [];\\n }\\n\\n tagsWithId.push(tag);\\n });\\n\\n dashboards.forEach(function(dashboard) {\\n dashboard.tags = tagsByDashboardId[dashboard._id] || [];\\n });\\n\\n return origDashboards;\\n };\\n\\n var getDashboardFromArray = function(dashboards, id) {\\n for (var i = 0; i < dashboards.length; i++) {\\n var candidate = dashboards[i];\\n if (candidate._id === id) {\\n return candidate;\\n }\\n }\\n };\\n\\n /**\\n * Retrieves a single dashboard. This is a full dashboard object (contains all information for the dashboard).\\n * @param id\\n * @returns {Promise}\\n */\\n var get = function(id) {\\n var promise = fullDashboardPromiseById[id];\\n\\n if (!promise) {\\n var deferred = $q.defer();\\n promise = deferred.promise;\\n\\n // Fetch all shallow dashboard objects first. It makes dealing with the cache, outstanding requests, and\\n // memory references a lot easier. The downside is that we're waiting for all shallow dashboards to load\\n // before loading the full dashboard object that's being requested so this may be room for optimization\\n // in the future.\\n query().then(function(dashboards) {\\n var cachedDashboard = getDashboardFromArray(dashboards, id);\\n\\n if (cachedDashboard.isFullDashboard()) {\\n deferred.resolve(cachedDashboard);\\n } else {\\n fullDashboardPromiseById[id] = deferred.promise;\\n\\n $http({\\n method: 'GET',\\n url: '/dashboards/' + id\\n }).then(function(response) {\\n var fullDashboard = response.data;\\n // Extend the cached dashboard instead of replacing it since other piecees of the app may have reference\\n // to the instance and we don't want to have to manage those references.\\n angular.extend(cachedDashboard, fullDashboard);\\n deferred.resolve(cachedDashboard);\\n delete fullDashboardPromiseById[id];\\n });\\n }\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n }\\n\\n return promise;\\n };\\n\\n /**\\n * Retrieves all dashboards. These are \\\"shallow\\\" dashboard objects that only include high-level information\\n * (no information regarding instruments, layout, etc).\\n * @returns {Promise}\\n */\\n var query = function() {\\n if (allDashboardsPromiseById) {\\n return allDashboardsPromiseById;\\n }\\n\\n var deferred = $q.defer();\\n\\n if (dashboardCache) {\\n deferred.resolve(dashboardCache);\\n } else {\\n allDashboardsPromiseById = deferred.promise;\\n\\n var loadPromise = $http({\\n method: 'GET',\\n url: '/dashboards'\\n }).then(function(response) {\\n var dashboards = response.data;\\n dashboards.forEach(addObjectMethods);\\n return dashboards;\\n }).catch(function(error) {\\n return $q.reject(error);\\n });\\n\\n // Pass the promise immediately instead of waiting for the promise to complete. This way dependencies can be\\n // loaded in parallel.\\n joinDependencies(loadPromise).then(function(dashboards) {\\n dashboardCache = dashboards;\\n deferred.resolve(dashboards);\\n allDashboardsPromiseById = null;\\n }).catch(function(error) {\\n eventBus.publish('processFailed', i18nFilter('queryDashboardsError'));\\n deferred.reject(error);\\n });\\n }\\n\\n var promise = deferred.promise;\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var leave = function(dashboards) {\\n var promises = dashboards.map(function(dashboard, index) {\\n return $http({\\n method: 'POST',\\n url: '/dashboards/' + dashboard._id + '/leave'\\n }).then(function() {\\n dashboard.removeParticipantForEntity(user);\\n removeFromCache(dashboard);\\n return dashboard;\\n }).catch(function() {\\n return $q.reject(dashboard);\\n });\\n });\\n\\n var masterPromise = $q.allSettled(promises).then(function(resolutions) {\\n var rejectedDashboards = dashboards.filter(function(dashboard, index) {\\n return resolutions[index].state === 'rejected';\\n });\\n\\n if (rejectedDashboards.length) {\\n eventBus.publish('processFailed', i18nFilter('leaveDashboardsError'));\\n return $q.reject(rejectedDashboards);\\n } else {\\n return dashboards;\\n }\\n });\\n\\n eventBus.publish('modalProcessStarted', masterPromise);\\n\\n return masterPromise;\\n };\\n\\n var save = function(dashboard) {\\n var method = dashboard._id ? 'PUT' : 'POST';\\n var promise = $http({\\n method: method,\\n url: '/dashboards/' + dashboard._id,\\n data: dashboard,\\n transformRequest: removeDependenciesRequestTransformer\\n }).then(function() {\\n if (!dashboard.isEntityAParticipant(user)) {\\n removeFromCache(dashboard);\\n }\\n return dashboard;\\n }).catch(function() {\\n eventBus.publish('processFailed', i18nFilter('saveDashboardError'));\\n return $q.reject(dashboard);\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var destroy = function(dashboards) {\\n var promises = dashboards.map(function(dashboard) {\\n return $http({\\n method: 'DELETE',\\n url: '/dashboards/' + dashboard._id\\n }).then(function() {\\n removeFromCache(dashboard);\\n return dashboard;\\n }).catch(function() {\\n return $q.reject(dashboard);\\n });\\n });\\n\\n var masterPromise = $q.allSettled(promises).then(function(resolutions) {\\n var rejectedDashboards = dashboards.filter(function(dashboard, index) {\\n return resolutions[index].state === 'rejected';\\n });\\n\\n if (rejectedDashboards.length) {\\n eventBus.publish('processFailed', i18nFilter('deleteDashboardsError'));\\n return $q.reject(rejectedDashboards);\\n } else {\\n return dashboards;\\n }\\n });\\n\\n eventBus.publish('modalProcessStarted', masterPromise);\\n\\n return masterPromise;\\n };\\n\\n var duplicate = function(dashboard) {\\n var promise = $http({\\n method: 'POST',\\n url: '/dashboards/' + dashboard._id + '/duplicate',\\n data: dashboard,\\n transformRequest: removeDependenciesRequestTransformer\\n }).then(function(response) {\\n var newDashboard = response.data;\\n addObjectMethods(newDashboard);\\n return newDashboard;\\n }).catch(function(error) {\\n eventBus.publish('processFailed', i18nFilter('duplicateDashboardError'));\\n return $q.reject(error);\\n });\\n\\n promise = joinDependencies(promise).then(function(dashboard) {\\n dashboardCache.push(dashboard);\\n return dashboard;\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var addObjectMethods = function(dashboard) {\\n return angular.extend(dashboard, dashboardMixin);\\n };\\n\\n return {\\n save: save,\\n get: get,\\n query: query,\\n destroy: destroy,\\n leave: leave,\\n duplicate: duplicate\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/dashboard-service.js\\n ** module id = 15\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.tagService', [\\n require('./sequence').name\\n ])\\n .factory('tagService', function($http, $q, Sequence, eventBus, i18nFilter) {\\n var allTagsCache,\\n queryPromise,\\n sequence = new Sequence();\\n\\n var removeFromCache = function(tag) {\\n var i = allTagsCache.length;\\n while (i--) {\\n if (allTagsCache[i]._id === tag._id) {\\n allTagsCache.splice(i, 1);\\n // Continue looping in case the tag is there more than once. (shouldn't happen)\\n }\\n }\\n };\\n\\n var query = function() {\\n if (!queryPromise) {\\n var deferred = $q.defer();\\n queryPromise = deferred.promise;\\n\\n if (allTagsCache) {\\n deferred.resolve(allTagsCache);\\n } else {\\n $http({\\n method: 'GET',\\n url: '/tags'\\n }).then(function(response) {\\n allTagsCache = response.data;\\n deferred.resolve(allTagsCache);\\n }).catch(function(error) {\\n eventBus.publish('processFailed', i18nFilter('queryTagsError'));\\n deferred.reject(error);\\n });\\n }\\n }\\n\\n return queryPromise;\\n };\\n\\n var save = function(tag) {\\n sequence.enqueue(function() {\\n var promise;\\n\\n if (tag._id) {\\n promise = $http({\\n method: 'PUT',\\n url: '/tags/' + tag._id,\\n data: tag\\n });\\n } else {\\n promise = $http({\\n method: 'POST',\\n url: '/tags',\\n data: tag\\n }).then(function(response) {\\n tag._id = response.data._id;\\n return tag;\\n });\\n }\\n\\n promise.catch(function(error) {\\n eventBus.publish('processFailed', i18nFilter('saveTagError'));\\n $q.reject(error);\\n });\\n\\n return promise;\\n });\\n };\\n\\n var destroy = function(tag) {\\n sequence.enqueue(function() {\\n return $http({\\n method: 'DELETE',\\n url: '/tags/' + tag._id\\n }).then(function(response) {\\n removeFromCache(tag);\\n return response;\\n }).catch(function(error) {\\n eventBus.publish('processFailed', i18nFilter('deleteTagError'));\\n $q.reject(error);\\n });\\n });\\n };\\n\\n return {\\n query: query,\\n save: save,\\n destroy: destroy\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/tag-service.js\\n ** module id = 16\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.tagEnum', [])\\n .constant('tagEnum', {\\n FAVORITE: 'totem.favorite'\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/tag-enum.js\\n ** module id = 17\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.selectionTable', [])\\n .directive('selectionTable', function() {\\n return {\\n scope: {\\n rowModels: '=',\\n selectedRowModels: '=',\\n\\n /**\\n * When a row is selected, the model to add to the selectedRowModels array will come from the scope of the row.\\n * The scope of the row is typically created by ng-repeat. When using ng-repeat=\\\"dashboard in dashboards\\\",\\n * the row's scope will have a dashboard attribute with the dashboard model. In this case, selectionModelMap\\n * should be set to \\\"dashboard\\\" so it can be retrieved from the row's scope when the row is selected.\\n */\\n selectionModelMap: '@'\\n },\\n link: function(scope, element, attrs) {\\n var allCheckboxSelector = attrs.selectAllSelector || 'th:first-child input';\\n var itemCheckboxSelector = attrs.selectItemSelector || 'td:first-child input';\\n\\n var updateSelectionModel = function() {\\n var selectedCheckboxes = element.find(itemCheckboxSelector + ':checked');\\n scope.selectedRowModels = selectedCheckboxes.toArray().map(function(selectedCheckbox) {\\n return $(selectedCheckbox).scope().$eval(scope.selectionModelMap);\\n });\\n };\\n\\n var updateSelectAllCheckbox = function() {\\n var itemCheckboxes = element.find(itemCheckboxSelector);\\n var allItemsSelected = itemCheckboxes.length && itemCheckboxes.not(':checked').length === 0;\\n $(allCheckboxSelector).prop('checked', allItemsSelected);\\n };\\n\\n element.on('change', allCheckboxSelector, function(event) {\\n var selected = $(event.currentTarget).prop('checked');\\n element.find(itemCheckboxSelector).prop('checked', selected);\\n\\n if (scope.selectedRowModels && scope.selectionModelMap) {\\n scope.$apply(updateSelectionModel);\\n }\\n });\\n\\n element.on('change', itemCheckboxSelector, function() {\\n updateSelectAllCheckbox();\\n\\n if (scope.selectedRowModels && scope.selectionModelMap) {\\n scope.$apply(updateSelectionModel);\\n }\\n });\\n\\n scope.$watchCollection('rowModels', function() {\\n updateSelectAllCheckbox();\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/selection-table.js\\n ** module id = 18\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.sortHeader', [])\\n .directive('sortHeader', function() {\\n return {\\n link: function(scope, element, attrs) {\\n element.addClass('totem-SortHeaderCell');\\n }\\n };\\n })\\n .directive('sortHeaderIcon', function() {\\n return {\\n scope: {\\n sortActive: '=',\\n sortAscending: '='\\n },\\n link: function(scope, element, attrs) {\\n element.addClass('totem-SortHeaderCell-icon');\\n\\n scope.$watch('sortActive', function(sortActive) {\\n element.toggle(sortActive);\\n });\\n\\n scope.$watch('sortAscending', function(sortAscending) {\\n element\\n .toggleClass('coral-Icon--arrowUp', sortAscending)\\n .toggleClass('coral-Icon--arrowDown', !sortAscending);\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/sort-header.js\\n ** module id = 19\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.adHocService', [\\n require('./participable-mixin').name\\n ])\\n .factory('adHocService', function($http, $q, $location, ims, participableMixin, eventBus, i18nFilter, externalServices) {\\n var collectionCache = null;\\n var originalCollections = null;\\n var currentCollection = null;\\n var rsAdHocBaseUrl = externalServices.rs.host + 'adhoc/';\\n var orgId = ims.activeOrg + '@AdobeOrg';\\n\\n var get = function(id) {\\n return getAll().then(function(collections) {\\n for (var i = 0; i < collections.length; i++) {\\n var collection = collections[i];\\n if (collection.id === id) {\\n return collection;\\n }\\n }\\n return null;\\n });\\n };\\n\\n var getAll = function(forceRefresh) {\\n forceRefresh = forceRefresh || false;\\n if(collectionCache && !forceRefresh) {\\n var deferred = $q.defer();\\n deferred.resolve(collectionCache);\\n return deferred.promise;\\n }\\n\\n var promise = $http({\\n method: 'GET',\\n url: rsAdHocBaseUrl + '?depth=3&orgId='+orgId,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n // SUCCESS\\n var collectionsById = response.data;\\n\\n var collections = [];\\n for (var id in collectionsById) {\\n if (collectionsById.hasOwnProperty(id)) {\\n var collection = collectionsById[id];\\n collection.id = id;\\n angular.extend(collection, participableMixin);\\n\\n // need to add the uploadId to the upload object\\n if(collection.uploads) {\\n for(var uploadId in collection.uploads) {\\n if(collection.uploads.hasOwnProperty(uploadId)) {\\n collection.uploads[uploadId].id = uploadId;\\n }\\n }\\n }\\n\\n // make the participants array match the expected format for\\n // participable\\n var newParticipants = [];\\n for(var participantId in collection.participants) {\\n if(collection.participants.hasOwnProperty(participantId)) {\\n // @todo: this info needs to be pulled from IMS\\n // Reporting Services does not have this info\\n newParticipants.push({\\n _id:participantId,\\n entity:{\\n _id:participantId,\\n displayName:'Some Name',\\n email:'[email protected]',\\n firstName:'Some',\\n lastName:'Name',\\n type:'user'\\n },\\n isOwner:collection.participants[participantId].owner\\n });\\n }\\n }\\n collection.participants = newParticipants;\\n\\n collections.push(collection);\\n }\\n }\\n\\n collectionCache = collections;\\n originalCollections = angular.copy(collectionCache);\\n\\n return collectionCache;\\n }, function(reason) {\\n eventBus.publish('processFailed',i18nFilter('adhocGenericCollectionError'));\\n return $q.reject(reason);\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n // metaData is an object that conforms to the inputs needed by adhoc/:collectionId PUT\\n var saveMetaData = function(metaData, collectionId) {\\n var promise = $http({\\n method: 'PUT',\\n url: rsAdHocBaseUrl + collectionId + '?orgId='+orgId,\\n data: metaData,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).catch(function(reason) {\\n eventBus.publish('processFailed',i18nFilter('adhocCollectionSaveError'));\\n return $q.reject(reason);\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var preRunFromPastebin = function(pastebinId, sampleSize, collectionId) {\\n sampleSize = sampleSize || 20;\\n\\n var createData = {\\n file: $location.protocol() + '://' + $location.host() + ($location.port() ? ':' + $location.port() : '') + '/pastebin/' + pastebinId\\n };\\n\\n var url = rsAdHocBaseUrl + (collectionId ? collectionId : '') + '?getDirectives=1&getSample='+sampleSize+'&noCommit=1&orgId='+orgId;\\n var promise = $http({\\n method: collectionId ? 'PUT' : 'POST',\\n url: url,\\n data: createData,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n return response.data;\\n }, function(reason) {\\n eventBus.publish('processFailed', i18nFilter('adhocGenericCollectionError'));\\n return $q.reject(reason);\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var createFromPastebin = function(pastebinId, directives, schema, collectionId) {\\n var createData = {\\n file: $location.protocol() + '://' + $location.host() + ($location.port() ? ':' + $location.port() : '') + '/pastebin/' + pastebinId,\\n schema: schema,\\n directives: directives,\\n name: currentCollection.name,\\n description: currentCollection.description,\\n uploadFile: currentCollection.fileName\\n };\\n var url = rsAdHocBaseUrl + (collectionId ? collectionId : '') + '?orgId='+orgId;\\n\\n var promise = $http({\\n method: collectionId ? 'PUT' : 'POST',\\n url: url,\\n data: createData,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n return response.data;\\n }, function(reason) {\\n eventBus.publish('processFailed', i18nFilter('adhocCollectionCreateError'));\\n return $q.reject(reason);\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var setCurrentCollection = function (collection) {\\n if(!collection) {\\n createNewCurrentCollection();\\n } else {\\n currentCollection = collection;\\n }\\n };\\n\\n var getCurrentCollection = function() {\\n if(!currentCollection) {\\n createNewCurrentCollection();\\n }\\n return currentCollection;\\n };\\n\\n var createNewCurrentCollection = function () {\\n currentCollection = {};\\n angular.extend(currentCollection, participableMixin);\\n };\\n\\n var resetCurrentCollection = function() {\\n currentCollection = null;\\n };\\n\\n var deleteUpload = function(collection, upload) {\\n if(!collection || !upload) {\\n return;\\n }\\n var url = rsAdHocBaseUrl + collection.id + '/uploads/' + upload.id + '?orgId='+orgId;\\n var promise = $http({\\n method: 'DELETE',\\n url: url,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n // decrement the rowCount on the collection\\n collection.rowCount -= upload.rowCount;\\n if(collection.uploads && collection.uploads[upload.id]) {\\n delete collection.uploads[upload.id];\\n }\\n return response.data;\\n }, function(reason) {\\n eventBus.publish('processFailed', i18nFilter('adhocUploadDeleteError'));\\n return $q.reject(reason);\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var deleteCollection = function(collection) {\\n if(!collection) {\\n eventBus.publish('processFailed', i18nFilter('adhocGenericCollectionError'));\\n return;\\n }\\n\\n var url = rsAdHocBaseUrl + collection.id + '?orgId='+orgId;\\n\\n var promise = $http({\\n method: 'DELETE',\\n url: url,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n var ind = collectionCache.indexOf(collection);\\n if(ind > -1) {\\n collectionCache.splice(ind,1);\\n }\\n return response;\\n }, function(reason) {\\n eventBus.publish('processFailed', i18nFilter('adhocCollectionDeleteError'));\\n return $q.reject(reason);\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var savePermissions = function(collection) {\\n var oldParticipants = null;\\n originalCollections.forEach(function(col) {\\n if(col.id == collection.id) {\\n oldParticipants = col.participants;\\n }\\n });\\n\\n if(!oldParticipants) {\\n eventBus.publish('processFailed', i18nFilter('genericPermissionsChangeError'));\\n return;\\n }\\n var newParticipants = [];\\n var removedParticipants = [];\\n var changedParticipants = [];\\n var participantId = null;\\n var oldParticipantId = null;\\n var participantFound = false;\\n\\n // find removed and altered participants\\n // participants in the old array that are not in the new array have been removed\\n // participants in the old array that are different from the ones in the new array have been altered\\n for(oldParticipantId in oldParticipants) {\\n if(oldParticipants.hasOwnProperty(oldParticipantId)) {\\n participantFound = false;\\n for(participantId in collection.participants) {\\n if(collection.participants.hasOwnProperty(participantId)) {\\n if(collection.participants[participantId].entity._id == oldParticipants[oldParticipantId].entity._id) {\\n participantFound = true;\\n if(collection.participants[participantId].isOwner != oldParticipants[oldParticipantId].isOwner) {\\n oldParticipants[oldParticipantId].isOwner = collection.participants[participantId];\\n changedParticipants.push(collection.participants[participantId]);\\n }\\n }\\n }\\n }\\n if(!participantFound) {\\n removedParticipants.push(oldParticipants[oldParticipantId]);\\n }\\n }\\n }\\n\\n // find new participants\\n // participants in the new array that are not in the old array are new\\n for(participantId in collection.participants) {\\n if(collection.participants.hasOwnProperty(participantId)) {\\n participantFound = false;\\n for(oldParticipantId in oldParticipants) {\\n if(oldParticipants.hasOwnProperty(oldParticipantId)) {\\n if(collection.participants[participantId].entity._id && collection.participants[participantId].entity._id == oldParticipants[oldParticipantId].entity._id) {\\n participantFound = true;\\n }\\n }\\n }\\n if(!participantFound) {\\n newParticipants.push(collection.participants[participantId]);\\n }\\n }\\n }\\n // send alerts if any of these operations fail\\n // for creating:POST, for editing:PUT and for removing:DELETE\\n // url is rsAdHocBaseUrl + collection.id + '/participants'\\n var promises = [];\\n newParticipants.forEach(function(participant) {\\n promises.push(addParticipant(collection, participant));\\n });\\n\\n removedParticipants.forEach(function(participant) {\\n promises.push(removeParticipant(collection, participant));\\n });\\n\\n changedParticipants.forEach(function(participant) {\\n promises.push(editParticipant(collection,participant));\\n });\\n\\n $q.all(promises).catch(function(res) {\\n eventBus.publish('processFailed', i18nFilter('genericPermissionsChangeError'));\\n });\\n };\\n\\n var addParticipant = function(collection, participant)\\n {\\n var url = rsAdHocBaseUrl + collection.id + '/participants?orgId='+orgId;\\n var createData = {\\n userId:participant.entity._id,\\n owner:participant.isOwner\\n };\\n var promise = $http({\\n method: 'POST',\\n url: url,\\n data: createData,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n return response.data;\\n }, function(reason) {\\n eventBus.publish('processFailed', i18nFilter('adhocPermissionError'));\\n return $q.reject(reason);\\n });\\n \\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var removeParticipant = function(collection, participant)\\n {\\n var url = rsAdHocBaseUrl + collection.id + '/participants/' + participant.entity._id + '?orgId='+orgId;\\n var promise = $http({\\n method: 'DELETE',\\n url: url,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n return response.data;\\n }, function(reason) {\\n eventBus.publish('processFailed', i18nFilter('adhocPermissionError'));\\n return $q.reject(reason);\\n });\\n \\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n var editParticipant = function(collection, participant)\\n {\\n var url = rsAdHocBaseUrl + collection.id + '/participants/' + participant.entity._id + '?orgId='+orgId;\\n var editData = {\\n owner:participant.isOwner\\n };\\n var promise = $http({\\n method: 'PUT',\\n url: url,\\n data:editData,\\n headers: {\\n Authorization: 'Bearer ' + ims.accessToken\\n }\\n }).then(function(response) {\\n return response.data;\\n }, function(reason) {\\n eventBus.publish('processFailed', i18nFilter('adhocPermissionError'));\\n return $q.reject(reason);\\n });\\n\\n eventBus.publish('modalProcessStarted', promise);\\n\\n return promise;\\n };\\n\\n return {\\n get : get,\\n getAll : getAll,\\n saveMetaData : saveMetaData,\\n createFromPastebin: createFromPastebin,\\n preRunFromPastebin: preRunFromPastebin,\\n getCurrentCollection: getCurrentCollection,\\n setCurrentCollection: setCurrentCollection,\\n resetCurrentCollection: resetCurrentCollection,\\n deleteUpload:deleteUpload,\\n deleteCollection:deleteCollection,\\n savePermissions:savePermissions\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/ad-hoc-service.js\\n ** module id = 20\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.nameEditor', [\\n require('../../common/directives/steal-focus').name\\n ])\\n .directive('nameEditor', function() {\\n return {\\n template: require('./name-editor.tpl.html'),\\n restrict: 'E',\\n scope: {\\n name: '='\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/name-editor.js\\n ** module id = 21\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.dashboardWorkspaceService', [\\n require('./uuid').name\\n])\\n.factory('dashboardWorkspaceService', function($rootScope, instrumentEventBus) {\\n var service = {\\n /**\\n * The dashboard model as it was the last time it was saved.\\n */\\n pristineDashboard: null,\\n /**\\n * The working dashboard model which may contain unsaved changes.\\n */\\n dashboard: null,\\n /**\\n * The active media definition for the workspace.\\n */\\n mediaDefinition: null,\\n /**\\n * The active page for the workspace.\\n */\\n page: null,\\n /**\\n * The active media layouts for the workspace.\\n */\\n mediaLayouts: null,\\n /**\\n * The active instruments for the workspace.\\n */\\n instruments: null,\\n\\n revertChanges: function() {\\n this.dashboard = angular.copy(this.pristineDashboard);\\n },\\n\\n updatePristineCopy: function() {\\n // Copy to pristine dashboard instead of replace since other pieces of the app might already be referencing\\n // the pristine dashboard instance and we don't want to have to manage those references.\\n angular.copy(this.dashboard, this.pristineDashboard);\\n }\\n };\\n\\n /**\\n * Finds media layouts and instruments that match the current dashboard, media definition, and page and sets\\n * them on the service.\\n */\\n var updateMediaLayoutsAndInstruments = function() {\\n if (service.mediaDefinition &&\\n service.dashboard &&\\n service.dashboard.mediaLayouts &&\\n service.dashboard.instruments) {\\n service.mediaLayouts = service.dashboard.mediaLayouts.filter(function(mediaLayout) {\\n return mediaLayout.pageId == service.page._id &&\\n mediaLayout.mediaDefinitionId == service.mediaDefinition._id;\\n });\\n service.instruments = service.dashboard.instruments.filter(function(instrument) {\\n // Only include an instrument if there's an associated media layout we're actively working with.\\n for (var i = 0; i < service.mediaLayouts.length; i++) {\\n var mediaLayout = service.mediaLayouts[i];\\n if (instrument._id == mediaLayout.instrumentId) {\\n return true;\\n }\\n }\\n return false;\\n });\\n }\\n };\\n\\n $rootScope.$watchGroup([\\n function() { return service.dashboard; },\\n function() { return service.page; },\\n function() { return service.mediaDefinition; }\\n ], updateMediaLayoutsAndInstruments);\\n\\n $rootScope.$watchCollection(function() {\\n return service.dashboard ? service.dashboard.instruments : null;\\n }, updateMediaLayoutsAndInstruments);\\n\\n $rootScope.$watchCollection(function() {\\n return service.dashboard ? service.dashboard.mediaLayouts : null;\\n }, updateMediaLayoutsAndInstruments);\\n\\n\\n var oldMediaDefinition;\\n var oldPage;\\n var oldDashboard;\\n $rootScope.$watch(function() {\\n // If the media definition is changing but not the dashboard nor page, then we need to tell the instruments\\n // that they have resized so that they will re-render (their instruments have, indeed, changed size).\\n // If we're changing pages or dashboards then we're dealing with new instruments therefore they're rendering from\\n // scratch and we don't need to notify of any resizing. While we could publish this event from all the many places\\n // where we change the media definition, this keeps the logic in a single place and ensures that it happens\\n // when it needs to.\\n if (service.mediaDefinition !== oldMediaDefinition &&\\n service.dashboard === oldDashboard &&\\n service.page === oldPage) {\\n instrumentEventBus.publish({\\n topic: 'resized'\\n });\\n }\\n\\n //console.log(oldMediaDefinition._id, service.mediaDefinition._id)\\n oldMediaDefinition = service.mediaDefinition;\\n oldPage = service.page;\\n oldDashboard = service.dashboard;\\n });\\n\\n return service;\\n});\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/dashboard-workspace.js\\n ** module id = 22\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.alert', [])\\n .directive('alert', function(eventBus) {\\n return {\\n restrict: 'EA',\\n template: require('./alert.tpl.html'),\\n scope: true,\\n link: function(scope, element, attr) {\\n scope.visible = false;\\n scope.type = '';\\n scope.content = '';\\n\\n eventBus.subscribe('processFailed', function(content) {\\n scope.type = 'error';\\n scope.content = content;\\n scope.visible = true;\\n });\\n\\n element.find('.coral-Alert-closeButton').on('click', function() {\\n scope.$apply(function() {\\n scope.visible = false;\\n });\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/alert.js\\n ** module id = 23\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.modalProgressIndicator', [])\\n .directive('modalProgressIndicator', function(eventBus) {\\n return {\\n restrict: 'EA',\\n template: require('./modal-progress-indicator.tpl.html'),\\n scope: true,\\n link: function(scope, element, attr) {\\n scope.visible = false;\\n\\n var promises = [];\\n\\n eventBus.subscribe('modalProcessStarted', function(promise) {\\n promises.push(promise);\\n promise.finally(function() {\\n promises.splice(promises.indexOf(promise), 1);\\n if (!promises.length) {\\n scope.visible = false;\\n }\\n });\\n scope.visible = true;\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/modal-progress-indicator.js\\n ** module id = 24\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.manageToolbar', [\\n require('../../common/directives/share').name,\\n require('../../common/services/dashboard-service').name\\n ])\\n .directive('manageToolbar', function(user, $state, $q, dashboardService, i18nFilter) {\\n return {\\n restrict: 'EA',\\n scope: {\\n dashboards: '=',\\n selectedDashboards: '='\\n },\\n template: require('./manage-toolbar.tpl.html'),\\n link: function(scope, element, attrs) {\\n var removeDashboardFromSelection = function(dashboard) {\\n var index = scope.selectedDashboards.indexOf(dashboard);\\n if (index > -1) {\\n scope.selectedDashboards.splice(index, 1);\\n }\\n };\\n\\n scope.showSearchField = false;\\n scope.leaveModalVisible = false;\\n scope.deleteModalVisible = false;\\n scope.deleteModalDescription = '';\\n scope.shareModalVisible = false;\\n\\n scope.viewDashboard = function() {\\n $state.go('dashboard.view', {\\n dashboardId: scope.selectedDashboards[0]._id\\n });\\n };\\n\\n scope.duplicateDashboard = function() {\\n dashboardService.duplicate(scope.selectedDashboards[0]);\\n };\\n\\n scope.leaveDashboard = function() {\\n scope.leaveModalVisible = true;\\n };\\n\\n scope.confirmLeaveDashboard = function() {\\n // Copy selection in case scope.selectedDashboards is modified by the time a response is received.\\n var dashboardsToLeave = scope.selectedDashboards.slice();\\n\\n dashboardService.leave(dashboardsToLeave).then(function() {\\n dashboardsToLeave.forEach(removeDashboardFromSelection);\\n }, function(failedDashboards) {\\n dashboardsToLeave.forEach(function(dashboard) {\\n if (failedDashboards.indexOf(dashboard) === -1) {\\n removeDashboardFromSelection(dashboard);\\n }\\n });\\n });\\n };\\n\\n scope.editDashboard = function() {\\n $state.go('dashboard.edit', {\\n dashboardId: scope.selectedDashboards[0]._id\\n });\\n };\\n\\n scope.deleteDashboard = function() {\\n // We need to find unique entity IDs here instead of participant IDs. Participant objects may not have an ID.\\n // This is the case when a user/group was just added as a participant to the dashboard since the frontend does\\n // not create an ID for new participant objects. Also, it's probably not good to assume that participant IDs\\n // and entity IDs are 1:1. We're really trying to find unique entities here anyway.\\n var affectedUserIds = [];\\n var affectedGroupIds = [];\\n\\n var addAffectedEntity = function(entity) {\\n var ids;\\n switch (entity.type) {\\n case 'group':\\n ids = affectedGroupIds;\\n break;\\n default:\\n ids = affectedUserIds;\\n }\\n\\n if (ids.indexOf(entity._id) === -1) {\\n ids.push(entity._id);\\n }\\n };\\n\\n scope.selectedDashboards.forEach(function(dashboard) {\\n dashboard.participants.forEach(function(participant) {\\n addAffectedEntity(participant.entity);\\n });\\n });\\n\\n var i18nKey = affectedUserIds.length && affectedGroupIds.length ?\\n 'deleteDashboardUsersAndGroupsDescription' :\\n 'deleteDashboardUsersOrGroupsDescription';\\n\\n scope.deleteModalDescription = i18nFilter(i18nKey, {\\n NUM_DASHBOARDS: scope.selectedDashboards.length,\\n NUM_USERS_AFFECTED: affectedUserIds.length,\\n NUM_GROUPS_AFFECTED: affectedGroupIds.length\\n });\\n\\n scope.deleteModalVisible = true;\\n };\\n\\n scope.confirmDeleteDashboard = function() {\\n // Copy selection in case scope.selectedDashboards is modified by the time a response is received.\\n var dashboardsToDelete = scope.selectedDashboards.slice();\\n\\n dashboardService.destroy(dashboardsToDelete).then(function(dashboards) {\\n dashboardsToDelete.forEach(removeDashboardFromSelection);\\n }, function(failedDashboards) {\\n dashboardsToDelete.forEach(function(dashboard) {\\n if (failedDashboards.indexOf(dashboard) === -1) {\\n removeDashboardFromSelection(dashboard);\\n }\\n });\\n });\\n };\\n\\n scope.isSearchable = function() {\\n return scope.selectedDashboards.length === 0;\\n };\\n\\n scope.isShareable = function() {\\n if (scope.selectedDashboards.length !== 1) {\\n return false;\\n }\\n\\n return scope.selectedDashboards[0].isEntityAnOwner(user);\\n };\\n\\n scope.isViewable = function() {\\n return scope.selectedDashboards.length === 1;\\n };\\n\\n scope.isDuplicable = function() {\\n return scope.selectedDashboards.length === 1;\\n };\\n\\n scope.isDownloadable = function() {\\n return scope.selectedDashboards.length === 1;\\n };\\n\\n scope.isLeavable = function() {\\n if (scope.selectedDashboards.length === 0) {\\n return false;\\n }\\n for (var i = 0; i < scope.selectedDashboards.length; i++) {\\n var dashboard = scope.selectedDashboards[i];\\n // If the user is the only owner of the dashboard\\n if (dashboard.isEntitySoleOwner(user)) {\\n return false;\\n }\\n }\\n\\n return true;\\n };\\n\\n scope.isLeaveViewable = function() {\\n if (scope.isLeavable()) {\\n return true;\\n }\\n\\n for (var i = 0; i < scope.selectedDashboards.length; i++) {\\n if (!scope.selectedDashboards[i].isEntityAnOwner(user)) {\\n return true;\\n }\\n }\\n return false;\\n };\\n\\n scope.isEditable = function() {\\n return scope.selectedDashboards.length === 1 && scope.selectedDashboards[0].isEntityAnOwner(user);\\n };\\n\\n scope.isDeletable = function() {\\n var owningOnly = true;\\n for (var i = 0; i < scope.selectedDashboards.length; i++) {\\n if (!scope.selectedDashboards[i].isEntityAnOwner(user)) {\\n owningOnly = false;\\n }\\n }\\n return owningOnly;\\n };\\n\\n scope.isDeleteViewable = function() {\\n for (var i = 0; i < scope.selectedDashboards.length; i++) {\\n if (scope.selectedDashboards[i].isEntityAnOwner(user)) {\\n return true;\\n }\\n }\\n return false;\\n };\\n\\n scope.share = function() {\\n scope.shareModalVisible = true;\\n };\\n\\n scope.saveDashboard = function(dashboard) {\\n dashboardService.save(dashboard);\\n };\\n\\n// Debugging.\\n// scope.$watch('dashboards', function() {\\n// if (scope.dashboards && scope.dashboards.length > 0) {\\n// scope.selectedDashboards = [scope.dashboards[0]];\\n// scope.share();\\n// }\\n// });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/manage/directives/manage-toolbar.js\\n ** module id = 25\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.dashboardSearch', [])\\n .directive('dashboardSearch', function() {\\n return {\\n restrict: 'EA',\\n scope: {\\n dashboards: '='\\n },\\n template: require('./dashboard-search.tpl.html'),\\n link: function(scope, element, attrs) {\\n element.find('.js-coral-Autocomplete-textfield').focus();\\n element.on('change:value', function(event, payload) {\\n // TODO: Somehow change the dashboard filter.\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/manage/directives/dashboard-search.js\\n ** module id = 26\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<manage-toolbar dashboards=\\\\\\\"dashboards\\\\\\\" selected-dashboards=\\\\\\\"selectedDashboards\\\\\\\"></manage-toolbar>\\\\n<div class=\\\\\\\"u-totem-contentUnderActionBar\\\\\\\">\\\\n <table class=\\\\\\\"coral-Table totem-ManageTable\\\\\\\" selection-table row-models=\\\\\\\"dashboards\\\\\\\" selected-row-models=\\\\\\\"selectedDashboards\\\\\\\" selection-model-map=\\\\\\\"dashboard\\\\\\\">\\\\n <thead>\\\\n <tr class=\\\\\\\"coral-Table-row\\\\\\\">\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ManageTable-headerCell totem-ManageTable-headerCell--select\\\\\\\">\\\\n <label class=\\\\\\\"coral-Checkbox\\\\\\\">\\\\n <input class=\\\\\\\"coral-Checkbox-input\\\\\\\" type=\\\\\\\"checkbox\\\\\\\" select-all-checkbox>\\\\n <span class=\\\\\\\"coral-Checkbox-checkmark\\\\\\\"></span>\\\\n </label>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ManageTable-headerCell totem-ManageTable-headerCell--favorite\\\\\\\"></th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ManageTable-headerCell totem-ManageTable-headerCell--name\\\\\\\" ng-click=\\\\\\\"setSort('name')\\\\\\\" sort-header>\\\\n {{ 'name' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === 'name'\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ManageTable-headerCell totem-ManageTable-headerCell--editors\\\\\\\" ng-click=\\\\\\\"setSort(getFirstOwnerFullName)\\\\\\\" sort-header>\\\\n {{ 'owners' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === getFirstOwnerFullName\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ManageTable-headerCell totem-ManageTable-headerCell--viewers\\\\\\\" ng-click=\\\\\\\"setSort('participants.length')\\\\\\\" sort-header>\\\\n {{ 'viewers' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === 'participants.length'\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ManageTable-headerCell totem-ManageTable-headerCell--views\\\\\\\" ng-click=\\\\\\\"setSort('views')\\\\\\\" sort-header>\\\\n {{ 'views' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === 'views'\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ManageTable-headerCell totem-ManageTable-headerCell--scheduled\\\\\\\">{{ 'scheduled' | i18n }}</th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-ManageTable-headerCell totem-ManageTable-headerCell--updated\\\\\\\" ng-click=\\\\\\\"setSort('modified')\\\\\\\" sort-header>\\\\n {{ 'updated' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === 'modified'\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n </tr>\\\\n </thead>\\\\n <tbody>\\\\n <tr class=\\\\\\\"coral-Table-row\\\\\\\" ng-repeat=\\\\\\\"dashboard in dashboards | orderBy:sortPredicate:sortReverse\\\\\\\">\\\\n <td class=\\\\\\\"coral-Table-cell totem-ManageTable-cell\\\\\\\">\\\\n <label class=\\\\\\\"coral-Checkbox\\\\\\\">\\\\n <input class=\\\\\\\"coral-Checkbox-input\\\\\\\" type=\\\\\\\"checkbox\\\\\\\" select-item-checkbox>\\\\n <span class=\\\\\\\"coral-Checkbox-checkmark\\\\\\\"></span>\\\\n </label>\\\\n </td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ManageTable-cell totem-ManageTable-cell--favorite\\\\\\\"><button class=\\\\\\\"coral-MinimalButton totem-FavoriteButton\\\\\\\" ng-click=\\\\\\\"toggleFavorite(dashboard)\\\\\\\"><i class=\\\\\\\"coral-Icon totem-FavoriteIcon\\\\\\\" ng-class=\\\\\\\"{'coral-Icon--star totem-FavoriteIcon--selected': isDashboardFavorited(dashboard), 'coral-Icon--starStroke': !isDashboardFavorited(dashboard)}\\\\\\\"></i></button></td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ManageTable-cell\\\\\\\"><a class=\\\\\\\"coral-Link\\\\\\\" ui-sref=\\\\\\\"dashboard.view({dashboardId: dashboard._id})\\\\\\\">{{ dashboard.name }}</a></td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ManageTable-cell\\\\\\\">{{ getPluralizedOwners(getOwners(dashboard)) }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ManageTable-cell\\\\\\\"><i class=\\\\\\\"coral-Icon coral-Icon--user coral-Icon--sizeXS totem-ManageTable-labelIcon\\\\\\\"></i>{{ dashboard.participants.length | number }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ManageTable-cell\\\\\\\"><i class=\\\\\\\"coral-Icon coral-Icon--viewOn coral-Icon--sizeXS totem-ManageTable-labelIcon\\\\\\\"></i>{{ '18283' | number }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ManageTable-cell\\\\\\\"><i class=\\\\\\\"coral-Icon coral-Icon--email coral-Icon--sizeXS totem-ManageTable-labelIcon\\\\\\\"></i>Me + 3</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-ManageTable-cell--updated\\\\\\\">{{ dashboard.modified | date: 'mediumDate' }}</td>\\\\n </tr>\\\\n </tbody>\\\\n </table>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/manage/views/manage.tpl.html\\n ** module id = 27\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<ad-hoc-manage-toolbar collections=\\\\\\\"adHocCollections\\\\\\\" selected-collections=\\\\\\\"selectedAdHocCollections\\\\\\\"></ad-hoc-manage-toolbar>\\\\n<div class=\\\\\\\"u-totem-contentUnderActionBar\\\\\\\">\\\\n <table class=\\\\\\\"coral-Table totem-AdHocTable totem-AdHocTable--collections\\\\\\\" selection-table row-models=\\\\\\\"collections\\\\\\\" selected-row-models=\\\\\\\"selectedAdHocCollections\\\\\\\" selection-model-map=\\\\\\\"collection\\\\\\\">\\\\n <thead>\\\\n <tr class=\\\\\\\"coral-Table-row\\\\\\\">\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--select\\\\\\\">\\\\n <label class=\\\\\\\"coral-Checkbox\\\\\\\">\\\\n <input class=\\\\\\\"coral-Checkbox-input\\\\\\\" type=\\\\\\\"checkbox\\\\\\\" select-all-checkbox>\\\\n <span class=\\\\\\\"coral-Checkbox-checkmark\\\\\\\"></span>\\\\n </label>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell\\\\\\\" ng-click=\\\\\\\"setSort('name')\\\\\\\" sort-header>\\\\n {{ 'name' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === 'name'\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--createdBy\\\\\\\" sort-header>\\\\n {{ 'createdby' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--dashboardCount\\\\\\\" sort-header>\\\\n {{ 'dashboards' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--records\\\\\\\" ng-click=\\\\\\\"setSort('rowCount')\\\\\\\" sort-header>\\\\n {{ 'records' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === 'rowCount'\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--capacity\\\\\\\" ng-click=\\\\\\\"setSort(getCapacity)\\\\\\\" sort-header>\\\\n {{ 'capacity' | i18n }}\\\\n <i class=\\\\\\\"coral-Icon\\\\\\\" sort-header-icon sort-active=\\\\\\\"sortPredicate === getCapacity\\\\\\\" sort-ascending=\\\\\\\"!sortReverse\\\\\\\"></i>\\\\n </th>\\\\n </tr>\\\\n </thead>\\\\n <tbody>\\\\n <tr class=\\\\\\\"coral-Table-row\\\\\\\" ng-repeat=\\\\\\\"collection in adHocCollections | orderBy:sortPredicate:sortReverse\\\\\\\">\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell\\\\\\\">\\\\n <label class=\\\\\\\"coral-Checkbox\\\\\\\">\\\\n <input class=\\\\\\\"coral-Checkbox-input\\\\\\\" type=\\\\\\\"checkbox\\\\\\\" select-item-checkbox>\\\\n <span class=\\\\\\\"coral-Checkbox-checkmark\\\\\\\"></span>\\\\n </label>\\\\n </td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell\\\\\\\"><a class=\\\\\\\"coral-Link\\\\\\\" ui-sref=\\\\\\\"collection({collectionId:collection.id})\\\\\\\">{{ collection.name }}</a><br>{{collection.description}}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell\\\\\\\"><i class=\\\\\\\"coral-Icon totem-ManageTable-labelIcon coral-Icon--user coral-Icon--sizeXS\\\\\\\"></i>{{ 'Travis Funk' }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell\\\\\\\">{{ 1 | number }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell\\\\\\\">{{ collection.rowCount | number }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell--capacity\\\\\\\">\\\\n <ad-hoc-capacity usage=\\\\\\\"{{collection.rowCount}}\\\\\\\" capacity=\\\\\\\"{{collection.maxRows}}\\\\\\\"></ad-hoc-capacity>\\\\n </td>\\\\n </tr>\\\\n </tbody>\\\\n </table>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/views/ad-hoc.tpl.html\\n ** module id = 28\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-EditTitleBar coral--dark\\\\\\\">\\\\n <div class=\\\\\\\"totem-EditTitleBar-title\\\\\\\">\\\\n {{ 'manageCollections' | i18n }}\\\\n </div>\\\\n <div class=\\\\\\\"totem-EditTitleBar-buttons\\\\\\\">\\\\n <button class=\\\\\\\"totem-EditTitleBar-cancelButton coral-Button coral-Button--quiet\\\\\\\" ng-click=\\\\\\\"cancelEditing()\\\\\\\">{{ 'cancel' | i18n }}</button>\\\\n <button class=\\\\\\\"totem-EditTitleBar-saveButton coral-Button coral-Button--primary\\\\\\\" ng-disabled=\\\\\\\"!collection.name || (!collection && !uploadFileName) || saveDisabled\\\\\\\" ng-click=\\\\\\\"saveCollection()\\\\\\\">{{ 'save' | i18n }}</button>\\\\n </div>\\\\n</div>\\\\n<div class=\\\\\\\"u-totem-contentUnderEditTitleBar\\\\\\\">\\\\n <div class=\\\\\\\"totem-ActionBar\\\\\\\" ng-show=\\\\\\\"collection.rowCount > 0\\\\\\\">\\\\n <div class=\\\\\\\"coral-ButtonGroup\\\\\\\">\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--alias\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">Export</span></a>\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\" ng-click=\\\\\\\"forceUploadVisibility = true\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--addCircle\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">Add Data</span></a>\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--delete\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">Delete Data</span></a>\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--tableHistogram\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">View Schema</span></a>\\\\n </div>\\\\n </div>\\\\n <section class=\\\\\\\"totem-Section\\\\\\\">\\\\n <form class=\\\\\\\"coral-Form coral-Form--vertical\\\\\\\" style=\\\\\\\"width:100%\\\\\\\">\\\\n <label class=\\\\\\\"coral-Form-fieldlabel\\\\\\\">\\\\n <span class=\\\\\\\"coral-Heading coral-Heading--4\\\\\\\">{{ 'name' | i18n }}</span>\\\\n <input class=\\\\\\\"coral-Form-field coral-Textfield\\\\\\\" type=\\\\\\\"text\\\\\\\" ng-model=\\\\\\\"collection.name\\\\\\\">\\\\n </label>\\\\n\\\\n <label class=\\\\\\\"coral-Form-fieldlabel\\\\\\\">\\\\n <span class=\\\\\\\"coral-Heading coral-Heading--4\\\\\\\">{{ 'description' | i18n }}</span>\\\\n <input class=\\\\\\\"u-totem-noMargin coral-Form-field coral-Textfield\\\\\\\" type=\\\\\\\"text\\\\\\\" ng-model=\\\\\\\"collection.description\\\\\\\" maxlength=\\\\\\\"255\\\\\\\">\\\\n </label>\\\\n </form>\\\\n </section>\\\\n <section class=\\\\\\\"totem-Section\\\\\\\" ng-show=\\\\\\\"forceUploadVisibility || (collection && !collection.rowCount)\\\\\\\">\\\\n <h4 class=\\\\\\\"coral-Heading coral-Heading--4\\\\\\\">{{ 'dataUpload' | i18n }}</h4>\\\\n <ad-hoc-data-upload save-disabled=\\\\\\\"saveDisabled\\\\\\\" upload-file-name=\\\\\\\"uploadFileName\\\\\\\" collection=\\\\\\\"collection\\\\\\\"></ad-hoc-data-upload>\\\\n </section>\\\\n <section class=\\\\\\\"totem-Section\\\\\\\" ng-show=\\\\\\\"collection.rowCount > 0\\\\\\\">\\\\n <h4 class=\\\\\\\"coral-Heading coral-Heading--4\\\\\\\">{{ 'uploadHistory' | i18n }}</h4>\\\\n <table class=\\\\\\\"totem-AdHocTable totem-AdHocTable--collection coral-Table coral-Table--bordered\\\\\\\">\\\\n <thead>\\\\n <tr class=\\\\\\\"coral-Table-row\\\\\\\">\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--name\\\\\\\">{{ 'fileName' | i18n }}</th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--dateUploaded\\\\\\\">{{ 'dateUploaded' | i18n }}</th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--records\\\\\\\">{{ 'records' | i18n }}</th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--dashboardCount\\\\\\\">{{ 'dashboards' | i18n }}</th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--capacity\\\\\\\">{{ 'capacity' | i18n }}</th>\\\\n <th class=\\\\\\\"coral-Table-headerCell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--expander\\\\\\\"></th>\\\\n </tr>\\\\n <tr class=\\\\\\\"coral-Table-row\\\\\\\" ng-click=\\\\\\\"showDetails = !showDetails\\\\\\\">\\\\n <th class=\\\\\\\"coral-Table-cell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--nonheader\\\\\\\">{{ 'allData' | i18n }}</th>\\\\n <th class=\\\\\\\"coral-Table-cell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--nonheader\\\\\\\"> - </th>\\\\n <th class=\\\\\\\"coral-Table-cell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--nonheader\\\\\\\">{{ collection.rowCount | number }}</th>\\\\n <th class=\\\\\\\"coral-Table-cell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--nonheader\\\\\\\">3</th>\\\\n <th class=\\\\\\\"coral-Table-cell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--nonheader totem-AdHocTable-cell--capacity\\\\\\\">\\\\n <ad-hoc-capacity usage=\\\\\\\"{{collection.rowCount}}\\\\\\\" capacity=\\\\\\\"{{collection.maxRows}}\\\\\\\"></ad-hoc-capacity>\\\\n </th>\\\\n <th class=\\\\\\\"coral-Table-cell totem-AdHocTable-headerCell totem-AdHocTable-headerCell--nonheader totem-AdHocTable-headerCell--expander\\\\\\\">\\\\n <i class=\\\\\\\"totem-ActionButton-icon coral-Icon\\\\\\\" ng-class=\\\\\\\"{ 'coral-Icon--chevronDown': showDetails, 'coral-Icon--chevronRight': !showDetails }\\\\\\\"></i>\\\\n </th>\\\\n </tr>\\\\n </thead>\\\\n <tbody ng-show='showDetails'>\\\\n <tr class=\\\\\\\"coral-Table-row\\\\\\\" ng-repeat=\\\\\\\"upload in collection.uploads\\\\\\\">\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell totem-AdHocTable-cell--subdata\\\\\\\">{{ upload.fileName || ('unknownFileName' | i18n) }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell totem-AdHocTable-cell--subdata\\\\\\\">{{ upload.dateUploaded | date }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell totem-AdHocTable-cell--subdata\\\\\\\">{{ upload.rowCount | number }}</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell totem-AdHocTable-cell--subdata\\\\\\\">-</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell totem-AdHocTable-cell--subdata\\\\\\\">-</td>\\\\n <td class=\\\\\\\"coral-Table-cell totem-AdHocTable-cell totem-AdHocTable-cell--subdata totem-AdHocTable-cell--deleteUpload\\\\\\\" ng-click=\\\\\\\"deleteUpload(collection, upload)\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--delete\\\\\\\"></i></td>\\\\n </tr>\\\\n </tbody>\\\\n </table>\\\\n </section>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/views/collection.tpl.html\\n ** module id = 29\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<form class=\\\\\\\"coral-Form coral-Form--vertical\\\\\\\" style=\\\\\\\"width:100%\\\\\\\">\\\\n <div class=\\\\\\\"totem-EditTitleBar coral--dark\\\\\\\">\\\\n <div class=\\\\\\\"totem-EditTitleBar-title\\\\\\\">\\\\n {{ 'validateUploadedData' | i18n }}\\\\n </div>\\\\n <div class=\\\\\\\"totem-EditTitleBar-buttons\\\\\\\">\\\\n <button class=\\\\\\\"totem-EditTitleBar-cancelButton coral-Button coral-Button--quiet\\\\\\\" ng-click=\\\\\\\"cancelUpload()\\\\\\\">{{ 'cancel' | i18n }}</button>\\\\n <button class=\\\\\\\"totem-EditTitleBar-saveButton coral-Button coral-Button--primary\\\\\\\" ng-disabled=\\\\\\\"saveDisabled\\\\\\\" ng-click=\\\\\\\"saveCollection()\\\\\\\">{{ 'save' | i18n }}</button>\\\\n </div>\\\\n </div>\\\\n</form>\\\\n<div class=\\\\\\\"u-totem-contentUnderEditTitleBar\\\\\\\">\\\\n <div class=\\\\\\\"coral-Alert coral-Alert--error\\\\\\\" ng-show=\\\\\\\"uploadError\\\\\\\">\\\\n <i class=\\\\\\\"coral-Alert-typeIcon coral-Icon coral-Icon--sizeS coral-Icon--alert\\\\\\\"></i>\\\\n <strong class=\\\\\\\"coral-Alert-title\\\\\\\">Error</strong>\\\\n <div class=\\\\\\\"coral-Alert-message\\\\\\\">{{ uploadErrorMessage }}</div>\\\\n </div>\\\\n <div class=\\\\\\\"totem-AdHocValidate-contents\\\\\\\">\\\\n <div class=\\\\\\\"totem-AdHocValidate-rowHeaderBlock\\\\\\\" >\\\\n <!-- fixed row headers -->\\\\n <div class=\\\\\\\"totem-AdHocValidate-rowDescriptor\\\\\\\">\\\\n {{ 'adHocAttributeName' | i18n }}\\\\n </div>\\\\n <div class=\\\\\\\"totem-AdHocValidate-rowDescriptor\\\\\\\">\\\\n {{ 'adHocAttributeType' | i18n }}\\\\n </div>\\\\n <div class=\\\\\\\"totem-AdHocValidate-dataSpacer\\\\\\\">\\\\n <!-- spacer -->\\\\n </div>\\\\n <div class=\\\\\\\"totem-AdHocValidate-rowDescriptor\\\\\\\">\\\\n <!-- data header -->\\\\n {{ 'sampleData' | i18n }}\\\\n </div>\\\\n </div>\\\\n <div class=\\\\\\\"totem-AdHocValidate-sampleDataContainer\\\\\\\">\\\\n <table>\\\\n <tr class=\\\\\\\"totem-AdHocValidate-nameRow\\\\\\\">\\\\n <td class=\\\\\\\"totem-AdHocValidate-metaData totem-AdHocValidate-metaData--textbox\\\\\\\" ng-repeat=\\\\\\\"(adHocColumnKey,adHocColumn) in adHocSchema\\\\\\\">\\\\n <input ng-if=\\\\\\\"schemaEditable\\\\\\\" type=\\\\\\\"text\\\\\\\" class=\\\\\\\"coral-Textfield totem-AdHocValidate-metaDataInput\\\\\\\" ng-model=\\\\\\\"adHocSchema[adHocColumnKey].prettyName\\\\\\\">\\\\n <div class=\\\\\\\"totem-AdHocValidate-metaDataInput totem-AdHocValidate-metaDataInput--noEdit\\\\\\\" ng-if=\\\\\\\"!schemaEditable\\\\\\\">{{adHocSchema[adHocColumnKey].prettyName}}</div>\\\\n </td>\\\\n </tr>\\\\n <tr>\\\\n <td class=\\\\\\\"totem-AdHocValidate-metaData totem-AdHocValidate-metaData--select\\\\\\\" ng-repeat=\\\\\\\"(adHocColumnKey,adHocColumn) in adHocSchema\\\\\\\">\\\\n <cui-select ng-if=\\\\\\\"schemaEditable\\\\\\\" class=\\\\\\\"totem-AdHocValidate-metaDataInput\\\\\\\" id='adHocTypeId' options=\\\\\\\"columnOptions\\\\\\\" label=\\\\\\\"'label'\\\\\\\" selection=\\\\\\\"selectedTypes[adHocColumnKey]\\\\\\\"></cui-select>\\\\n <div class=\\\\\\\"totem-AdHocValidate-metaDataInput totem-AdHocValidate-metaDataInput--noEdit\\\\\\\" ng-if=\\\\\\\"!schemaEditable\\\\\\\">{{selectedTypes[adHocColumnKey].label}}</div>\\\\n </td>\\\\n </tr>\\\\n <tr style=\\\\\\\"padding:0;margin:0;\\\\\\\">\\\\n <td class=\\\\\\\"totem-AdHocValidate-dataSpacer\\\\\\\" ng-repeat=\\\\\\\"adHocColumn in adHocSchema\\\\\\\"></td>\\\\n </tr>\\\\n <tr ng-repeat=\\\\\\\"dataRow in adHocData\\\\\\\">\\\\n <td class=\\\\\\\"totem-AdHocValidate-sampleData totem-AdHocValidate-sampleData--datum\\\\\\\" ng-repeat=\\\\\\\"(adHocColumnKey, adHocColumnValue) in adHocSchema\\\\\\\">{{ dataRow[adHocColumnKey] }}</td>\\\\n </tr>\\\\n </table>\\\\n </div>\\\\n </div>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/views/validate-upload.tpl.html\\n ** module id = 30\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<dashboard-rail ng-show=\\\\\\\"showRail && !editable\\\\\\\"></dashboard-rail>\\\\n<div class=\\\\\\\"totem-NonRail\\\\\\\" editable=\\\\\\\"editable\\\\\\\">\\\\n <div class=\\\\\\\"totem-EditTitleBar coral--dark\\\\\\\" ng-if=\\\\\\\"editable\\\\\\\">\\\\n <name-editor name=\\\\\\\"dashboard.name\\\\\\\"></name-editor>\\\\n <div class=\\\\\\\"totem-EditTitleBar-buttons\\\\\\\">\\\\n <button class=\\\\\\\"totem-EditTitleBar-cancelButton coral-Button coral-Button--quiet\\\\\\\" ng-click=\\\\\\\"cancelEditing()\\\\\\\">{{ 'cancel' | i18n }}</button>\\\\n <button class=\\\\\\\"totem-EditTitleBar-saveButton coral-Button coral-Button--primary\\\\\\\" ng-click=\\\\\\\"saveDashboard()\\\\\\\">{{ 'save' | i18n }}</button>\\\\n </div>\\\\n </div>\\\\n <div class=\\\\\\\"totem-ActionBar\\\\\\\">\\\\n <div class=\\\\\\\"coral-ButtonGroup\\\\\\\">\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\" ng-click=\\\\\\\"toggleRail()\\\\\\\" ng-if=\\\\\\\"!editable\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--dashboard\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ getRailToggleText(showRail) }}</span></a>\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\" ui-sref=\\\\\\\"dashboard.edit({dashboardId: dashboard._id})\\\\\\\" ng-if=\\\\\\\"!editable\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--edit\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'edit' | i18n }}</span></a>\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\" href=\\\\\\\"/dashboards/{{dashboard._id}}.pdf?hour=1\\\\\\\" download ng-if=\\\\\\\"!editable\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--download\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'download' | i18n }}</span></a>\\\\n <!--<a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\" href=\\\\\\\"/dashboards/{{dashboard._id}}.pptx?hour=1\\\\\\\" download ng-if=\\\\\\\"!editable\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--download\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">Download PPT</span></a>-->\\\\n\\\\n <a class=\\\\\\\"totem-ActionButton coral-ButtonGroup-item coral-Button coral-Button--secondary coral-Button--quiet\\\\\\\" ng-click=\\\\\\\"newInstrumentConfigVisible = true\\\\\\\" ng-show=\\\\\\\"editable\\\\\\\"><i class=\\\\\\\"totem-ActionButton-icon coral-Icon coral-Icon--addCircle\\\\\\\"></i><span class=\\\\\\\"totem-ActionButton-label\\\\\\\">{{ 'addInstrument' | i18n }}</span></a>\\\\n </div>\\\\n </div>\\\\n <div ng-class=\\\\\\\"{'u-totem-contentUnderEditActionBar': editable, 'u-totem-contentUnderActionBar': !editable}\\\\\\\" responsive-evaluator editable=\\\\\\\"editable\\\\\\\">\\\\n <div class=\\\\\\\"totem-Measurements\\\\\\\" ng-if=\\\\\\\"editable\\\\\\\" ng-style=\\\\\\\"getMeasurementsStyle()\\\\\\\">\\\\n <ruler></ruler>\\\\n <media-definition-track></media-definition-track>\\\\n <media-definition-menu media-definitions=\\\\\\\"mediaDefinitions\\\\\\\"></media-definition-menu>\\\\n </div>\\\\n <dashboard-canvas editable=\\\\\\\"editable\\\\\\\"></dashboard-canvas>\\\\n </div>\\\\n <new-instrument-configuration ng-show=\\\\\\\"editable\\\\\\\" visible=\\\\\\\"newInstrumentConfigVisible\\\\\\\"></new-instrument-configuration>\\\\n</div>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/views/dashboard.tpl.html\\n ** module id = 31\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-EditTitleBar coral--dark\\\\\\\">\\\\n <name-editor name=\\\\\\\"instrument.title\\\\\\\"></name-editor>\\\\n <div class=\\\\\\\"totem-EditTitleBar-buttons\\\\\\\">\\\\n <button class=\\\\\\\"totem-EditTitleBar-cancelButton coral-Button coral-Button--quiet\\\\\\\" ng-click=\\\\\\\"cancel()\\\\\\\">{{ 'cancel' | i18n }}</button>\\\\n <button class=\\\\\\\"totem-EditTitleBar-saveButton coral-Button coral-Button--primary\\\\\\\" ng-click=\\\\\\\"save()\\\\\\\">{{ 'save' | i18n }}</button>\\\\n </div>\\\\n</div>\\\\n<instrument-editor-bootstrap instrument=\\\\\\\"instrument\\\\\\\"></instrument-editor-bootstrap>\\\\n\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/instrument/views/instrument.tpl.html\\n ** module id = 32\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div class=\\\\\\\"totem-InstrumentCanvas totem-InstrumentCanvas--renderOnly\\\\\\\">\\\\n <div class=\\\\\\\"totem-InstrumentCanvas-content\\\\\\\">\\\\n <instrument instrument=\\\\\\\"instrument\\\\\\\" class=\\\\\\\"totem-InstrumentCanvas-instrument\\\\\\\"></instrument>\\\\n </div>\\\\n</div>\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/instrument/views/render-instrument.tpl.html\\n ** module id = 33\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.adHocManageToolbar', [\\n require('../../common/services/ad-hoc-service').name,\\n require('../../common/directives/share').name\\n ])\\n .directive('adHocManageToolbar', function(user, $state, $q, dashboardService, i18nFilter, adHocService) {\\n return {\\n restrict: 'EA',\\n scope: {\\n collections: '=',\\n selectedCollections: '='\\n },\\n template: require('./ad-hoc-manage-toolbar.tpl.html'),\\n link: function(scope, element, attrs) {\\n scope.showSearchField = false;\\n scope.leaveModalVisible = false;\\n scope.deleteModalVisible = false;\\n scope.deleteModalDescription = '';\\n\\n scope.viewCollection = function() {\\n $state.go('collection', {\\n collectionId: scope.selectedCollections[0]._id\\n });\\n };\\n\\n scope.deleteCollections = function() {\\n scope.deleteCollectionDescription = i18nFilter('deleteCollectionDescription', {\\n NUM_COLLECTIONS: scope.selectedCollections.length\\n });\\n\\n scope.deleteCollectionTitle = i18nFilter('deleteCollectionTitle', {\\n NUM_COLLECTIONS: scope.selectedCollections.length\\n });\\n\\n scope.deleteModalVisible = true;\\n };\\n\\n scope.confirmDeleteCollection = function() {\\n var promises = [];\\n var origSelectedCollections = [];\\n scope.selectedCollections.forEach(function(collection) {\\n promises.push(adHocService.deleteCollection(collection));\\n });\\n\\n $q.all(promises).then(function(collection) {\\n scope.collections.forEach(function(collection) {\\n var index = scope.selectedCollections.indexOf(collection);\\n if (index > -1) {\\n origSelectedCollections.push(collection);\\n scope.selectedCollections.splice(index, 1);\\n }\\n });\\n });\\n };\\n\\n scope.isSearchable = function() {\\n return scope.selectedCollections.length === 0;\\n };\\n\\n scope.isViewable = function() {\\n return scope.selectedCollections.length === 1;\\n };\\n\\n scope.isEditable = function() {\\n return scope.selectedDashboards.length === 1 && scope.selectedDashboards[0].isEntityAnOwner(user);\\n };\\n\\n scope.isDeletable = function() {\\n // console.log('deleteable');\\n // var owningOnly = true;\\n // for (var i = 0; i < scope.selectedCollections.length; i++) {\\n // if (!scope.selectedCollections[i].isEntityAnOwner(user)) {\\n // owningOnly = false;\\n // }\\n // }\\n // return owningOnly;\\n return true;\\n };\\n\\n scope.isShareable = function() {\\n return scope.selectedCollections.length === 1;\\n };\\n\\n scope.isDeleteViewable = function() {\\n if(scope.selectedCollections.length > 0) {\\n return true;\\n }\\n for (var i = 0; i < scope.selectedCollections.length; i++) {\\n if (scope.selectedCollections[i].isEntityAnOwner(user)) {\\n return true;\\n }\\n }\\n return false;\\n };\\n\\n scope.createCollection = function() {\\n adHocService.resetCurrentCollection();\\n $state.go('collection',{collectionId:null});\\n };\\n\\n scope.saveCollection = function(collection) {\\n adHocService.savePermissions(collection);\\n };\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/directives/ad-hoc-manage-toolbar.js\\n ** module id = 34\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.adHocSearch', [])\\n .directive('adHocSearch', function() {\\n return {\\n restrict: 'EA',\\n scope: {\\n dashboards: '='\\n },\\n template: require('./ad-hoc-search.tpl.html'),\\n link: function(scope, element, attrs) {\\n element.find('.js-coral-Autocomplete-textfield').focus();\\n element.on('change:value', function(event, payload) {\\n // TODO: Somehow change the dashboard filter.\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/directives/ad-hoc-search.js\\n ** module id = 35\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.adHocCapacity', [\\n ])\\n .directive('adHocCapacity', function() {\\n return {\\n restrict: 'E',\\n scope: {\\n capacity:'@',\\n usage:'@'\\n },\\n template: require('./ad-hoc-capacity.tpl.html'),\\n link: function (scope, element, attrs) {\\n scope.getPercent = function(precision) {\\n var percent = scope.usage / scope.capacity * 100;\\n if(percent > 100) { percent = 100; }\\n if(precision) {\\n percent = percent.toPrecision(precision);\\n } else {\\n percent = Math.round(percent);\\n }\\n return percent;\\n };\\n\\n scope.getClass = function(percent) {\\n var ret = 'totem-Capacity-barSegment--good'; // green\\n if(percent > 70) {\\n ret = 'totem-Capacity-barSegment--warn'; // yellow above 70%\\n }\\n if(percent > 90) { \\n ret = 'totem-Capacity-barSegment--danger'; // red above 90%\\n }\\n return ret;\\n };\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/directives/ad-hoc-capacity.js\\n ** module id = 36\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.dataUpload', [\\n require('./ad-hoc-file-upload').name\\n ])\\n .directive('adHocDataUpload', function() {\\n return {\\n restrict: 'E',\\n template: require('./ad-hoc-data-upload.tpl.html'),\\n scope: {\\n collection:'=',\\n uploadFileName:'=',\\n saveDisabled:'='\\n }\\n };\\n});\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/ad-hoc/directives/ad-hoc-data-upload.js\\n ** module id = 37\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.dashboardCanvas', [\\n require('../../common/directives/draggable').name,\\n require('../../common/directives/resizeable').name,\\n require('../../common/directives/tap').name,\\n require('../../common/services/dashboard-workspace').name,\\n require('../../instrument/services/instrument-event-bus').name\\n ])\\n .directive('dashboardCanvas', function(gridSpacing, eventBus, dashboardWorkspaceService, instrumentEventBus, minInstrumentWidth, minInstrumentHeight) {\\n return {\\n restrict: 'AE',\\n scope: {\\n editable: '='\\n },\\n template: require('./dashboard-canvas.tpl.html'),\\n link: function(scope, element, attrs) {\\n /**\\n * Cached map where the key is the instrument ID and the value is the corresponding media layout.\\n * This is for optimization.\\n */\\n var mediaLayoutByInstrumentId;\\n\\n scope.getGridStyle = function() {\\n if (dashboardWorkspaceService.mediaDefinition && dashboardWorkspaceService.mediaLayouts) {\\n var gridHeight;\\n\\n if (dashboardWorkspaceService.mediaLayouts.length) {\\n // Set the grid height to accommodate down to the bottom of the lowest media layout.\\n var maxY = 0;\\n\\n dashboardWorkspaceService.mediaLayouts.forEach(function(mediaLayout) {\\n maxY = Math.max(maxY, mediaLayout.y + mediaLayout.height);\\n });\\n\\n gridHeight = (maxY + 1) * gridSpacing; // + 1 just to give an arbitrary little gap at the bottom\\n } else {\\n gridHeight = 400;\\n }\\n\\n return {\\n 'background-size': gridSpacing + 'px ' + gridSpacing + 'px',\\n width: dashboardWorkspaceService.mediaDefinition.width,\\n height: gridHeight\\n };\\n }\\n return null;\\n };\\n\\n scope.getInstrumentStyle = function(instrument) {\\n var mediaLayout = mediaLayoutByInstrumentId[instrument._id];\\n if (mediaLayout) {\\n return {\\n left: mediaLayout.x * gridSpacing,\\n top: mediaLayout.y * gridSpacing,\\n width: mediaLayout.width * gridSpacing,\\n height: mediaLayout.height * gridSpacing\\n };\\n } else {\\n return {\\n visible: false\\n };\\n }\\n };\\n\\n scope.constrainDrag = function(rect) {\\n var container = element.find('.totem-DashboardCanvas');\\n var width = container.innerWidth();\\n var height = container.innerHeight();\\n\\n // Constrain to the bounds of the dashboard.\\n rect.x = Math.min(Math.max(0, rect.x), width - rect.width);\\n rect.y = Math.min(Math.max(0, rect.y), height - rect.height);\\n\\n // Adjust to grid\\n rect.x -= (rect.x % gridSpacing);\\n rect.y -= (rect.y % gridSpacing);\\n\\n return rect;\\n };\\n\\n scope.constrainResize = function(rect, origRect) {\\n var container = element.find('.totem-DashboardCanvas');\\n var containerRect = {\\n width: container.innerWidth(),\\n height: container.innerHeight(),\\n x: container.position().left,\\n y: container.position().top\\n };\\n\\n // Enforce minimum dimensions\\n rect.width = Math.max(minInstrumentWidth, rect.width);\\n rect.height = Math.max(minInstrumentWidth, rect.height);\\n if(rect.width == minInstrumentWidth) {\\n rect.x = Math.min(origRect.x + (origRect.width - rect.width), rect.x);\\n }\\n\\n // Forbid escaping the container\\n if(rect.x + rect.width > containerRect.width) {\\n rect.width = containerRect.width - rect.x;\\n }\\n if(rect.x <= 0) {\\n rect.x = 0;\\n rect.width = origRect.x + origRect.width;\\n }\\n\\n // Adjust to grid\\n rect.height -= (rect.height % gridSpacing);\\n rect.x -= (rect.x % gridSpacing);\\n if(rect.width % gridSpacing !== 0) {\\n rect.width += gridSpacing - (rect.width % gridSpacing);\\n }\\n\\n return rect;\\n };\\n\\n scope.bringToFront = function(instrument) {\\n if (!scope.editable) {\\n return;\\n }\\n\\n dashboardWorkspaceService.dashboard.bringInstrumentToFront(\\n instrument, dashboardWorkspaceService.mediaDefinition);\\n };\\n\\n var commitRect = function(instrument, rect) {\\n var mediaLayout = mediaLayoutByInstrumentId[instrument._id];\\n mediaLayout.width = rect.width / gridSpacing;\\n mediaLayout.height = rect.height / gridSpacing;\\n mediaLayout.x = rect.x / gridSpacing;\\n mediaLayout.y = rect.y / gridSpacing;\\n };\\n\\n scope.dragContinue = scope.dragComplete = commitRect;\\n\\n scope.resizeBegin = function(instrument) {\\n instrumentEventBus.publish({\\n topic: 'resizing',\\n to: instrument._id\\n });\\n };\\n\\n scope.resizeContinue = commitRect;\\n\\n scope.resizeComplete = function(instrument, rect) {\\n instrumentEventBus.publish({\\n topic: 'resized',\\n to: instrument._id\\n });\\n commitRect(instrument, rect);\\n };\\n\\n scope.$watchGroup([\\n function() { return dashboardWorkspaceService.instruments; },\\n function() { return dashboardWorkspaceService.mediaLayouts; }\\n ], function(newValues) {\\n var instruments = newValues[0];\\n var mediaLayouts = newValues[1];\\n if (instruments && mediaLayouts) {\\n mediaLayoutByInstrumentId = {};\\n instruments.forEach(function(instrument) {\\n mediaLayouts.forEach(function(mediaLayout) {\\n if (mediaLayout.instrumentId === instrument._id) {\\n mediaLayoutByInstrumentId[instrument._id] = mediaLayout;\\n return false;\\n }\\n });\\n });\\n\\n scope.instruments = instruments;\\n }\\n });\\n\\n // Watch for z-index changes within the media layout models. When we see a change, sort the instruments\\n // based on their z-index.\\n scope.$watch(function() {\\n if (dashboardWorkspaceService.mediaLayouts) {\\n var zIndexHash = '';\\n\\n var mediaLayouts = dashboardWorkspaceService.mediaLayouts;\\n for (var i = 0; i < mediaLayouts.length; i++) {\\n var mediaLayout = mediaLayouts[i];\\n // I know this looks like a hack but it's the most performant way I can think of for detecting when\\n // z-index changes on any of the active media layouts. If you can think of a better way, please feel free\\n // to change. While we could deep watch the media layouts, a change to x, y, width, or height on the\\n // media layout would trigger the watcher. While we could create an array of z-index values from the\\n // media layouts, would would have to deep compare the array. Creating this hash seems more\\n // efficient because no deep watch is necessary.\\n\\n // Media layout ID needs to be included in the hash to support the case where a user changes\\n // media definitions and the media layouts for the new media definition contain the same z-index values\\n // in the same order as the media layouts of the previous media definition. In this case we still need to\\n // execute the instrument reordering process.\\n zIndexHash += mediaLayout._id + ':' + mediaLayout.zIndex + ',';\\n }\\n\\n return zIndexHash;\\n }\\n }, function() {\\n if (scope.instruments && dashboardWorkspaceService.mediaLayouts) {\\n sortInstrumentsByZIndex(scope.instruments, dashboardWorkspaceService.mediaLayouts);\\n }\\n });\\n\\n /**\\n * Sorts instruments by the z-index of their respective media layouts.\\n *\\n * This is used for ordering instruments on screen such that they are properly stacked in the z dimension\\n * using DOM element ordering rather than CSS z-index. We prefer element ordering over CSS z-index in order to\\n * avoid conflicting with the z-index of surrounding components in the application.\\n *\\n * @param instruments\\n * @param mediaLayouts\\n * @returns {*}\\n */\\n var sortInstrumentsByZIndex = function(instruments, mediaLayouts) {\\n instruments.sort(function(instrumentA, instrumentB) {\\n var mediaLayoutA = mediaLayoutByInstrumentId[instrumentA._id];\\n var mediaLayoutB = mediaLayoutByInstrumentId[instrumentB._id];\\n if (mediaLayoutA && mediaLayoutB) {\\n if (mediaLayoutA.zIndex === undefined) {\\n return -1;\\n } else if (mediaLayoutB.zIndex === undefined) {\\n return 1;\\n } else {\\n return mediaLayoutA.zIndex - mediaLayoutB.zIndex;\\n }\\n }\\n });\\n\\n return instruments;\\n };\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/dashboard-canvas.js\\n ** module id = 38\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.dashboardRail', [\\n ])\\n .directive('dashboardRail', function(dashboardService, dashboardWorkspaceService) {\\n return {\\n restrict: 'AE',\\n template: require('./dashboard-rail.tpl.html'),\\n link: function(scope, element, attrs) {\\n dashboardService.query().then(function(dashboards) {\\n scope.dashboards = dashboards;\\n });\\n\\n scope.isActiveDashboard = function(dashboard) {\\n return dashboardWorkspaceService.dashboard && dashboardWorkspaceService.dashboard._id === dashboard._id;\\n };\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/dashboard-rail.js\\n ** module id = 39\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.responsiveEvaluator', [\\n require('../services/event-bus').name,\\n require('../../common/services/debounce').name,\\n require('../../common/services/dashboard-workspace').name\\n ])\\n .directive('responsiveEvaluator', function($timeout, $window, dashboardWorkspaceService, eventBus, debounce) {\\n return {\\n scope: {\\n editable: '='\\n },\\n link: function(scope, element, attrs) {\\n var debouncedWindowResize = debounce(function() {\\n scope.$apply(function() {\\n findBestFitMediaDefinition();\\n });\\n }, 30);\\n\\n var findBestFitMediaDefinition = function() {\\n if (!dashboardWorkspaceService.dashboard) {\\n return;\\n }\\n\\n var bestFit, smallestFit,\\n width = element.innerWidth();\\n\\n dashboardWorkspaceService.dashboard.mediaDefinitions.forEach(function(definition) {\\n if (definition.width < width && (!bestFit || definition.width > bestFit.width)) {\\n bestFit = definition;\\n }\\n if (!smallestFit || definition.width < smallestFit.width) {\\n smallestFit = definition;\\n }\\n });\\n\\n if(!bestFit) {\\n bestFit = smallestFit;\\n }\\n\\n // Let's say the best fit media definition is 1000px wide and the width allotted for the dashboard\\n // (derived from the container width) is 1000px. The dashboard would fit nicely. However, say that dashboard\\n // is long enough that it requires vertical scrolling. When the vertical scrollbar shows up, a horizontal\\n // scrollbar shows up as well because the content is now too wide for the container width minus\\n // the vertical scrollbar width. This is a sketchy situation. Do we bump the dashboard down to the next\\n // smallest media definition (we could calculate whether a vertical scrollbar will show up beforehand by\\n // comparing the container height with positions and heights of media layouts)? Do we show leave the\\n // horizontal scrollbar? Do we hide the horizontal scrollbar and let the vertical scrollbar just cover a bit\\n // of the dashboard? We've decided to take the last approach. However, if the active media definition is the\\n // smallest media definition, we set the horizontal scrollbar to auto since the user may legitimately need to\\n // scroll horizontally to see all the dashboard content. This is definitely subject to change.\\n if (smallestFit === bestFit) {\\n element.css('overflow-x', 'auto');\\n } else {\\n element.css('overflow-x', 'hidden');\\n }\\n\\n dashboardWorkspaceService.mediaDefinition = bestFit;\\n };\\n\\n eventBus.subscribe('resetActiveMediaDefinition', function() {\\n // http://stackoverflow.com/questions/25330149/why-is-the-asyncqueue-processed-before-watchers/25330696\\n scope.$$postDigest(function() {\\n scope.$apply(findBestFitMediaDefinition);\\n });\\n });\\n\\n scope.$watch(function() {\\n return dashboardWorkspaceService.dashboard;\\n }, function() {\\n findBestFitMediaDefinition();\\n });\\n\\n scope.$watch('editable', function(editable) {\\n if (editable) {\\n angular.element($window).off('resize.mediaDefinition');\\n } else {\\n angular.element($window).on('resize.mediaDefinition', debouncedWindowResize);\\n\\n // When the user navigates from editing a dashboard to viewing a dashboard, we want make sure we're showing\\n // the best fit media definition rather than the last media definition the user was editing.\\n findBestFitMediaDefinition();\\n }\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/responsive-evaluator.js\\n ** module id = 40\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.dashboardInstrumentChrome', [\\n require('../services/event-bus').name\\n ])\\n .directive('dashboardInstrumentChrome', function(eventBus, $stateParams, $state, dashboardWorkspaceService) {\\n return {\\n restrict: 'AE',\\n scope: {\\n editable: '=',\\n instrument: '='\\n },\\n transclude: true,\\n template: require('./dashboard-instrument-chrome.tpl.html'),\\n link: function(scope, element, attrs) {\\n scope.editInstrument = function() {\\n $state.go('instrument.edit', {\\n dashboardId: $stateParams.dashboardId,\\n instrumentId: scope.instrument._id\\n });\\n };\\n\\n scope.removeInstrument = function() {\\n dashboardWorkspaceService.dashboard.removeInstrument(scope.instrument);\\n };\\n\\n scope.duplicateInstrument = function($event) {\\n // Normally something higher in the DOM would see the click and force this instrument to be on top of other\\n // instruments. If we were to let this happen during instrument duplication, it would be forced to be on top\\n // of the new duplicate. We want the duplicate to be on top.\\n $event.stopPropagation();\\n dashboardWorkspaceService.dashboard.duplicateInstrument(scope.instrument,\\n dashboardWorkspaceService.mediaDefinition);\\n };\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/dashboard-instrument-chrome.js\\n ** module id = 41\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.mediaDefinitionTrack', [\\n require('./media-definition-range').name,\\n require('./media-definition-rename-popover').name,\\n require('./media-definition-delete-popover').name,\\n require('../services/event-bus').name,\\n require('../../common/services/uuid').name,\\n require('../../common/services/dashboard-workspace').name,\\n require('../../instrument/services/instrument-event-bus').name\\n ])\\n .directive('mediaDefinitionTrack', function(eventBus, uuid, dashboardWorkspaceService, instrumentEventBus, $timeout,\\n gridSpacing, minMediaDefinitionWidth) {\\n\\n return {\\n restrict: 'AE',\\n scope: true,\\n replace: true,\\n template: require('./media-definition-track.tpl.html'),\\n link: function(scope, element, attrs) {\\n // TODO: Do this in a more Angular way?\\n var getThumbByMediaDefinition = function(mediaDefinition) {\\n var thumbs = element.find('.totem-MediaDefinitionThumb').toArray();\\n for (var i = 0; i < thumbs.length; i++) {\\n var thumb = $(thumbs[i]);\\n if (thumb.scope().mediaDefinition == mediaDefinition) {\\n return thumb;\\n }\\n }\\n };\\n\\n scope.$watch(function() {\\n return dashboardWorkspaceService.dashboard;\\n }, function(dashboard) {\\n if (dashboard) {\\n scope.mediaDefinitions = dashboard.mediaDefinitions;\\n }\\n });\\n\\n scope.$watch(function() {\\n return dashboardWorkspaceService.mediaDefinition;\\n }, function(mediaDefinition) {\\n scope.activeMediaDefinition = mediaDefinition;\\n });\\n\\n scope.getRangeStyle = function(mediaDefinition) {\\n // Potential optimization point since we're sorting media definitions each time this is called (once for\\n // every media definition).\\n var mediaDefinitions = dashboardWorkspaceService.dashboard.sortMediaDefinitions();\\n var index = mediaDefinitions.indexOf(mediaDefinition);\\n if (index > 0) {\\n var previousMediaDefinition = mediaDefinitions[index - 1];\\n return {\\n left: previousMediaDefinition.width,\\n width: mediaDefinition.width - previousMediaDefinition.width\\n };\\n } else {\\n return {\\n left: 0,\\n width: mediaDefinition.width\\n };\\n }\\n };\\n\\n scope.activateMediaDefinition = function(mediaDefinition) {\\n dashboardWorkspaceService.mediaDefinition = mediaDefinition;\\n };\\n\\n scope.getThumbStyle = function(mediaDefinition) {\\n var style = {\\n left: mediaDefinition.width\\n };\\n return style;\\n };\\n\\n ///////////////////////////\\n // Thumb dragging\\n ///////////////////////////\\n\\n scope.constrainThumbDrag = function(rect) {\\n rect.y = 0;\\n rect.x = Math.min(Math.max(minMediaDefinitionWidth, rect.x), element.width());\\n rect.x -= rect.x % gridSpacing; // Snap to grid\\n return rect;\\n };\\n\\n // Media layouts pertaining to the media definition thumb being dragged.\\n var mediaLayoutsDrag,\\n // Copies of the media layouts pertaining to the media definition thumb being dragged. These contain the state\\n // as it was when the drag started.\\n mediaLayoutCopiesDragBegin,\\n // The width of the media definition being dragged as it was when the drag started.\\n mediaDefinitionWidthDragBegin;\\n\\n scope.thumbDragBegin = function(mediaDefinition) {\\n if (mediaDefinition === dashboardWorkspaceService.mediaDefinition) {\\n instrumentEventBus.publish({\\n topic: 'resizing'\\n });\\n }\\n mediaLayoutsDrag = dashboardWorkspaceService.dashboard.getMediaLayoutsForMediaDefinition(mediaDefinition);\\n mediaLayoutCopiesDragBegin = angular.copy(mediaLayoutsDrag);\\n mediaDefinitionWidthDragBegin = mediaDefinition.width;\\n };\\n\\n scope.thumbDragContinue = function(mediaDefinition, rect) {\\n mediaDefinition.width = rect.x;\\n\\n // If the name is in the format #px (which is default) then automatically update\\n // the name to match the new width.\\n if (/^\\\\d+px$/g.test(mediaDefinition.name)) {\\n mediaDefinition.name = rect.x + 'px';\\n }\\n\\n dashboardWorkspaceService.dashboard.resampleMediaLayouts(\\n mediaLayoutCopiesDragBegin,\\n mediaLayoutsDrag,\\n mediaDefinitionWidthDragBegin,\\n mediaDefinition.width);\\n };\\n\\n scope.thumbDragComplete = function(mediaDefinition) {\\n if (mediaDefinition === dashboardWorkspaceService.mediaDefinition) {\\n instrumentEventBus.publish({\\n topic: 'resized'\\n });\\n }\\n };\\n\\n ///////////////////////////\\n // Popover handling\\n ///////////////////////////\\n\\n // Unfortunately this has to be an object instead of a simple boolean in order to allow the popover directive to\\n // set the boolean and be able to see the change from within this directive. This is due to how scopes use\\n // prototypal inheritance to \\\"shadow\\\" the parent scope.\\n // Sound mysterious? See https://github.com/angular/angular.js/wiki/Understanding-Scopes for an explanation.\\n scope.renamePopoverVisibility = { visible: false };\\n scope.createPopoverVisibility = { visible: false };\\n scope.deletePopoverVisibility = { visible: false };\\n\\n var showPopover = function(mediaDefinition, popoverVisibilityName) {\\n var scrollParent = element.scrollParent(),\\n scrollParentWidth = scrollParent.width(),\\n thumbBuffer = 50; // Make sure the thumb is this many pixels away from the side of the scrollable container\\n\\n scope.popoverThumb = getThumbByMediaDefinition(mediaDefinition);\\n scope.popoverMediaDefinition = mediaDefinition;\\n\\n // Make sure the media definition thumb is visible before showing the popover.\\n var newScrollLeft;\\n\\n if (mediaDefinition.width < scrollParent[0].scrollLeft + thumbBuffer) {\\n newScrollLeft = mediaDefinition.width - thumbBuffer;\\n } else if (mediaDefinition.width > scrollParent[0].scrollLeft + scrollParentWidth - thumbBuffer) {\\n newScrollLeft = mediaDefinition.width + thumbBuffer - scrollParentWidth;\\n }\\n\\n var makeVisible = function() {\\n scope[popoverVisibilityName].visible = true;\\n };\\n\\n if (newScrollLeft !== undefined) {\\n scrollParent.animate({\\n scrollLeft: newScrollLeft\\n }, {\\n duration: 300,\\n done: function() {\\n scope.$apply(makeVisible);\\n }\\n });\\n } else {\\n makeVisible();\\n }\\n };\\n\\n eventBus.subscribe('renameMediaDefinition', function(mediaDefinition) {\\n showPopover(mediaDefinition, 'renamePopoverVisibility');\\n }, scope);\\n\\n eventBus.subscribe('addMediaDefinition', function() {\\n var previousMediaDefinition = dashboardWorkspaceService.mediaDefinition;\\n var newMediaDefinition = dashboardWorkspaceService.dashboard.createMediaDefinition(previousMediaDefinition);\\n dashboardWorkspaceService.mediaDefinition = newMediaDefinition;\\n\\n scope.cancelCreate = function() {\\n dashboardWorkspaceService.mediaDefinition = previousMediaDefinition;\\n dashboardWorkspaceService.dashboard.removeMediaDefinition(newMediaDefinition);\\n };\\n\\n // We have to wait for the thumb for the new media definition to be created before we can show\\n // the popover at its position.\\n $timeout(function() {\\n showPopover(newMediaDefinition, 'createPopoverVisibility');\\n });\\n }, scope);\\n\\n eventBus.subscribe('deleteMediaDefinition', function(mediaDefinition) {\\n showPopover(mediaDefinition, 'deletePopoverVisibility');\\n }, scope);\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/media-definition-track.js\\n ** module id = 42\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.mediaDefinitionMenu', [\\n require('../services/event-bus').name,\\n require('../../common/services/dashboard-workspace').name\\n ])\\n .directive('mediaDefinitionMenu', function(eventBus, dashboardWorkspaceService) {\\n return {\\n restrict: 'AE',\\n template: require('./media-definition-menu.tpl.html'),\\n scope: true,\\n link: function(scope, element, attrs) {\\n var popover;\\n\\n scope.togglePopover = function($event) {\\n var popoverElement = $('.totem-MediaDefinitionMenu-popover');\\n popover = popoverElement.data('popover');\\n if (!popover) {\\n popover = new CUI.Popover({\\n element: popoverElement,\\n pointAt: $event.currentTarget,\\n alignFrom: 'right'\\n });\\n }\\n popover.toggleVisibility();\\n };\\n\\n scope.rowChildMouseenter = scope.rowChildFocus = function(event) {\\n $(event.currentTarget.parentNode).addClass('is-highlighted');\\n };\\n\\n scope.rowChildMouseleave = scope.rowChildBlur = function(event) {\\n var parent = $(event.currentTarget.parentNode);\\n if (!parent.children(':focus').length) {\\n parent.removeClass('is-highlighted');\\n }\\n };\\n\\n scope.activateMediaDefinition = function(mediaDefinition) {\\n popover.hide();\\n dashboardWorkspaceService.mediaDefinition = mediaDefinition;\\n };\\n\\n scope.editMediaDefinition = function(mediaDefinition) {\\n popover.hide();\\n eventBus.publish('renameMediaDefinition', mediaDefinition);\\n };\\n\\n scope.deleteMediaDefinition = function(mediaDefinition) {\\n popover.hide();\\n eventBus.publish('deleteMediaDefinition', mediaDefinition);\\n };\\n\\n scope.addMediaDefinition = function() {\\n popover.hide();\\n eventBus.publish('addMediaDefinition');\\n };\\n\\n scope.$watch(function() {\\n return dashboardWorkspaceService.dashboard;\\n }, function(dashboard) {\\n if (dashboard) {\\n scope.mediaDefinitions = dashboard.mediaDefinitions;\\n }\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/media-definition-menu.js\\n ** module id = 43\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.ruler', [])\\n .directive('ruler', function() {\\n return {\\n restrict: 'AE',\\n link: function(scope, element, attrs) {\\n var tickWidth = 50;\\n\\n // How many labels should we make? Well, we could make as many as fill the width of the element,\\n // but what happens when the user makes the window larger? We could watch for window resize events\\n // and generate more. But what happens when the ruler container gets larger without the window resizing\\n // (like if a side panel gets hidden)? Rather than deal with the fringe cases, we'll go with a width which\\n // covers most resolutions or the width of the element, whichever is larger.\\n var maxWidth = Math.max(2700, element.width());\\n\\n element.addClass('totem-Ruler');\\n\\n var numLabels = Math.ceil(maxWidth / 50);\\n var label;\\n\\n for (var i = 0; i < numLabels; i++) {\\n label = angular.element('<span class=\\\"totem-Ruler-label\\\">' + (i * tickWidth) + '</span>');\\n label.css({\\n position: 'absolute',\\n top: -1,\\n left: (i * tickWidth) + 3\\n });\\n element.append(label);\\n }\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/directives/ruler.js\\n ** module id = 44\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nmodule.exports = angular.module('totem.instrument', [\\n require('../services/instrument-event-bus').name\\n ])\\n .directive('instrument', function(eventBus, instrumentEventBus, $compile, $q) {\\n return {\\n restrict: 'E',\\n scope: {\\n instrument: '='\\n },\\n template: require('./instrument.tpl.html'),\\n replace: true,\\n link: function(scope, element, attrs) {\\n var rendererScope;\\n\\n var content = element.find('.js-totem-DashboardInstrument-render');\\n\\n scope.showProgress = false;\\n scope.showFailure = false;\\n\\n var digestConfigChangedHandler = function() {\\n if (scope.instrument) {\\n rendererScope.config = scope.instrument.config;\\n }\\n };\\n\\n var processingHandler = function() {\\n scope.showProgress = true;\\n\\n // Assume that if there was a previous failure and the instrument is processing again\\n // that we should pull it out of a failure state.\\n scope.showFailure = false;\\n };\\n\\n var processedHandler = function() {\\n scope.showProgress = false;\\n };\\n\\n var failedHandler = function() {\\n scope.showFailure = true;\\n };\\n\\n var instrumentBus;\\n\\n scope.$watch('instrument', function(instrument) {\\n if (instrumentBus) {\\n instrumentBus.unsubscribeAll();\\n }\\n\\n if (instrument && instrument.type) {\\n instrumentEventBus.subscribe({\\n topic: 'configChanged',\\n fromPublisher: instrument._id,\\n handler: digestConfigChangedHandler\\n }, scope);\\n\\n instrumentEventBus.subscribe({\\n topic: 'processing',\\n fromPublisher: instrument._id,\\n handler: processingHandler\\n }, scope);\\n\\n instrumentEventBus.subscribe({\\n topic: 'processed',\\n fromPublisher: instrument._id,\\n handler: processedHandler\\n }, scope);\\n\\n instrumentEventBus.subscribe({\\n topic: 'failed',\\n fromPublisher: instrument._id,\\n handler: failedHandler\\n }, scope);\\n\\n var rendererFactory = require('../../../instruments/' + instrument.type + '/renderer/renderer');\\n\\n if (rendererScope) {\\n rendererScope.$destroy();\\n }\\n\\n var bus = instrumentEventBus.getInstrumentScopedInterface(instrument._id);\\n\\n var renderer = rendererFactory(instrument.config, bus);\\n\\n content.empty().append(renderer);\\n\\n // Allow instrument renderer to use AngularJS\\n rendererScope = scope.$new(true);\\n rendererScope.config = instrument.config;\\n rendererScope.eventBus = bus;\\n $compile(content.contents())(rendererScope);\\n }\\n });\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/instrument/directives/instrument.js\\n ** module id = 45\\n ** module chunks = 0\\n **/\",\"'use strict';\\n\\nvar dashboardUtil = require('../../../../common/dashboard-util.js');\\n\\nmodule.exports = angular.module('totem.newInstrumentConfiguration', [\\n require('../../common/services/dashboard-workspace').name\\n ])\\n .directive('newInstrumentConfiguration', function($state, uuid, dashboardWorkspaceService, gridSpacing) {\\n return {\\n restrict: 'AE',\\n scope: {\\n visible: '='\\n },\\n template: require('./new-instrument-configuration.tpl.html'),\\n link: function(scope, element, attrs) {\\n\\n /**\\n * Creates a new instrument and media layouts across all pages and media definitions. The instrument will be\\n * placed at the lowest y position available on a given media definition.\\n * @param {String} type The type of instrument we are creating\\n */\\n scope.addInstrument = function(type) {\\n var dashboard = dashboardWorkspaceService.dashboard;\\n var newInstrument = {\\n _id: uuid(),\\n title: 'New Instrument',\\n type: type\\n };\\n\\n dashboard.instruments.push(newInstrument);\\n dashboardUtil.insertInstrumentAtLayoutBottom(newInstrument, dashboard, gridSpacing, uuid);\\n\\n // TODO: Need to set timeout because the modal will not clear the backdrop if we immediately\\n // navigate to a new page. Setting a timeout allows the modal to clear the backdrop before we\\n // navigate away.\\n setTimeout(function() {\\n $state.go('instrument.edit', {\\n dashboardId: dashboard._id,\\n instrumentId: newInstrument._id\\n });\\n }, 0);\\n };\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/instrument/directives/new-instrument-configuration.js\\n ** module id = 46\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.instrumentEditorBootstrap', [\\n require('../services/instrument-event-bus').name,\\n 'totem.dv.editor'\\n ])\\n .directive('instrumentEditorBootstrap', function(instrumentEventBus, $compile, $q) {\\n return {\\n restrict: 'E',\\n scope: {\\n instrument: '='\\n },\\n link: function(scope, element, attrs) {\\n var rendererScope, editorScope;\\n\\n var destroyScopes = function() {\\n if (rendererScope) {\\n rendererScope.$destroy();\\n }\\n\\n if (editorScope) {\\n editorScope.$destroy();\\n }\\n };\\n\\n var init = function() {\\n destroyScopes();\\n\\n if (scope.instrument && scope.instrument.type) {\\n var editorFactory = require('../../../instruments/' + scope.instrument.type + '/editor/editor');\\n\\n var eventBus = instrumentEventBus.getInstrumentScopedInterface(scope.instrument._id);\\n\\n rendererScope = scope.$new(true);\\n rendererScope.instrument = scope.instrument;\\n var renderer = $compile('<instrument instrument=\\\"instrument\\\"></instrument>')(rendererScope);\\n\\n var editor = editorFactory(renderer, scope.instrument.config, eventBus);\\n element.empty().append(editor);\\n\\n // Allow instrument editor to use AngularJS\\n editorScope = scope.$new(true);\\n editorScope.instrument = scope.instrument;\\n editorScope.eventBus = eventBus;\\n\\n $compile(editor)(editorScope);\\n }\\n };\\n\\n scope.$watch('instrument', init);\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/instrument/directives/instrument-editor-bootstrap.js\\n ** module id = 47\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.eventBus', [])\\n .factory('eventBus', function($rootScope) {\\n return {\\n publish: function() {\\n $rootScope.$emit.apply($rootScope, arguments);\\n },\\n subscribe: function(event, callback, scope) {\\n var unbind = $rootScope.$on(event, function() {\\n callback.apply(null, Array.prototype.slice.call(arguments, 1));\\n });\\n if (scope) {\\n scope.$on('$destroy', unbind);\\n }\\n }\\n };\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/dashboard/services/event-bus.js\\n ** module id = 48\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.instrumentEventBus', [])\\n .factory('instrumentEventBus', function($timeout) {\\n var subscriptionsByTopic = {};\\n\\n var bus = {};\\n\\n /**\\n * Publish a message to the event bus.\\n * @param {Object} envelope\\n * @param {String} envelope.topic The message topic.\\n * @param {String|Number} [envelope.from] The identifier of the sender. This can be used by a subscriber to filter\\n * messages by sender.\\n * @param {String|Number} [envelope.to] The identifier for the intended recipient. If excluded, the message will\\n * be sent to all topic subscribers (assuming the message is not filtered via \\\"from\\\").\\n * @param {*} [envelope.data] Any data payload to send to the subscriber.\\n */\\n bus.publish = function(envelope) {\\n // Force asynchronicity and a digest cycle. Not necessary but helpful to ensure a digest cycle happens and\\n // make everything consistently asynchronous.\\n $timeout(function() {\\n var subscriptions = subscriptionsByTopic[envelope.topic];\\n\\n if (subscriptions) {\\n for (var i = 0; i < subscriptions.length; i++) {\\n var subscription = subscriptions[i];\\n\\n // if (the subscriber doesn't care who the message is from or the message is from the desired publisher)\\n // AND (the message isn't addressed to any particular subscriber or it's addressed to this subscriber)\\n // ...then deliver the message.\\n if ((!subscription.fromPublisher || subscription.fromPublisher === envelope.from) &&\\n (!envelope.to || subscription.subscriberId === envelope.to)) {\\n subscription.handler(envelope.data);\\n }\\n }\\n }\\n });\\n };\\n\\n /**\\n * Subscribe to the event bus.\\n * @param {Object} subscription\\n * @param {String} subscription.topic The topic to subscribe to.\\n * @param {Function} subscription.handler The handling function for the message. This function will be passed any\\n * data specified on the message envelope's data attribute.\\n * @param {String|Number} [subscription.subscriberId] The subscriber's identifier. This can be used by the publisher\\n * to send messages to a specific subscriber.\\n * @param {String|Number} [subscription.fromPublisher] If specified, the subscriber will only be delivered messages that\\n * contain a from attribute with a value that matches.\\n * @param {Object} [scope] The AngularJS scope related to the subscriber. If passed, the subscriber will be\\n * automatically unsubscribed when the scope is destroyed. Useful for memory cleanup.\\n * @returns {Function} A function which, when called, will unsubscribe the subscriber.\\n */\\n bus.subscribe = function(subscription, scope) {\\n var subscriptions = subscriptionsByTopic[subscription.topic];\\n\\n if (!subscriptions) {\\n subscriptions = subscriptionsByTopic[subscription.topic] = [];\\n }\\n\\n subscriptions.push(subscription);\\n\\n var unsubscribeHandle = function() {\\n bus.unsubscribe(subscription);\\n };\\n\\n if (scope) {\\n scope.$on('$destroy', unsubscribeHandle);\\n }\\n\\n return unsubscribeHandle;\\n };\\n\\n /**\\n * Unsubscribe a subscription.\\n * @param {Object} subscription The subscription object that was used during subscription.\\n */\\n bus.unsubscribe = function(subscription) {\\n var subscriptions = subscriptionsByTopic[subscription.topic];\\n if (subscriptions) {\\n var index = subscriptions.indexOf(subscription);\\n if (index > -1) {\\n subscriptions.splice(index, 1);\\n }\\n }\\n };\\n\\n /**\\n * Returns a simplified API instruments can use for publishing and subscribing. This allows the user of the API\\n * to be blissfully unaware of the instrument's ID or the enveloping mechanism used within the instrument event bus.\\n * @param {String|Number} instrumentId\\n * @returns {{publish: Function, subscribe: Function}}\\n */\\n bus.getInstrumentScopedInterface = function(instrumentId) {\\n return {\\n publish: function(topic, data) {\\n bus.publish({\\n from: instrumentId,\\n topic: topic,\\n data: data\\n });\\n },\\n subscribe: function(topic, handler) {\\n return bus.subscribe({\\n subscriberId: instrumentId,\\n topic: topic,\\n handler: handler\\n });\\n }\\n };\\n };\\n\\n return bus;\\n })\\n;\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/instrument/services/instrument-event-bus.js\\n ** module id = 49\\n ** module chunks = 0\\n **/\",\"module.exports = \\\"<div ui-view class=\\\\\\\"totem-View\\\\\\\"></div>\\\\n<alert></alert>\\\\n<modal-progress-indicator></modal-progress-indicator>\\\\n\\\"\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/directives/app.tpl.html\\n ** module id = 50\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.uuid', [])\\n .constant('uuid', function() {\\n /* jshint bitwise:false */\\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript\\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\\n var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);\\n return v.toString(16);\\n });\\n });\\n\\n\\n\\n/*****************\\n ** WEBPACK FOOTER\\n ** ./client/scripts/common/services/uuid.js\\n ** module id = 51\\n ** module chunks = 0\\n **/\",\"'use strict';\\nmodule.exports = angular.module('totem.dashboardMixin', [\\n require('./participable-mixin').name,\\n require('./tag-enum').name,\\n require('./uuid').name\\n])\\n .factory('dashboardMixin', function(participableMixin, tagEnum, uuid, gridSpacing, duplicateInstrumentOffset, minMediaDefinitionWidth) {\\n /**\\n * Methods to be used on dashboard objects. While we could make a Dashboard class, it doesn't give offer much and\\n * brings with it other hassles.\\n */\\n var objectMethods = {\\n isFullDashboard: function() {\\n return this.hasOwnProperty('instruments');\\n },\\n removeInstrument: function(instrument) {\\n if (this.instruments) {\\n var index = this.instruments.indexOf(instrument);\\n if (index > -1) {\\n this.instruments.splice(index, 1);\\n }\\n }\\n\\n if (this.mediaLayouts) {\\n var i = this.mediaLayouts.length;\\n while (i--) {\\n if (this.mediaLayouts[i].instrumentId === instrument._id) {\\n this.mediaLayouts.splice(i, 1);\\n }\\n }\\n }\\n },\\n getFavoriteTag: function() {\\n if (this.tags) {\\n for (var i = 0; i < this.tags.length; i++) {\\n var tag = this.tags[i];\\n if (tag.tag === tagEnum.FAVORITE) {\\n return tag;\\n }\\n }\\n }\\n },\\n removeTag: function(tag) {\\n if (this.tags) {\\n var i = this.tags.length;\\n while (i--) {\\n if (this.tags[i]._id === tag._id) {\\n this.tags.splice(i, 1);\\n }\\n // Continue looping in case the user is there more than once. (shouldn't happen)\\n }\\n }\\n },\\n removeMediaDefinition: function(mediaDefinition) {\\n var i = this.mediaDefinitions.length;\\n\\n while (i--) {\\n if (this.mediaDefinitions[i]._id === mediaDefinition._id) {\\n this.mediaDefinitions.splice(i, 1);\\n }\\n }\\n\\n this.removeMediaLayoutsForMediaDefinition(mediaDefinition);\\n },\\n getMediaLayoutsForMediaDefinition: function(mediaDefinition) {\\n return this.mediaLayouts.filter(function(mediaLayout) {\\n return mediaLayout.mediaDefinitionId === mediaDefinition._id;\\n });\\n },\\n removeMediaLayoutsForMediaDefinition: function(mediaDefinition) {\\n var i = this.mediaLayouts.length;\\n\\n while (i--) {\\n if (this.mediaLayouts[i].mediaDefinitionId === mediaDefinition._id) {\\n this.mediaLayouts.splice(i, 1);\\n }\\n }\\n },\\n /**\\n * Sorts media definitions smallest to biggest.\\n * @returns {Array}\\n */\\n sortMediaDefinitions: function() {\\n return this.mediaDefinitions.sort(function(def1, def2) { return def1.width - def2.width; });\\n },\\n duplicateInstrument: function(instrument) {\\n var newInstrument = angular.copy(instrument);\\n newInstrument._id = uuid();\\n this.instruments.push(newInstrument);\\n\\n this.mediaDefinitions.forEach(function(mediaDefinition) {\\n var mediaLayouts = this.getMediaLayoutsForMediaDefinition(mediaDefinition);\\n var mediaLayout;\\n\\n for (var i = 0; i < mediaLayouts.length; i++) {\\n mediaLayout = mediaLayouts[i];\\n if (mediaLayout.instrumentId === instrument._id) {\\n break;\\n }\\n }\\n\\n var newMediaLayout = angular.copy(mediaLayout);\\n newMediaLayout._id = uuid();\\n newMediaLayout.instrumentId = newInstrument._id;\\n\\n // Adjust the instrument's position so it's offset from the original. Try to adjust it to the right if the\\n // needed space is available but if the needed space is not available and there's more space to the left then\\n // adjust it to the left.\\n\\n var rightOffsetAvailable = Math.floor(mediaDefinition.width / gridSpacing) -\\n (newMediaLayout.x + newMediaLayout.width);\\n\\n var leftOffsetAvailable = newMediaLayout.x;\\n\\n if (rightOffsetAvailable > 0 &&\\n (rightOffsetAvailable >= duplicateInstrumentOffset || rightOffsetAvailable >= leftOffsetAvailable)) {\\n newMediaLayout.x += Math.min(rightOffsetAvailable, duplicateInstrumentOffset);\\n } else if (leftOffsetAvailable > 0) {\\n newMediaLayout.x -= Math.min(leftOffsetAvailable, duplicateInstrumentOffset);\\n }\\n\\n // Media definitions don't have a defined height so there's no need to check to see if there is room\\n // to dodge. We just do it.\\n newMediaLayout.y += duplicateInstrumentOffset;\\n\\n this.mediaLayouts.push(newMediaLayout);\\n this.bringInstrumentToFront(newInstrument, mediaDefinition);\\n }.bind(this));\\n },\\n bringInstrumentToFront: function(instrument, mediaDefinition) {\\n var mediaLayouts = this.getMediaLayoutsForMediaDefinition(mediaDefinition);\\n\\n var mediaLayout;\\n\\n for (var i = 0; i < mediaLayouts.length; i++) {\\n mediaLayout = mediaLayouts[i];\\n if (mediaLayout.instrumentId === instrument._id) {\\n break;\\n }\\n }\\n\\n // Remove the zIndex from the media layout, sort all others and redefine their zIndexes if they\\n // previously had one, give the media layout the next available zIndex.\\n\\n delete mediaLayout.zIndex;\\n\\n var zIndexCursor = 1;\\n mediaLayouts.sort(function(mediaLayoutA, mediaLayoutB) {\\n if (mediaLayoutA.zIndex === undefined) {\\n return -1;\\n } else if (mediaLayoutB.zIndex === undefined) {\\n return 1;\\n } else {\\n return mediaLayoutA.zIndex - mediaLayoutB.zIndex;\\n }\\n }).forEach(function(mediaLayout, i) {\\n if (mediaLayout.zIndex !== undefined) {\\n mediaLayout.zIndex = zIndexCursor++;\\n }\\n });\\n\\n mediaLayout.zIndex = zIndexCursor;\\n },\\n /**\\n * If a new media definition were created, what width should it be? This comes up with a decent width\\n * as a starting point and the user can manipulate it from there.\\n */\\n _getNewMediaDefinitionWidth: function(baseMediaDefinition) {\\n var sortedDefinitions = this.sortMediaDefinitions();\\n var activeIndex = sortedDefinitions.indexOf(baseMediaDefinition);\\n\\n var newWidth;\\n\\n // Start by getting the midpoint between the base media definition and the next smallest.\\n if (activeIndex === 0) {\\n if (baseMediaDefinition.width === minMediaDefinitionWidth) {\\n newWidth = baseMediaDefinition.width + 100;\\n } else {\\n newWidth = baseMediaDefinition.width / 2;\\n }\\n } else {\\n var nextSmallest = sortedDefinitions[activeIndex - 1];\\n newWidth = (baseMediaDefinition.width + nextSmallest.width) / 2;\\n }\\n\\n newWidth = Math.max(minMediaDefinitionWidth, newWidth);\\n\\n // This adjustment just seems to look better. This is particularly the case if the active media definition\\n // is the smallest media definition; it looks better if the new one is just offset a ways instead of midway\\n // between the media definition and the left of the viewport. This is obviously subjective.\\n newWidth = Math.max(newWidth, baseMediaDefinition.width - 100);\\n\\n // Snap to the grid.\\n newWidth = newWidth - (newWidth % gridSpacing);\\n\\n return newWidth;\\n },\\n\\n /**\\n * Creates a media definition and adds it to the dashboard.\\n * @param {Object} baseMediaDefinition The media definition the new media definition should be based on. The\\n * new media definition's instrument layout will attempt to mimic the layout from the base media definition.\\n * @returns {Object} New media definition.\\n */\\n createMediaDefinition: function(baseMediaDefinition) {\\n var newWidth = this._getNewMediaDefinitionWidth(baseMediaDefinition);\\n\\n // Create a new media definition with its corresponding media layouts based off the base\\n // media definition.\\n var newMediaDefinition = {\\n _id: uuid(),\\n // If you change the name default, be sure to change the code that automatically updates the\\n // media definition name when it's dragged and its name is in #px format.\\n name: newWidth + 'px',\\n width: newWidth\\n };\\n\\n this.mediaDefinitions.push(newMediaDefinition);\\n\\n var mediaLayouts = angular.copy(this.getMediaLayoutsForMediaDefinition(baseMediaDefinition));\\n\\n mediaLayouts.forEach(function(mediaLayout) {\\n mediaLayout._id = uuid();\\n mediaLayout.mediaDefinitionId = newMediaDefinition._id;\\n });\\n\\n this.resampleMediaLayouts(mediaLayouts, mediaLayouts, baseMediaDefinition.width, newWidth);\\n\\n this.mediaLayouts = this.mediaLayouts.concat(mediaLayouts);\\n\\n return newMediaDefinition;\\n },\\n\\n /**\\n * Resamples media layouts to appropriately fit a new media definition width. Because resampling must snap to\\n * the dashboard grid, sampling \\\"errors\\\" will likely occur. For example, if an instrument is one grid space\\n * from the side of the dashboard before resampling, it may be touching the side of the dashboard after some\\n * resampling due to having to snap to the next grid space.\\n *\\n * When resampling repetitively like when dragging a media definition thumb, it's important that the resampling\\n * is based of the initial media definition and media layout positions so that the resampling error does\\n * not compound. For example, if the user drags the thumb to the left to make the media definition smaller and drags\\n * it back to the right to where it started and the lets go of the thumb, we want to ensure everything\\n * looks as it did when the user started dragging.\\n *\\n * @param {Array} startMediaLayouts Media layout objects representing an instrument's position and dimension when\\n * the series of resamplings started. If this is a single resample and not part of a series, these objects can\\n * be the same as endMediaLayouts.\\n * @param {Array} endMediaLayouts Media layout objects that should be resampled.\\n * @param {Number} startMediaDefinitionWidth Media definition width to resample media layouts from. If this\\n * resampling is part of a series of resamplings, this should be the width of the media definition at the beginning\\n * of the series.\\n * @param {Number} endMediaDefinitionWidth Media definition width to resample media layouts to.\\n */\\n resampleMediaLayouts: function(startMediaLayouts, endMediaLayouts, startMediaDefinitionWidth, endMediaDefinitionWidth) {\\n var resamplePercent = endMediaDefinitionWidth / startMediaDefinitionWidth;\\n\\n endMediaLayouts.forEach(function(mediaLayout, i) {\\n var startMediaLayout = startMediaLayouts[i];\\n mediaLayout.width = Math.round(startMediaLayout.width * resamplePercent);\\n mediaLayout.x = Math.round(startMediaLayout.x * resamplePercent);\\n });\\n },\\n\\n /**\\n * If the provided media definition were removed, what would be the next best media definition the user would like\\n * to see?\\n * @param mediaDefinition\\n * @returns {Object} The next best media definition.\\n */\\n getNextBestMediaDefinition: function(mediaDefinition) {\\n // sorted smallest |