From 72b56120069ea42cc10848e7926436551f85187e Mon Sep 17 00:00:00 2001 From: Vlad0n20 <137097005+Vlad0n20@users.noreply.github.com> Date: Wed, 4 Feb 2026 07:07:11 +0200 Subject: [PATCH 01/31] [ENG-10042] Fix/eng 10042 (#11551) * Update RegistrationActionSerializer * Update RegistrationActionSerializer --- api/actions/serializers.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/api/actions/serializers.py b/api/actions/serializers.py index d572ee41654..a4ab5b71d83 100644 --- a/api/actions/serializers.py +++ b/api/actions/serializers.py @@ -26,6 +26,7 @@ ) from osf.utils.workflows import ( + ApprovalStates, DefaultStates, DefaultTriggers, ReviewStates, @@ -278,6 +279,31 @@ def create(self, validated_data): comment = validated_data.pop('comment', '') user = validated_data.pop('user') + pending_schema_response_updates = target.schema_responses.filter( + reviews_state__in=[ + ApprovalStates.UNAPPROVED.db_name, + ApprovalStates.PENDING_MODERATION.db_name, + ], + previous_response__isnull=False, # Only updates, not initial submissions + ).order_by('-created') + + if pending_schema_response_updates.exists(): + pending_response = pending_schema_response_updates.first() + short_message = 'This registration has a pending update' + long_message = ( + f'This registration has a pending schema response update (ID: {pending_response._id}) ' + f'that must be moderated. Please use the schema response actions endpoint to approve or reject ' + f'the update instead of creating a registration action.' + ) + raise HTTPError( + http_status.HTTP_400_BAD_REQUEST, + data={ + 'message_short': short_message, + 'message_long': long_message, + 'schema_response_id': pending_response._id, + }, + ) + sanction = target.sanction try: From 2f8e2c94a12d504fdc8ef66924aebe8e89bdb92e Mon Sep 17 00:00:00 2001 From: mkovalua Date: Wed, 4 Feb 2026 07:07:42 +0200 Subject: [PATCH 02/31] [ENG-9805] Service Brands should be listed alphabetically, and include service type (#11543) * get default_license_id on preprint creation to handle it on FE (looks like it is not used drafts/id/metadata) for prepints in browser url so for get request is is redundant get default_license_id on draft registration creation (to get for FE after creation) and also for GET/ request to get it on drafts/id/metadata request * implement asc sorting for admin brand tab and showing brand related unique provider types --- admin/templates/brands/list.html | 4 +++- osf/models/brand.py | 13 +++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/admin/templates/brands/list.html b/admin/templates/brands/list.html index fcdc512849c..5335ff923f6 100644 --- a/admin/templates/brands/list.html +++ b/admin/templates/brands/list.html @@ -17,12 +17,14 @@

List of Brands

Name + Service - {% for brand in brands %} + {% for brand in brands|dictsort:"name" %} {{ brand.name }} + {{ brand.get_provider_types }} {% endfor %} diff --git a/osf/models/brand.py b/osf/models/brand.py index 5a857f5f3b1..fc162ea3c90 100644 --- a/osf/models/brand.py +++ b/osf/models/brand.py @@ -25,5 +25,18 @@ class Meta: secondary_color = models.CharField(max_length=7) background_color = models.CharField(max_length=7, blank=True, null=True) + def get_provider_types(self): + unique_types = self.providers.values_list('type', flat=True).distinct() + results = [] + # cast osf.collectionprovider, osf.registrationprovider, osf.preprintprovider to more readable UI format + for unique_type in unique_types: + if 'registration' in unique_type: + results.append('Registry') + elif 'collection' in unique_type: + results.append('Collection') + elif 'preprint' in unique_type: + results.append('Preprint') + return ', '.join(results) + def __str__(self): return f'{self.name} ({self.id})' From ec2869a517a1aa96da37e9dc780ba73a1c8ee32e Mon Sep 17 00:00:00 2001 From: Vlad0n20 <137097005+Vlad0n20@users.noreply.github.com> Date: Wed, 4 Feb 2026 07:14:11 +0200 Subject: [PATCH 03/31] [ENG-9122] Fix/eng 9122 (#11473) * Update share * Fix manage command --- osf/management/commands/reindex_versioned_preprints.py | 6 ------ osf/metadata/osf_gathering.py | 2 ++ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/osf/management/commands/reindex_versioned_preprints.py b/osf/management/commands/reindex_versioned_preprints.py index b48e53487e6..c588859585a 100644 --- a/osf/management/commands/reindex_versioned_preprints.py +++ b/osf/management/commands/reindex_versioned_preprints.py @@ -38,12 +38,6 @@ def reindex_versioned_preprints(dry_run=False, batch_size=100, provider_id=None, else: try: preprint.update_search() - if processed % 10 == 0: - logger.info( - f'Re-indexed preprint {preprint._id} ' - f'(version {preprint.versioned_guids.first().version if preprint.versioned_guids.exists() else "N/A"}) ' - f'[{processed}/{total_count}]' - ) except Exception as e: logger.error(f'Failed to re-index preprint {preprint._id}: {e}') diff --git a/osf/metadata/osf_gathering.py b/osf/metadata/osf_gathering.py index 91f3e0f7859..f1da7e7e39d 100644 --- a/osf/metadata/osf_gathering.py +++ b/osf/metadata/osf_gathering.py @@ -419,6 +419,8 @@ def gather_flexible_types(focus): def gather_created(focus): if focus.rdftype == OSF.Registration: yield (DCTERMS.created, getattr(focus.dbmodel, 'registered_date', None)) + elif focus.rdftype == OSF.Preprint: + yield (DCTERMS.created, focus.dbmodel.date_created_first_version) else: yield (DCTERMS.created, getattr(focus.dbmodel, 'created', None)) From bbdf6082de2b862cb4594d1231c24db6e609e886 Mon Sep 17 00:00:00 2001 From: antkryt Date: Wed, 4 Feb 2026 12:13:32 +0200 Subject: [PATCH 04/31] [ENG-9157] Add atomic ability to remove contributors from children projects in API (#11425) * add include_children to delete contributors * atomic contributor remove; add tests * remove from children only for nodes * fix tests --------- Co-authored-by: Yuhuai Liu --- api/nodes/views.py | 33 ++++++++++---- ...t_draft_registration_contributor_detail.py | 26 +++++++++++ .../views/test_node_contributors_detail.py | 43 +++++++++++++++++++ 3 files changed, 94 insertions(+), 8 deletions(-) diff --git a/api/nodes/views.py b/api/nodes/views.py index 3908d5406a3..51332fea7c4 100644 --- a/api/nodes/views.py +++ b/api/nodes/views.py @@ -9,7 +9,8 @@ from osf import features from packaging.version import Version from django.apps import apps -from django.db.models import F, Max, Q, Subquery +from django.db.models import F, Max, Q, Subquery, Exists, OuterRef +from django.db import transaction from django.utils import timezone from django.contrib.contenttypes.models import ContentType from rest_framework import generics, permissions as drf_permissions, exceptions @@ -155,6 +156,7 @@ CedarMetadataRecord, Preprint, Collection, + Contributor, NotificationType, ) from addons.osfstorage.models import Region @@ -551,13 +553,28 @@ def perform_destroy(self, instance): auth = get_user_auth(self.request) if node.visible_contributors.count() == 1 and instance.visible: raise ValidationError('Must have at least one visible contributor') - removed = node.remove_contributor(instance, auth) - if not removed: - raise ValidationError('Must have at least one registered admin contributor') - propagate = self.request.query_params.get('propagate_to_children') == 'true' - if propagate: - for child_node in node.get_nodes(_contributors__in=[instance.user]): - child_node.remove_contributor(instance, auth) + + include_children = is_truthy(self.request.query_params.get('include_children', False)) + + if include_children and isinstance(node, Node): + hierarchy = Node.objects.get_children(node, active=True, include_root=True) + targets = hierarchy.filter( + Exists( + Contributor.objects.filter( + node=OuterRef('pk'), + user=instance.user, + ), + ), + ) + with transaction.atomic(): + for descendant in targets: + removed = descendant.remove_contributor(instance, auth) + if not removed: + raise ValidationError(f'{descendant._id} must have at least one registered admin contributor') + else: + removed = node.remove_contributor(instance, auth) + if not removed: + raise ValidationError('Must have at least one registered admin contributor') class NodeImplicitContributorsList(JSONAPIBaseView, generics.ListAPIView, ListFilterMixin, NodeMixin): diff --git a/api_tests/draft_registrations/views/test_draft_registration_contributor_detail.py b/api_tests/draft_registrations/views/test_draft_registration_contributor_detail.py index 0c2dce3501b..ff7907c85fc 100644 --- a/api_tests/draft_registrations/views/test_draft_registration_contributor_detail.py +++ b/api_tests/draft_registrations/views/test_draft_registration_contributor_detail.py @@ -8,12 +8,14 @@ ) from api_tests.nodes.views.test_node_contributors_detail_ordering import TestNodeContributorOrdering from api_tests.nodes.views.test_node_contributors_detail_update import TestNodeContributorUpdate +from api_tests.utils import disconnected_from_listeners from osf_tests.factories import ( DraftRegistrationFactory, ProjectFactory, AuthUserFactory ) from osf.utils import permissions +from website.project.signals import contributor_removed @pytest.fixture() @@ -251,6 +253,30 @@ def url_user_non_contrib(self, project, user_non_contrib): return '/{}draft_registrations/{}/contributors/{}/'.format( API_BASE, project._id, user_non_contrib._id) + def test_remove_contributor_include_children_removes_descendants(self, app, user, user_write_contrib, project): + assert user_write_contrib in project.contributors + + url = f'/{API_BASE}draft_registrations/{project._id}/contributors/{user_write_contrib._id}/?include_children=true' + with disconnected_from_listeners(contributor_removed): + res = app.delete(url, auth=user.auth) + assert res.status_code == 204 + + project.reload() + assert user_write_contrib not in project.contributors + + def test_remove_contributor_include_children_is_atomic_on_violation(self, app, user, user_write_contrib, project): + assert user_write_contrib in project.contributors + + # Draft registrations don't have children, so include_children parameter is ignored + # The contributor should be removed successfully since there are no children to cause violations + url = f'/{API_BASE}draft_registrations/{project._id}/contributors/{user_write_contrib._id}/?include_children=true' + with disconnected_from_listeners(contributor_removed): + res = app.delete(url, auth=user.auth) + assert res.status_code == 204 + + project.reload() + assert user_write_contrib not in project.contributors + @pytest.mark.django_db class TestDraftBibliographicContributorDetail(): diff --git a/api_tests/nodes/views/test_node_contributors_detail.py b/api_tests/nodes/views/test_node_contributors_detail.py index 5dc600279ba..54487511681 100644 --- a/api_tests/nodes/views/test_node_contributors_detail.py +++ b/api_tests/nodes/views/test_node_contributors_detail.py @@ -457,3 +457,46 @@ def test_can_remove_self_as_contributor_not_unique_admin(self, app, user_write_c ) assert res.status_code == 204 assert user_write_contrib not in project.contributors + + def test_remove_contributor_include_children_removes_descendants(self, app, user, user_write_contrib, project): + child1 = ProjectFactory(parent=project, creator=user) + child2 = ProjectFactory(parent=project, creator=user) + child1.add_contributor(user_write_contrib, permissions=permissions.WRITE, visible=True, save=True) + child2.add_contributor(user_write_contrib, permissions=permissions.WRITE, visible=True, save=True) + + assert user_write_contrib in project.contributors + assert user_write_contrib in child1.contributors + assert user_write_contrib in child2.contributors + + url = f'/{API_BASE}nodes/{project._id}/contributors/{user_write_contrib._id}/?include_children=true' + with disconnected_from_listeners(contributor_removed): + res = app.delete(url, auth=user.auth) + assert res.status_code == 204 + + project.reload() + child1.reload() + child2.reload() + + assert user_write_contrib not in project.contributors + assert user_write_contrib not in child1.contributors + assert user_write_contrib not in child2.contributors + + def test_remove_contributor_include_children_is_atomic_on_violation(self, app, user, user_write_contrib, project): + child = ProjectFactory(parent=project, creator=user) + child.add_contributor(user_write_contrib, permissions=permissions.ADMIN, visible=True, save=True) + child.set_permissions(user, permissions.READ, save=True) + + assert user_write_contrib in project.contributors + assert user_write_contrib in child.contributors + + url = f'/{API_BASE}nodes/{project._id}/contributors/{user_write_contrib._id}/?include_children=true' + with disconnected_from_listeners(contributor_removed): + res = app.delete(url, auth=user.auth, expect_errors=True) + + assert res.status_code == 400 + + project.reload() + child.reload() + + assert user_write_contrib in project.contributors + assert user_write_contrib in child.contributors From b1984270eab3b7db6066f6aa7e6299dbeaaa2286 Mon Sep 17 00:00:00 2001 From: ihorsokhanexoft Date: Wed, 4 Feb 2026 12:16:17 +0200 Subject: [PATCH 05/31] [ENG-8526] Fixed write contributor permissions on affiliation actions (#11397) * fixed affiliation update for write contributors in registrations * removed redundant blank line * fixed tests * fixed tests * fixed a test * don't expect errors in tests --- api/nodes/permissions.py | 16 ++++++++ api/registrations/views.py | 3 +- ..._registration_relationship_institutions.py | 40 ++++++++++++++----- 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/api/nodes/permissions.py b/api/nodes/permissions.py index 5fc16f6cf16..e7d2b773280 100644 --- a/api/nodes/permissions.py +++ b/api/nodes/permissions.py @@ -127,6 +127,22 @@ def has_object_permission(self, request, view, obj): return obj.has_permission(auth.user, osf_permissions.WRITE) +class AdminOrWriteContributor(permissions.BasePermission): + acceptable_models = (AbstractNode, OSFUser, Institution, BaseAddonSettings, DraftRegistration) + + def has_object_permission(self, request, view, obj): + if isinstance(obj, dict) and 'self' in obj: + obj = obj['self'] + + assert_resource_type(obj, self.acceptable_models) + auth = get_user_auth(request) + + if request.method in permissions.SAFE_METHODS: + return obj.is_public or obj.can_view(auth) + + return obj.has_permission(auth.user, osf_permissions.ADMIN) or obj.has_permission(auth.user, osf_permissions.WRITE) + + class AdminOrPublic(permissions.BasePermission): acceptable_models = (AbstractNode, OSFUser, Institution, BaseAddonSettings, DraftRegistration) diff --git a/api/registrations/views.py b/api/registrations/views.py index 368348c05f9..caab1e134de 100644 --- a/api/registrations/views.py +++ b/api/registrations/views.py @@ -59,6 +59,7 @@ AdminOrPublic, ExcludeWithdrawals, NodeLinksShowIfVersion, + AdminOrWriteContributor, ) from api.registrations.permissions import ContributorOrModerator, ContributorOrModeratorOrPublic from api.registrations.serializers import ( @@ -696,7 +697,7 @@ class RegistrationInstitutionsRelationship(NodeInstitutionsRelationship, Registr permission_classes = ( drf_permissions.IsAuthenticatedOrReadOnly, base_permissions.TokenHasScope, - AdminOrPublic, + AdminOrWriteContributor, ) diff --git a/api_tests/registrations/views/test_registration_relationship_institutions.py b/api_tests/registrations/views/test_registration_relationship_institutions.py index 033d59af697..3ee6f8c0486 100644 --- a/api_tests/registrations/views/test_registration_relationship_institutions.py +++ b/api_tests/registrations/views/test_registration_relationship_institutions.py @@ -43,11 +43,11 @@ def resource_factory(self): return RegistrationFactory # test override, write contribs can't update institution - def test_put_not_admin_but_affiliated(self, app, institution_one, node, node_institutions_url): + def test_put_not_admin_but_affiliated_read_permission(self, app, institution_one, node, node_institutions_url): user = AuthUserFactory() user.add_or_update_affiliated_institution(institution_one) user.save() - node.add_contributor(user) + node.add_contributor(user, permissions=permissions.READ) node.save() res = app.put_json_api( @@ -61,7 +61,25 @@ def test_put_not_admin_but_affiliated(self, app, institution_one, node, node_ins assert res.status_code == 403 assert institution_one not in node.affiliated_institutions.all() - # test override, write contribs cannot delete + def test_put_not_admin_but_affiliated_and_write_permission(self, app, institution_one, node, node_institutions_url): + user = AuthUserFactory() + user.add_or_update_affiliated_institution(institution_one) + user.save() + node.add_contributor(user) + node.save() + + res = app.put_json_api( + node_institutions_url, + self.create_payload([institution_one]), + expect_errors=False, + auth=user.auth + ) + + node.reload() + assert res.status_code == 200 + assert institution_one in node.affiliated_institutions.all() + + # test override, write contribs can delete def test_delete_user_is_read_write(self, app, institution_one, node, node_institutions_url): user = AuthUserFactory() user.add_or_update_affiliated_institution(institution_one) @@ -74,10 +92,10 @@ def test_delete_user_is_read_write(self, app, institution_one, node, node_instit node_institutions_url, self.create_payload([institution_one]), auth=user.auth, - expect_errors=True + expect_errors=False ) - assert res.status_code == 403 + assert res.status_code == 204 def test_read_write_contributor_can_add_affiliated_institution( self, app, write_contrib, write_contrib_institution, node, node_institutions_url): @@ -92,10 +110,10 @@ def test_read_write_contributor_can_add_affiliated_institution( ] }, auth=write_contrib.auth, - expect_errors=True + expect_errors=False ) - assert res.status_code == 403 - assert write_contrib_institution not in node.affiliated_institutions.all() + assert res.status_code == 201 + assert write_contrib_institution in node.affiliated_institutions.all() def test_read_write_contributor_can_remove_affiliated_institution( self, app, write_contrib, write_contrib_institution, node, node_institutions_url): @@ -112,10 +130,10 @@ def test_read_write_contributor_can_remove_affiliated_institution( ] }, auth=write_contrib.auth, - expect_errors=True + expect_errors=False ) - assert res.status_code == 403 - assert write_contrib_institution in node.affiliated_institutions.all() + assert res.status_code == 204 + assert write_contrib_institution not in node.affiliated_institutions.all() def test_user_with_institution_and_permissions_through_patch(self, app, user, institution_one, institution_two, node, node_institutions_url): From 41f5d7c9cb7a29690733b0f2c322190ffd02bd21 Mon Sep 17 00:00:00 2001 From: mkovalua Date: Wed, 4 Feb 2026 12:23:48 +0200 Subject: [PATCH 06/31] [ENG-9198] Do not show page not found for preprint pending moderation (#11567) * if preprint is pending moderation show it for not contributors/moderators/Logged-out users using /pending-moderation redirection on access * update testcases to be it compatable with 'This preprint is pending moderation and is not yet publicly available.' logic * test update * test update * test update --- api/preprints/views.py | 11 +++++++---- .../preprints/views/test_preprint_detail_reviews.py | 4 ++-- api_tests/preprints/views/test_preprint_list.py | 11 +++++++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/api/preprints/views.py b/api/preprints/views.py index 38bcce4c3f1..27986428958 100644 --- a/api/preprints/views.py +++ b/api/preprints/views.py @@ -135,10 +135,6 @@ def get_preprint(self, check_object_permissions=True, ignore_404=False): sentry.log_message(f'Preprint deleted: [guid={base_guid_id}, version={preprint_version}]') raise NotFound - # May raise a permission denied - if check_object_permissions: - self.check_object_permissions(self.request, preprint) - user = self.request.user if isinstance(user, AnonymousUser): user_is_reviewer = user_is_contributor = False @@ -162,8 +158,15 @@ def get_preprint(self, check_object_permissions=True, ignore_404=False): raise PermissionDenied( detail='This preprint is pending moderation and is not yet publicly available.', ) + # May raise a permission denied + if check_object_permissions: + self.check_object_permissions(self.request, preprint) raise NotFound + # May raise a permission denied + if check_object_permissions: + self.check_object_permissions(self.request, preprint) + return preprint class PreprintList(PreprintMetricsViewMixin, JSONAPIBaseView, generics.ListCreateAPIView, PreprintFilterMixin): diff --git a/api_tests/preprints/views/test_preprint_detail_reviews.py b/api_tests/preprints/views/test_preprint_detail_reviews.py index 474a858d2b9..66d27329a33 100644 --- a/api_tests/preprints/views/test_preprint_detail_reviews.py +++ b/api_tests/preprints/views/test_preprint_detail_reviews.py @@ -120,7 +120,7 @@ def test_reviews_preprint_is_published_detail( # test_unpublished_invisible_to_public res = app.get(unpublished_url, expect_errors=True) - assert res.status_code == 401 + assert res.status_code == 403 def test_reviews_preprint_initial_detail( self, app, admin, write_contrib, non_contrib, @@ -167,4 +167,4 @@ def test_reviews_preprint_is_public_detail( # test_private_invisible_to_public res = app.get(private_url, expect_errors=True) - assert res.status_code == 401 + assert res.status_code == 403 diff --git a/api_tests/preprints/views/test_preprint_list.py b/api_tests/preprints/views/test_preprint_list.py index df180a3ce69..3208c397893 100644 --- a/api_tests/preprints/views/test_preprint_list.py +++ b/api_tests/preprints/views/test_preprint_list.py @@ -998,6 +998,17 @@ def test_unpublished_visible_to_write_contribs( res = app.get(detail_url, auth=user_write_contrib.auth, expect_errors=True) assert res.json['data']['id'] == preprint_unpublished._id + def test_unpublished_invisible_to_public( + self, app, preprint_unpublished, preprint_published, + list_url, detail_url): + res = app.get(list_url) + assert len(res.json['data']) == 1 + assert preprint_unpublished._id not in [ + d['id'] for d in res.json['data']] + + res = app.get(detail_url, expect_errors=True) + assert res.status_code == 403 + class TestPreprintIsValidList(PreprintIsValidListMixin): From 0e3a36cd119f16979a465f8ae663aa58b76972d2 Mon Sep 17 00:00:00 2001 From: mkovalua Date: Wed, 4 Feb 2026 12:29:00 +0200 Subject: [PATCH 07/31] [ENG-9043] get default_license_id on preprint creation to handle it on FE (looks like it is not used drafts/id/metadata) for prepints in browser url so for get request is is redundant (#11464) get default_license_id on draft registration creation (to get for FE after creation) and also for GET/ request to get it on drafts/id/metadata request --- api/draft_registrations/serializers.py | 3 +++ api/preprints/serializers.py | 1 + 2 files changed, 4 insertions(+) diff --git a/api/draft_registrations/serializers.py b/api/draft_registrations/serializers.py index dbb761d0df1..f08426d32a7 100644 --- a/api/draft_registrations/serializers.py +++ b/api/draft_registrations/serializers.py @@ -98,6 +98,7 @@ class DraftRegistrationSerializer(DraftRegistrationLegacySerializer, Taxonomizab ) has_project = ser.SerializerMethodField() + default_license_id = ser.CharField(source='provider.default_license._id', read_only=True, default='') def get_has_project(self, obj): return obj.has_project @@ -164,6 +165,8 @@ class DraftRegistrationDetailSerializer(DraftRegistrationSerializer, DraftRegist 'self': 'get_self_url', }) + default_license_id = ser.CharField(source='provider.default_license._id', read_only=True, default='') + def get_self_url(self, obj): return absolute_reverse( 'draft_registrations:draft-registration-detail', diff --git a/api/preprints/serializers.py b/api/preprints/serializers.py index 5afa20e8413..82223d4e2ae 100644 --- a/api/preprints/serializers.py +++ b/api/preprints/serializers.py @@ -256,6 +256,7 @@ class PreprintSerializer(TaxonomizableSerializerMixin, MetricsSerializerMixin, J why_no_prereg = ser.CharField(required=False, allow_blank=True, allow_null=True) prereg_links = ser.ListField(child=ser.URLField(), required=False) prereg_link_info = ser.ChoiceField(Preprint.PREREG_LINK_INFO_CHOICES, required=False, allow_blank=True) + default_license_id = ser.CharField(source='provider.default_license._id', read_only=True, default='') class Meta: type_ = 'preprints' From 638cac004f10304ebcc41abecd3decfe4286a721 Mon Sep 17 00:00:00 2001 From: antkryt Date: Wed, 11 Feb 2026 18:20:04 +0200 Subject: [PATCH 08/31] [ENG-9596] Server slowdown when adding many contributors (#11420) * add list_serializer_class for NodeContributorsCreateSerializer; minor optimization * add bulk add_contributor_registered_or_not method * Use DRY for NodeContributorsBulkCreateListSerializer * fix changes after notification refactor * add default email_preferences to NodeContributorsBulkCreateListSerializer --- api/base/serializers.py | 5 ++ api/nodes/serializers.py | 81 ++++++++++++++++++++++++++++-- osf/models/mixins.py | 105 ++++++++++++++++++++++++++++++++------- osf/utils/permissions.py | 4 ++ 4 files changed, 171 insertions(+), 24 deletions(-) diff --git a/api/base/serializers.py b/api/base/serializers.py index b02450f2e12..d5b2c15a95e 100644 --- a/api/base/serializers.py +++ b/api/base/serializers.py @@ -1456,6 +1456,11 @@ class JSONAPISerializer(BaseAPISerializer): @classmethod def many_init(cls, *args, **kwargs): kwargs['child'] = cls(*args, **kwargs) + # Use DRF list_serializer_class if it exists, otherwise use default JSONAPIListSerializer + meta = getattr(cls, 'Meta', None) + list_cls = getattr(meta, 'list_serializer_class', None) + if list_cls: + return list_cls(*args, **kwargs) return JSONAPIListSerializer(*args, **kwargs) def invalid_embeds(self, fields, embeds): diff --git a/api/nodes/serializers.py b/api/nodes/serializers.py index d2bf161043f..51e614bcdd9 100644 --- a/api/nodes/serializers.py +++ b/api/nodes/serializers.py @@ -1,3 +1,5 @@ +import functools + from django.db import connection from packaging.version import Version @@ -7,7 +9,7 @@ ) from api.base.serializers import ( VersionedDateTimeField, HideIfRegistration, IDField, - JSONAPISerializer, LinksField, + JSONAPISerializer, JSONAPIListSerializer, LinksField, NodeFileHyperLinkField, RelationshipField, ShowIfVersion, TargetTypeField, TypeField, WaterbutlerLink, BaseAPISerializer, @@ -38,7 +40,7 @@ Comment, DraftRegistration, ExternalAccount, RegistrationSchema, AbstractNode, PrivateLink, Preprint, RegistrationProvider, NodeLicense, DraftNode, - Registration, Node, + Registration, Node, OSFUser, ) from website.project import new_private_link from website.project.model import NodeUpdateError @@ -1219,6 +1221,75 @@ def get_unregistered_contributor(self, obj): return unclaimed_records.get('name', None) +class NodeContributorsBulkCreateListSerializer(JSONAPIListSerializer): + + email_preferences = ['default', 'false'] + + def _parse_payload_item(self, item, user_map): + uid = item.get('_id') + user = user_map.get(uid) + email = item.get('user', {}).get('email', None) + full_name = item.get('full_name') or (user.fullname if user and not user.is_registered else None) + if not uid and not full_name: + raise exceptions.ValidationError(detail='A user ID or full name must be provided to add a contributor.') + + email_pref = self.context['request'].GET.get('send_email') or self.context['default_email'] + if email_pref not in self.email_preferences: + raise exceptions.ValidationError(f'{email_pref} is not a valid email preference.') + + return { + 'user_id': uid, + 'user': user, + 'email': email, + 'full_name': full_name, + 'notification_type': False if email_pref == 'false' else None, + 'permissions': osf_permissions.get_contributor_proposed_permissions(item), + 'bibliographic': item.get('bibliographic'), + 'index': item.get('_order') if '_order' in item else None, + } + + def _add_contributors_to_node(self, node, payload, auth): + try: + return node.add_contributors_registered_or_not(payload, auth=auth, save=True) + except ValidationError as e: + raise exceptions.ValidationError(detail=e.messages[0]) + except ValueError as e: + raise exceptions.NotFound(detail=e.args[0]) + + def create(self, validated_data): + request = self.context['request'] + node = self.context['resource'] + auth = Auth(request.user) + + # Preload users once and pass through to the bulk method (also reused for children) + user_ids = {item.get('_id') for item in validated_data if item.get('_id')} + user_map = {} + if user_ids: + for u in OSFUser.objects.filter(guids___id__in=user_ids): + user_map[u._id] = u + + _parse_payload_item = functools.partial(self._parse_payload_item, user_map=user_map) + + payload = list(map(_parse_payload_item, validated_data)) + contribs = self._add_contributors_to_node(node, payload, auth) + + child_to_items = {} + for item in validated_data: + child_nodes = item.get('child_nodes') + if child_nodes: + for child_id in child_nodes: + child_to_items.setdefault(child_id, []).append(item) + + for child_id, items in child_to_items.items(): + child = AbstractNode.load(child_id) + if not child: + continue + child_payload = list(map(_parse_payload_item, items)) + self._add_contributors_to_node(child, child_payload, auth) + + return contribs + + class NodeContributorsCreateSerializer(NodeContributorsSerializer): """ Overrides NodeContributorsSerializer to add email, full_name, send_email, and non-required index and users field. @@ -1239,8 +1310,8 @@ class NodeContributorsCreateSerializer(NodeContributorsSerializer): email_preferences = ['default', 'false'] - def get_proposed_permissions(self, validated_data): - return validated_data.get('permission') or osf_permissions.DEFAULT_CONTRIBUTOR_PERMISSIONS + class Meta(NodeContributorsSerializer.Meta): + list_serializer_class = NodeContributorsBulkCreateListSerializer def validate_data(self, resource, user_id=None, full_name=None, email=None, index=None, child_nodes=None): if not user_id and not full_name: @@ -1263,7 +1334,7 @@ def create(self, validated_data): email_pref = self.context['request'].GET.get('send_email') or self.context['default_email'] child_nodes = validated_data.get('child_nodes') - permissions = self.get_proposed_permissions(validated_data) + permissions = osf_permissions.get_contributor_proposed_permissions(validated_data) self.validate_data(resource, user_id=user_id, full_name=full_name, email=email, index=index, child_nodes=child_nodes) if email_pref not in self.email_preferences: diff --git a/osf/models/mixins.py b/osf/models/mixins.py index 2604b7d32cb..b7ae467f99c 100644 --- a/osf/models/mixins.py +++ b/osf/models/mixins.py @@ -1457,7 +1457,7 @@ def add_contributor( # Add default contributor permissions permissions = permissions or self.DEFAULT_CONTRIBUTOR_PERMISSIONS - self.add_permission(contrib_to_add, permissions, save=True) + self.add_permission(contrib_to_add, permissions, save=False) if make_curator: contributor_obj.is_curator = True contributor_obj.save() @@ -1514,6 +1514,7 @@ def add_contributors( :param log: Add log to self :param save: Save after adding contributor """ + users = [] for contrib in contributors: self.add_contributor( contributor=contrib['user'], @@ -1524,6 +1525,7 @@ def add_contributors( save=False, notification_type=notification_type ) + users.append(contrib['user']) if log and contributors: params = self.log_params params['contributors'] = [ @@ -1539,6 +1541,8 @@ def add_contributors( if save: self.save() + return self.contributor_set.filter(user__in=users) + def add_unregistered_contributor( self, fullname, @@ -1547,7 +1551,9 @@ def add_unregistered_contributor( notification_type=False, visible=True, permissions=None, - existing_user=None + existing_user=None, + save=True, + log=True, ): """Add a non-registered contributor to the project. @@ -1612,25 +1618,31 @@ def add_unregistered_contributor( auth=auth, visible=visible, notification_type=notification_type, - log=True, - save=False + log=log, + save=False, ) self._add_related_source_tags(contributor) - self.save() + if save: + self.save() return contributor - def add_contributor_registered_or_not(self, - auth, - user_id=None, - full_name=None, - email=None, - notification_type=False, - permissions=None, - bibliographic=True, - index=None): + def add_contributor_registered_or_not( + self, + auth, + user_id=None, + full_name=None, + email=None, + notification_type=False, + permissions=None, + bibliographic=True, + index=None, + user=None, + save=True, + log=True, + ): OSFUser = apps.get_model('osf.OSFUser') if user_id: - contributor = OSFUser.load(user_id) + contributor = user or OSFUser.load(user_id) if not contributor: raise ValueError(f'User with id {user_id} was not found.') @@ -1644,7 +1656,8 @@ def add_contributor_registered_or_not(self, visible=bibliographic, permissions=permissions, notification_type=notification_type, - save=True + save=save, + log=log ) else: if not full_name: @@ -1660,6 +1673,8 @@ def add_contributor_registered_or_not(self, permissions=permissions, visible=bibliographic, existing_user=contributor, + save=save, + log=log, ) else: @@ -1674,7 +1689,8 @@ def add_contributor_registered_or_not(self, visible=bibliographic, notification_type=notification_type, permissions=permissions, - save=True + save=save, + log=log, ) else: contributor = self.add_unregistered_contributor( @@ -1683,18 +1699,69 @@ def add_contributor_registered_or_not(self, auth=auth, notification_type=notification_type, permissions=permissions, - visible=bibliographic + visible=bibliographic, + save=save, + log=log, ) auth.user.email_last_sent = timezone.now() auth.user.save() if index is not None: - self.move_contributor(contributor=contributor, index=index, auth=auth, save=True) + self.move_contributor(contributor=contributor, index=index, auth=auth, save=save) contributor_obj = self.contributor_set.get(user=contributor) return contributor_obj + def add_contributors_registered_or_not(self, contributors, auth=None, log=True, save=False): + """Add multiple contributors using the unified registered-or-not path. + + Each item should be a dictionary with keys compatible with + `add_contributor_registered_or_not`, e.g.: + { + 'user_id': '', + 'user': '' or None, + 'email': '' or None, + 'full_name': '' or None, + 'notification_type': '' or None, + 'permissions': , + 'bibliographic': , + 'index': , + } + """ + results = [] + + for item in contributors: + contributor_obj = self.add_contributor_registered_or_not( + auth=auth, + user_id=item.get('user_id'), + user=item.get('user'), + full_name=item.get('full_name'), + email=item.get('email'), + notification_type=item.get('notification_type'), + permissions=item.get('permissions'), + bibliographic=item.get('bibliographic', True), + index=item.get('index'), + save=False, + log=False, + ) + results.append(contributor_obj) + + if log and results: + params = self.log_params + params['contributors'] = [c.user._id for c in results] + self.add_log( + action=self.log_class.CONTRIB_ADDED, + params=params, + auth=auth, + save=False, + ) + + if save: + self.save() + + return results + def replace_contributor(self, old, new): """ Replacing unregistered contributor with a verified user diff --git a/osf/utils/permissions.py b/osf/utils/permissions.py index 76b656856fa..15ec2595a46 100644 --- a/osf/utils/permissions.py +++ b/osf/utils/permissions.py @@ -72,3 +72,7 @@ def check_private_key_for_anonymized_link(private_key): except PrivateLink.DoesNotExist: return False return link.anonymous + + +def get_contributor_proposed_permissions(validated_data): + return validated_data.get('permission') or DEFAULT_CONTRIBUTOR_PERMISSIONS From 86fc6ae99caebaa924ec3d560047d969f910042e Mon Sep 17 00:00:00 2001 From: mkovalua Date: Wed, 11 Feb 2026 18:20:51 +0200 Subject: [PATCH 09/31] [ENG-9043] get provider default license id in serializer (#11583) --- api/providers/serializers.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/api/providers/serializers.py b/api/providers/serializers.py index ffc9097e2e3..17b77346ced 100644 --- a/api/providers/serializers.py +++ b/api/providers/serializers.py @@ -138,6 +138,11 @@ class Meta: 'name', ]) + default_license_id = ser.SerializerMethodField(read_only=True) + + def get_default_license_id(self, obj): + return obj.default_license._id if obj.default_license else None + class RegistrationProviderSerializer(ProviderSerializer): class Meta: type_ = 'registration-providers' From bc872ac3ccc7042eb3a88e6daed73be96ab928ec Mon Sep 17 00:00:00 2001 From: antkryt Date: Wed, 11 Feb 2026 18:28:02 +0200 Subject: [PATCH 10/31] [ENG-9002] Unable to GDPR delete users with Registrations or Preprints (#11568) * update gdpr delete logic * fix test; better error handling --- admin/users/views.py | 24 ++++++++++----- osf/models/user.py | 69 ++++++++++++++---------------------------- osf_tests/test_user.py | 55 ++++++++++++++++++++++++++++----- 3 files changed, 85 insertions(+), 63 deletions(-) diff --git a/admin/users/views.py b/admin/users/views.py index 1584c78158e..814cc2327d5 100644 --- a/admin/users/views.py +++ b/admin/users/views.py @@ -216,17 +216,25 @@ def post(self, request, *args, **kwargs): user = self.get_object() user.gdpr_delete() user.save() - messages.success(request, f'User {user._id} was successfully GDPR deleted') - update_admin_log( - user_id=self.request.user.id, - object_id=user.pk, - object_repr='User', - message=f'User {user._id} was successfully GDPR deleted', - action_flag=USER_GDPR_DELETED - ) except UserStateError as e: messages.warning(request, str(e)) + messages.success(request, f'User {user._id} was successfully GDPR deleted') + + # Update SHARE for all public resources + for node in user.nodes.filter(is_public=True, is_deleted=False): + node.update_search() + for preprint in user.preprints.filter(is_public=True, deleted__isnull=True): + preprint.update_search() + + update_admin_log( + user_id=self.request.user.id, + object_id=user.pk, + object_repr='User', + message=f'User {user._id} was successfully GDPR deleted', + action_flag=USER_GDPR_DELETED + ) + return redirect(self.get_success_url()) diff --git a/osf/models/user.py b/osf/models/user.py index ecf720739d9..d80b06fba2c 100644 --- a/osf/models/user.py +++ b/osf/models/user.py @@ -18,6 +18,7 @@ from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager from django.contrib.auth.hashers import check_password from django.contrib.auth.models import PermissionsMixin +from django.core.exceptions import FieldDoesNotExist from django.dispatch import receiver from django.db import models from django.db.models import Count, Exists, OuterRef @@ -2020,14 +2021,12 @@ def gdpr_delete(self): """ Complies with GDPR guidelines by disabling the account and removing identifying information. """ - - # Check if user has something intentionally public, like preprints or registrations - self._validate_no_public_entities() - - # Check if user has any non-registration AbstractNodes or DraftRegistrations that they might still share with - # other contributors self._validate_and_remove_resource_for_gdpr_delete( - self.nodes.exclude(type='osf.registration'), # Includes DraftNodes and other typed nodes + self.nodes.all(), + hard_delete=False + ) + self._validate_and_remove_resource_for_gdpr_delete( + self.preprints.all(), hard_delete=False ) self._validate_and_remove_resource_for_gdpr_delete( @@ -2038,39 +2037,6 @@ def gdpr_delete(self): # Finally delete the user's info. self._clear_identifying_information() - def _validate_no_public_entities(self): - """ - Ensure that the user doesn't have any public facing resources like Registrations or Preprints - that would be left with other contributors after this deletion. - - Allow GDPR deletion if the user is the sole contributor on a public Registration or Preprint. - """ - from osf.models import Preprint, AbstractNode - - registrations_with_others = AbstractNode.objects.annotate( - contrib_count=Count('_contributors', distinct=True), - ).filter( - _contributors=self, - deleted__isnull=True, - type='osf.registration', - contrib_count__gt=1 - ).exists() - - if registrations_with_others: - raise UserStateError('You cannot delete this user because they have one or more registrations.') - - preprints_with_others = Preprint.objects.annotate( - contrib_count=Count('_contributors', distinct=True), - ).filter( - _contributors=self, - ever_public=True, - deleted__isnull=True, - contrib_count__gt=1 - ).exists() - - if preprints_with_others: - raise UserStateError('You cannot delete this user because they have one or more preprints.') - def _validate_and_remove_resource_for_gdpr_delete(self, resources, hard_delete): """ This method ensures a user's resources are properly deleted of using during GDPR delete request. @@ -2095,18 +2061,23 @@ def _validate_and_remove_resource_for_gdpr_delete(self, resources, hard_delete): ) shared_resources = resources.exclude(id__in=personal_resources.values_list('id')) - for node in shared_resources: - self._validate_admin_status_for_gdpr_delete(node) - self._validate_addons_for_gdpr_delete(node) + for resource in shared_resources: + self._validate_admin_status_for_gdpr_delete(resource) + self._validate_addons_for_gdpr_delete(resource) for resource in shared_resources.all(): logger.info(f'Removing {self._id} as a contributor to {resource.__class__.__name__} (pk:{resource.pk})...') resource.remove_contributor(self, auth=Auth(self), log=False) + if getattr(resource, 'is_public', False) and hasattr(resource, 'update_search'): + resource.update_search() - # Delete all personal entities (excluding public registrations) + # Delete all personal non-public entities personal_to_delete = personal_resources - if hasattr(model, 'is_public') and hasattr(model, 'type'): - personal_to_delete = personal_to_delete.exclude(is_public=True, type='osf.registration') + try: + if model._meta.get_field('is_public'): + personal_to_delete = personal_to_delete.exclude(is_public=True) + except FieldDoesNotExist: + pass for entity in personal_to_delete.all(): if hard_delete: @@ -2114,7 +2085,11 @@ def _validate_and_remove_resource_for_gdpr_delete(self, resources, hard_delete): entity.delete() else: logger.info(f'Soft-deleting {entity.__class__.__name__} (pk: {entity.pk})...') - entity.remove_node(auth=Auth(self)) + if hasattr(entity, 'remove_node'): + entity.remove_node(auth=Auth(self)) + else: + entity.is_deleted = True + entity.save() def _clear_identifying_information(self): ''' diff --git a/osf_tests/test_user.py b/osf_tests/test_user.py index a2fc5b0e92a..97d20db65d7 100644 --- a/osf_tests/test_user.py +++ b/osf_tests/test_user.py @@ -2143,6 +2143,37 @@ def project_user_is_only_admin(self, user): project.save() return project + @mock.patch('osf.models.node.AbstractNode.update_search') + def test_gdpr_delete_triggers_share_update_for_public_shared_nodes( + self, mock_update_search, user, project_with_two_admins): + project_with_two_admins.is_public = True + project_with_two_admins.save() + + user.gdpr_delete() + + assert mock_update_search.called + + @mock.patch('osf.models.node.AbstractNode.update_search') + def test_gdpr_delete_does_not_trigger_share_update_for_non_public_shared_nodes( + self, mock_update_search, user, project_with_two_admins): + assert project_with_two_admins.is_public is False + + user.gdpr_delete() + + assert not mock_update_search.called + + @mock.patch('osf.models.preprint.Preprint.update_search') + def test_gdpr_delete_triggers_share_update_for_public_shared_preprints( + self, mock_update_search, user, preprint): + other_user = AuthUserFactory() + preprint.add_contributor(other_user, auth=Auth(user), permissions='admin') + preprint.save() + assert preprint.is_public is True + + user.gdpr_delete() + + assert mock_update_search.called + def test_can_gdpr_delete(self, user): user.social = ['fake social'] user.schools = ['fake schools'] @@ -2184,7 +2215,7 @@ def test_can_gdpr_delete_shared_draft_registration_with_multiple_admins(self, us assert draft_registrations.contributors.get() == other_admin assert user.nodes.filter(deleted__isnull=True).count() == 0 - def test_cant_gdpr_delete_multiple_contributors_registrations(self, user, registration): + def test_gdpr_delete_removes_user_from_shared_registrations(self, user, registration): registration.is_public = True other_user = AuthUserFactory() registration.add_contributor(other_user, auth=Auth(user), permissions='admin') @@ -2192,20 +2223,28 @@ def test_cant_gdpr_delete_multiple_contributors_registrations(self, user, regist assert registration.contributors.count() == 2 - with pytest.raises(UserStateError) as exc_info: - user.gdpr_delete() + user.gdpr_delete() + registration.reload() - assert exc_info.value.args[0] == 'You cannot delete this user because they have one or more registrations.' + assert registration.contributors.count() == 1 + assert registration.contributors.first() == other_user + assert not registration.is_deleted + assert user.deleted is not None - def test_cant_gdpr_delete_multiple_contributors_preprints(self, user, preprint): + def test_gdpr_delete_removes_user_from_shared_preprints(self, user, preprint): other_user = AuthUserFactory() preprint.add_contributor(other_user, auth=Auth(user), permissions='admin') preprint.save() - with pytest.raises(UserStateError) as exc_info: - user.gdpr_delete() + assert preprint.contributors.count() == 2 + + user.gdpr_delete() + preprint.reload() - assert exc_info.value.args[0] == 'You cannot delete this user because they have one or more preprints.' + assert preprint.contributors.count() == 1 + assert preprint.contributors.first() == other_user + assert not preprint.is_deleted + assert user.deleted is not None def test_can_gdpr_delete_sole_contributor_registration(self, user): registration = RegistrationFactory(creator=user) From b6eba82b5750a5be29009b3a947a0958437eae27 Mon Sep 17 00:00:00 2001 From: mkovalua Date: Thu, 12 Feb 2026 16:57:23 +0200 Subject: [PATCH 11/31] [ENG-8740] Ability to delete a file from a registration via admin (#11285) * [ENG-8514] Remove CSRF protection from reset password api v2 POST (#11246) * remove csrf protection from reset password endpoint * update test * add background color prop to Brand (#11254) * fix flaky test_serialized_metadata * fix throttle test * reset throttle cache * don't ignore components when create a view-only link * fixed updating subscribe_osf_general_email subscription * [ENG-7277] Update doc to include version as relationship (#11262) * added tests * [ENG-8691] Wrong server on reset password email (#11271) * use same logic for admin and web password reset * fix tests * enable filtering for linked-nodes endpoint (#11273) * remove deleted users from institutional dashboard (#11261) * fixed tests * [ENG-7803] Update text on VOL modal for registration (#11279) * add a file removal feature for a node (registration) using admin panel * delete file only for archived registration when it is not possible from user side to avoid inconsistency * remove file from scheme response blocks * delete file from registration and metadata and keep it for original project --------- Co-authored-by: antkryt Co-authored-by: John Tordoff Co-authored-by: Ihor Sokhan Co-authored-by: Vlad0n20 <137097005+Vlad0n20@users.noreply.github.com> --- admin/nodes/urls.py | 1 + admin/nodes/views.py | 36 ++++++++++++++++++- admin/templates/nodes/node.html | 1 + admin/templates/nodes/remove_file.html | 36 +++++++++++++++++++ osf/management/commands/change_node_region.py | 13 ++++--- 5 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 admin/templates/nodes/remove_file.html diff --git a/admin/nodes/urls.py b/admin/nodes/urls.py index ac31ec0dc9b..087a1d57e94 100644 --- a/admin/nodes/urls.py +++ b/admin/nodes/urls.py @@ -50,4 +50,5 @@ re_path(r'^(?P[a-z0-9]+)/system_tags/add/$', views.NodeAddSystemTag.as_view(), name='add-system-tag'), re_path(r'^(?P[a-z0-9]+)/system_tags/(?P[a-z0-9]+)/remove/$', views.NodeRemoveSystemTag.as_view(), name='remove-system-tag'), re_path(r'^(?P[a-z0-9]+)/update_permissions/$', views.NodeUpdatePermissionsView.as_view(), name='update-permissions'), + re_path(r'^(?P[a-z0-9]+)/remove_file/$', views.NodeRemoveFileView.as_view(), name='remove-file'), ] diff --git a/admin/nodes/views.py b/admin/nodes/views.py index 769b3b18d97..e53d1c61704 100644 --- a/admin/nodes/views.py +++ b/admin/nodes/views.py @@ -6,6 +6,7 @@ from django.utils import timezone from django.core.exceptions import PermissionDenied, ValidationError from django.urls import NoReverseMatch +from django.db import transaction from django.db.models import F, Case, When, IntegerField from django.contrib import messages from django.contrib.auth.mixins import PermissionRequiredMixin @@ -28,14 +29,17 @@ from api.caching.tasks import update_storage_usage_cache from osf.exceptions import NodeStateError, RegistrationStuckError +from osf.management.commands.change_node_region import _update_schema_meta from osf.models import ( + Guid, OSFUser, NodeLog, AbstractNode, Registration, RegistrationProvider, RegistrationApproval, - SpamStatus + SpamStatus, + TrashedFile ) from osf.models.admin_log_entry import ( update_admin_log, @@ -813,6 +817,36 @@ def post(self, request, *args, **kwargs): return redirect(self.get_success_url()) +class NodeRemoveFileView(NodeMixin, View): + """ Allows an authorized user to remove file from node. + """ + permission_required = 'osf.change_node' + + def post(self, request, *args, **kwargs): + def _remove_file_from_schema_response_blocks(registration, removed_file_id): + file_input_keys = registration.registration_schema.schema_blocks.filter( + block_type='file-input' + ).values_list('registration_response_key', flat=True) + for schema_response in registration.schema_responses.all(): + for block in schema_response.response_blocks.filter(schema_key__in=file_input_keys): + if not block.response: + continue + block.response = [entry for entry in block.response if entry.get('file_id') not in removed_file_id] + block.save() + + node = self.get_object() + guid_id = request.POST.get('remove-file-guid', '').strip() + guid = Guid.load(guid_id) + + # delete file from registration and metadata and keep it for original project + if guid and (file := guid.referent) and (file.target == node) and not isinstance(file, TrashedFile): + with transaction.atomic(): + file.delete() + _update_schema_meta(file.target) + _remove_file_from_schema_response_blocks(node, [file._id, file.copied_from._id]) + return redirect(self.get_success_url()) + + class RemoveStuckRegistrationsView(NodeMixin, View): """ Allows an authorized user to remove a registrations if it's stuck in the archiving process. """ diff --git a/admin/templates/nodes/node.html b/admin/templates/nodes/node.html index 1c791ce2b76..3e86290b249 100644 --- a/admin/templates/nodes/node.html +++ b/admin/templates/nodes/node.html @@ -17,6 +17,7 @@ View Logs {% include "nodes/remove_node.html" with node=node %} + {% include "nodes/remove_file.html" with node=node %} {% include "nodes/registration_force_archive.html" with node=node %} {% include "nodes/make_private.html" with node=node %} {% include "nodes/make_public.html" with node=node %} diff --git a/admin/templates/nodes/remove_file.html b/admin/templates/nodes/remove_file.html new file mode 100644 index 00000000000..0f50e39750e --- /dev/null +++ b/admin/templates/nodes/remove_file.html @@ -0,0 +1,36 @@ +{% if node.is_registration and node.archived %} + + Delete File + + +{% endif %} \ No newline at end of file diff --git a/osf/management/commands/change_node_region.py b/osf/management/commands/change_node_region.py index b0c97630182..e66cc961b22 100644 --- a/osf/management/commands/change_node_region.py +++ b/osf/management/commands/change_node_region.py @@ -39,11 +39,14 @@ def _update_blocks(file_block_map, original_id, cloned_id): block.save() def _update_schema_meta(node): - logger.info('Updating legacy schema information...') - node.registration_responses = node.schema_responses.latest('-created').all_responses - node.registered_meta[node.registration_schema._id] = node.expand_registration_responses() - node.save() - logger.info('Updated legacy schema information.') + try: + logger.info('Updating legacy schema information...') + node.registration_responses = node.schema_responses.latest('-created').all_responses + node.registered_meta[node.registration_schema._id] = node.expand_registration_responses() + node.save() + logger.info('Updated legacy schema information.') + except Exception: + logger.error('There is no data in schema responses to update legacy schema information.') def _copy_and_clone_versions(original_file, cloned_file, src_bucket, dest_bucket, dest_bucket_name, dest_region): for v in original_file.versions.order_by('identifier').all(): From ed05508711e9ca1b436043880d5b153aa94337ac Mon Sep 17 00:00:00 2001 From: antkryt Date: Thu, 12 Feb 2026 16:58:32 +0200 Subject: [PATCH 12/31] [ENG-10074] Unable to approve account merging (#11578) * implement admin user merge as a background task * fix test --- admin/users/views.py | 7 ++++++- admin_tests/users/test_views.py | 7 ++++--- api/users/tasks.py | 34 +++++++++++++++++++++++++++++++++ website/settings/defaults.py | 1 + 4 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 api/users/tasks.py diff --git a/admin/users/views.py b/admin/users/views.py index 814cc2327d5..7ea39fd1749 100644 --- a/admin/users/views.py +++ b/admin/users/views.py @@ -49,6 +49,7 @@ from admin.nodes.views import NodeAddSystemTag, NodeRemoveSystemTag from admin.base.views import GuidView from api.users.services import send_password_reset_email +from api.users.tasks import merge_users from website.settings import DOMAIN, OSF_SUPPORT_EMAIL from django.urls import reverse_lazy @@ -425,7 +426,11 @@ def form_valid(self, form): guid_to_be_merged = form.cleaned_data['user_guid_to_be_merged'] user_to_be_merged = OSFUser.objects.get(guids___id=guid_to_be_merged, guids___id__isnull=False) - user.merge_user(user_to_be_merged) + merge_users.delay(user._id, user_to_be_merged._id) + messages.success( + self.request, + f'Merge of user {user_to_be_merged._id} into {user._id} has been queued and will run in the background.', + ) return super().form_valid(form) diff --git a/admin_tests/users/test_views.py b/admin_tests/users/test_views.py index a8ccb5618a8..a10a2af7d00 100644 --- a/admin_tests/users/test_views.py +++ b/admin_tests/users/test_views.py @@ -672,9 +672,10 @@ class TestUserMerge(AdminTestCase): def setUp(self): super().setUp() self.request = RequestFactory().post('/fake_path') + patch_messages(self.request) - @mock.patch('osf.models.user.OSFUser.merge_user') - def test_merge_user(self, mock_merge_user): + @mock.patch('api.users.tasks.merge_users.delay') + def test_merge_user(self, mock_merge_users_delay): user = UserFactory() user_merged = UserFactory() @@ -688,4 +689,4 @@ def test_merge_user(self, mock_merge_user): assert valid_form.is_valid() view.form_valid(valid_form) - mock_merge_user.assert_called_with(user_merged) + mock_merge_users_delay.assert_called_with(user._id, user_merged._id) diff --git a/api/users/tasks.py b/api/users/tasks.py new file mode 100644 index 00000000000..e11ef0665e9 --- /dev/null +++ b/api/users/tasks.py @@ -0,0 +1,34 @@ +import logging + +from framework import sentry +from framework.celery_tasks import app as celery_app + +logger = logging.getLogger(__name__) + + +@celery_app.task(name='api.users.tasks.merge_users') +def merge_users(merger_guid: str, mergee_guid: str): + """ + Background task to merge one user into another. + + :param merger_guid: GUID of the primary user that will receive content + :param mergee_guid: GUID of the user being merged into the primary user + """ + from osf.models import OSFUser + + try: + merger = OSFUser.load(merger_guid) + mergee = OSFUser.load(mergee_guid) + + if not merger or not mergee: + sentry.log_message(f'User merge task received invalid users: merger={merger_guid}, mergee={mergee_guid}') + return + + if merger == mergee: + sentry.log_message(f'User merge task attempted to merge a user into itself: {merger_guid}') + return + + merger.merge_user(mergee) + except Exception as exc: + logger.exception(f'Unexpected error during background user merge: merger={merger_guid}, mergee={mergee_guid}') + sentry.log_exception(exc) diff --git a/website/settings/defaults.py b/website/settings/defaults.py index d09e583c181..3a142ed9f4c 100644 --- a/website/settings/defaults.py +++ b/website/settings/defaults.py @@ -575,6 +575,7 @@ class CeleryConfig: 'osf.management.commands.approve_pending_schema_responses', 'osf.management.commands.sync_doi_metadata', 'api.providers.tasks', + 'api.users.tasks', 'osf.management.commands.daily_reporters_go', 'osf.management.commands.monthly_reporters_go', 'osf.external.spam.tasks', From 611c1765fde4b03387a4e27b71db923006e8dbf9 Mon Sep 17 00:00:00 2001 From: Ostap-Zherebetskyi Date: Thu, 12 Feb 2026 17:59:05 +0200 Subject: [PATCH 13/31] Add affiliation management for institutions and users (#11374) --- admin/institutions/urls.py | 2 + admin/institutions/views.py | 60 +++++++++++++++++++ admin/templates/institutions/detail.html | 11 ++-- .../institutions/edit_affiliations.html | 55 +++++++++++++++++ .../users/affiliated_institutions.html | 55 +++++++++++++++++ admin/templates/users/user.html | 4 +- admin/users/urls.py | 2 + admin/users/views.py | 58 ++++++++++++++++++ 8 files changed, 241 insertions(+), 6 deletions(-) create mode 100644 admin/templates/institutions/edit_affiliations.html create mode 100644 admin/templates/users/affiliated_institutions.html diff --git a/admin/institutions/urls.py b/admin/institutions/urls.py index 6aa5cf7e0df..2e260cf4f1b 100644 --- a/admin/institutions/urls.py +++ b/admin/institutions/urls.py @@ -20,5 +20,7 @@ name='list_and_add_admin'), re_path(r'^(?P[0-9]+)/remove_admins/$', views.InstitutionRemoveAdmin.as_view(), name='remove_admins'), + re_path(r'^(?P[0-9]+)/affiliations/$', views.InstitutionListAndAddAffiliation.as_view(), name='affiliations'), + re_path(r'^(?P[0-9]+)/remove_affiliations/$', views.InstitutionRemoveAffiliation.as_view(), name='remove_affiliations'), ] diff --git a/admin/institutions/views.py b/admin/institutions/views.py index 46e6a0a7745..536d916d937 100644 --- a/admin/institutions/views.py +++ b/admin/institutions/views.py @@ -373,3 +373,63 @@ def form_valid(self, form): def get_success_url(self): return reverse('institutions:register_metrics_admin', kwargs={'institution_id': self.kwargs['institution_id']}) + + +class InstitutionAffiliationBaseView(PermissionRequiredMixin, ListView): + permission_required = 'osf.change_institution' + template_name = 'institutions/edit_affiliations.html' + raise_exception = True + + def get_queryset(self): + return Institution.objects.get(id=self.kwargs['institution_id']) + + def get_context_data(self, **kwargs): + institution = Institution.objects.get(id=self.kwargs['institution_id']) + context = super().get_context_data(**kwargs) + context['institution'] = institution + context['affiliations'] = institution.get_institution_users() + return context + + +class InstitutionListAndAddAffiliation(InstitutionAffiliationBaseView): + + def get_permission_required(self): + if self.request.method == 'GET': + return ('osf.view_institution',) + return (self.permission_required,) + + def post(self, request, *args, **kwargs): + institution = Institution.objects.get(id=self.kwargs['institution_id']) + data = dict(request.POST) + del data['csrfmiddlewaretoken'] # just to remove the key from the form dict + + target_user = OSFUser.load(data['add-affiliation-form'][0]) + if target_user is None: + messages.error(request, f'User for guid: {data["add-affiliation-form"][0]} could not be found') + return redirect('institutions:affiliations', institution_id=institution.id) + + target_user.add_or_update_affiliated_institution(institution) + + messages.success(request, f'The following user was successfully added: {target_user.fullname} ({target_user.username})') + + return redirect('institutions:affiliations', institution_id=institution.id) + + +class InstitutionRemoveAffiliation(InstitutionAffiliationBaseView): + + def post(self, request, *args, **kwargs): + institution = Institution.objects.get(id=self.kwargs['institution_id']) + data = dict(request.POST) + del data['csrfmiddlewaretoken'] # just to remove the key from the form dict + + to_be_removed = list(data.keys()) + removed_affiliations = [user.replace('User-', '') for user in to_be_removed if 'User-' in user] + affiliated_users = OSFUser.objects.filter(id__in=removed_affiliations) + for user in affiliated_users: + user.remove_affiliated_institution(institution._id) + + if affiliated_users: + users_names = ' ,'.join(affiliated_users.values_list('fullname', flat=True)) + messages.success(request, f'The following users were successfully removed: {users_names}') + + return redirect('institutions:affiliations', institution_id=institution.id) diff --git a/admin/templates/institutions/detail.html b/admin/templates/institutions/detail.html index 2ce1ad20a03..8c4a9e79e15 100644 --- a/admin/templates/institutions/detail.html +++ b/admin/templates/institutions/detail.html @@ -24,11 +24,12 @@ Delete institution {% endif %} {% if perms.osf.change_institution %} - {% if institution.deactivated is None %} - Deactivate institution - {% else %} - Reactivate institution - {% endif %} + {% if institution.deactivated is None %} + Deactivate institution + {% else %} + Reactivate institution + {% endif %} + Affiliations {% endif %} {% if perms.osf.change_institution %} Manage Admins diff --git a/admin/templates/institutions/edit_affiliations.html b/admin/templates/institutions/edit_affiliations.html new file mode 100644 index 00000000000..e4e25cf1ac6 --- /dev/null +++ b/admin/templates/institutions/edit_affiliations.html @@ -0,0 +1,55 @@ +{% extends "base.html" %} +{% load static %} +{% load render_bundle from webpack_loader %} +{% block title %} + Institution Affiliations +{% endblock title %} +{% block content %} +
+
+ {% if messages %} +
    + {% for message in messages %} + {{ message }} + {% endfor %} +
+ {% endif %} +
+
+
+

{{ institution.name }}

+
+
+
+
+
+ {% csrf_token %} + + + +
+
+
+
+
+
+
+ {% csrf_token %} + + + + + {% for user in affiliations %} + + + + + + {% endfor %} +
NameUsername
{{ user.fullname }}{{ user.username }}
+ +
+
+
+
+{% endblock content %} \ No newline at end of file diff --git a/admin/templates/users/affiliated_institutions.html b/admin/templates/users/affiliated_institutions.html new file mode 100644 index 00000000000..2f80ff79350 --- /dev/null +++ b/admin/templates/users/affiliated_institutions.html @@ -0,0 +1,55 @@ +{% extends "base.html" %} +{% load static %} +{% load render_bundle from webpack_loader %} +{% block title %} + Affiliated Institutions +{% endblock title %} +{% block content %} +
+
+ {% if messages %} +
    + {% for message in messages %} + {{ message }} + {% endfor %} +
+ {% endif %} +
+
+
+

{{ institution.name }}

+
+
+
+
+
+ {% csrf_token %} + + + +
+
+
+
+
+
+
+ {% csrf_token %} + + + + + {% for institution in institutions %} + + + + + + {% endfor %} +
NameGuid
{{ institution.name }}{{ institution.guid }}
+ +
+
+
+
+{% endblock content %} \ No newline at end of file diff --git a/admin/templates/users/user.html b/admin/templates/users/user.html index 96cda4689aa..9bd02221ec7 100644 --- a/admin/templates/users/user.html +++ b/admin/templates/users/user.html @@ -37,7 +37,9 @@ {% include "users/disable_user.html" with user=user %} {% include "users/mark_spam.html" with user=user %} {% include "users/reindex_user_elastic.html" with user=user %} - {% include "users/reindex_user_share.html" with user=user %} + {% if perms.osf.change_institution %} + Affiliations + {% endif %} diff --git a/admin/users/urls.py b/admin/users/urls.py index 3c87ab1e332..c692c52c4bc 100644 --- a/admin/users/urls.py +++ b/admin/users/urls.py @@ -30,4 +30,6 @@ name='reindex-share-user'), re_path(r'^(?P[a-z0-9]+)/merge_accounts/$', views.UserMergeAccounts.as_view(), name='merge-accounts'), re_path(r'^(?P[a-z0-9]+)/draft_registrations/$', views.UserDraftRegistrationsList.as_view(), name='draft-registrations'), + re_path(r'^(?P[a-z0-9]+)/affiliations/$', views.UserListAndAddAffiliations.as_view(), name='affiliations'), + re_path(r'^(?P[a-z0-9]+)/remove_affiliations/$', views.UserRemoveAffiliations.as_view(), name='remove_affiliations'), ] diff --git a/admin/users/views.py b/admin/users/views.py index 7ea39fd1749..ff7c2078e63 100644 --- a/admin/users/views.py +++ b/admin/users/views.py @@ -23,6 +23,7 @@ from osf.models.notification_type import NotificationType from framework.auth import get_user from framework.auth.core import generate_verification_key +from osf.models.institution import Institution from website import search from website.settings import EXTERNAL_IDENTITY_PROFILE @@ -636,3 +637,60 @@ def get_context_data(self, **kwargs): 'draft_registrations': query_set } ) + + +class UserAffiliationBaseView(UserMixin, ListView): + permission_required = 'osf.change_institution' + template_name = 'users/affiliated_institutions.html' + raise_exception = True + + def get_queryset(self): + # Django template does not like attributes with underscores for some reason, so we annotate. + return self.get_object().get_affiliated_institutions().annotate( + guid=F('_id') + ) + + def get_context_data(self, **kwargs): + institutions = self.get_queryset() + context = super().get_context_data(**kwargs) + context['institutions'] = institutions + context['user'] = self.get_object() + return context + + +class UserRemoveAffiliations(UserAffiliationBaseView): + + def post(self, request, *args, **kwargs): + user = self.get_object() + data = dict(request.POST) + + to_be_removed = list(data.keys()) + removed_affiliations = [institution.replace('institution-', '') for institution in to_be_removed if 'institution-' in institution] + institutions_qs = Institution.objects.filter(id__in=removed_affiliations) + for institution in institutions_qs: + user.remove_affiliated_institution(institution._id) + + if institutions_qs: + institutions_names = ' ,'.join(institutions_qs.values_list('name', flat=True)) + messages.success(request, f'The following users were successfully removed: {institutions_names}') + + return redirect('users:affiliations', guid=user.guid) + + +class UserListAndAddAffiliations(UserAffiliationBaseView): + + def post(self, request, *args, **kwargs): + user = self.get_object() + data = dict(request.POST) + del data['csrfmiddlewaretoken'] # just to remove the key from the form dict + + institution = Institution.load(data['add-affiliation-form'][0]) + if institution is None: + messages.error(request, f'Institution for guid: {data["add-affiliation-form"][0]} could not be found') + return redirect('users:affiliations', guid=user.guid) + + user.add_or_update_affiliated_institution(institution) + + messages.success(request, f'The following institution was successfully added: {institution.name}') + + return redirect('users:affiliations', guid=user.guid) From f10606290845c3ab82cd4f1a1d1b056371c91cba Mon Sep 17 00:00:00 2001 From: mkovalua Date: Wed, 18 Feb 2026 20:29:37 +0200 Subject: [PATCH 14/31] [ENG-9805] implement asc sorting for admin brand tab (case insensitive) (#11591) * implement asc sorting for admin brand tab (case insensitive) * Fix indentation in brand list template --- admin/templates/brands/list.html | 2 +- osf/models/brand.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/admin/templates/brands/list.html b/admin/templates/brands/list.html index 5335ff923f6..a3d4ec78d6e 100644 --- a/admin/templates/brands/list.html +++ b/admin/templates/brands/list.html @@ -21,7 +21,7 @@

List of Brands

- {% for brand in brands|dictsort:"name" %} + {% for brand in brands|dictsort:"name_lower" %} {{ brand.name }} {{ brand.get_provider_types }} diff --git a/osf/models/brand.py b/osf/models/brand.py index fc162ea3c90..54d78252f96 100644 --- a/osf/models/brand.py +++ b/osf/models/brand.py @@ -25,6 +25,10 @@ class Meta: secondary_color = models.CharField(max_length=7) background_color = models.CharField(max_length=7, blank=True, null=True) + @property + def name_lower(self): + return self.name.lower() if self.name else '' + def get_provider_types(self): unique_types = self.providers.values_list('type', flat=True).distinct() results = [] From 3145cf20724b3d0e86fb79ff56245162e45b568a Mon Sep 17 00:00:00 2001 From: Vlad0n20 <137097005+Vlad0n20@users.noreply.github.com> Date: Wed, 18 Feb 2026 21:11:02 +0200 Subject: [PATCH 15/31] [ENG-10042] Fix/eng 10042 (#11593) Revert BE changes meant to fix 10042 and replace with FE changes. --- api/actions/serializers.py | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/api/actions/serializers.py b/api/actions/serializers.py index a4ab5b71d83..d572ee41654 100644 --- a/api/actions/serializers.py +++ b/api/actions/serializers.py @@ -26,7 +26,6 @@ ) from osf.utils.workflows import ( - ApprovalStates, DefaultStates, DefaultTriggers, ReviewStates, @@ -279,31 +278,6 @@ def create(self, validated_data): comment = validated_data.pop('comment', '') user = validated_data.pop('user') - pending_schema_response_updates = target.schema_responses.filter( - reviews_state__in=[ - ApprovalStates.UNAPPROVED.db_name, - ApprovalStates.PENDING_MODERATION.db_name, - ], - previous_response__isnull=False, # Only updates, not initial submissions - ).order_by('-created') - - if pending_schema_response_updates.exists(): - pending_response = pending_schema_response_updates.first() - short_message = 'This registration has a pending update' - long_message = ( - f'This registration has a pending schema response update (ID: {pending_response._id}) ' - f'that must be moderated. Please use the schema response actions endpoint to approve or reject ' - f'the update instead of creating a registration action.' - ) - raise HTTPError( - http_status.HTTP_400_BAD_REQUEST, - data={ - 'message_short': short_message, - 'message_long': long_message, - 'schema_response_id': pending_response._id, - }, - ) - sanction = target.sanction try: From 665ed8bf2b52ac4fdd67032db8dd26346d0487ea Mon Sep 17 00:00:00 2001 From: Vlad0n20 <137097005+Vlad0n20@users.noreply.github.com> Date: Fri, 20 Feb 2026 19:25:07 +0200 Subject: [PATCH 16/31] [ENG-8515] - Add management command to manual archive (#11361) * Add management command to manual archive * fix test * Fix lints * Fix tests --- admin/nodes/views.py | 71 +++++---- api/institutions/serializers.py | 10 +- .../process_manual_restart_approvals.py | 145 ++++++++++++++++++ osf/models/admin_log_entry.py | 2 + scripts/check_manual_restart_approval.py | 74 +++++++++ scripts/enhanced_stuck_registration_audit.py | 137 +++++++++++++++++ .../tests/test_populate_new_and_noteworthy.py | 16 +- website/archiver/tasks.py | 21 +++ website/settings/defaults.py | 2 + 9 files changed, 441 insertions(+), 37 deletions(-) create mode 100644 osf/management/commands/process_manual_restart_approvals.py create mode 100644 scripts/check_manual_restart_approval.py create mode 100644 scripts/enhanced_stuck_registration_audit.py diff --git a/admin/nodes/views.py b/admin/nodes/views.py index e53d1c61704..01ebad686ce 100644 --- a/admin/nodes/views.py +++ b/admin/nodes/views.py @@ -1,33 +1,31 @@ -import pytz -from enum import Enum from datetime import datetime -from framework import status +from enum import Enum -from django.utils import timezone -from django.core.exceptions import PermissionDenied, ValidationError -from django.urls import NoReverseMatch +import pytz from django.db import transaction -from django.db.models import F, Case, When, IntegerField from django.contrib import messages from django.contrib.auth.mixins import PermissionRequiredMixin +from django.core.exceptions import PermissionDenied, ValidationError +from django.db.models import F, Case, When, IntegerField from django.http import HttpResponse +from django.shortcuts import redirect, reverse, get_object_or_404 +from django.urls import NoReverseMatch +from django.urls import reverse_lazy +from django.utils import timezone from django.views.generic import ( View, FormView, ListView, ) -from django.shortcuts import redirect, reverse, get_object_or_404 -from django.urls import reverse_lazy +from admin.base.forms import GuidForm from admin.base.utils import change_embargo_date from admin.base.views import GuidView -from admin.base.forms import GuidForm -from admin.notifications.views import delete_selected_notifications from admin.nodes.forms import AddSystemTagForm, RegistrationDateForm - -from api.share.utils import update_share +from admin.notifications.views import delete_selected_notifications from api.caching.tasks import update_storage_usage_cache - +from api.share.utils import update_share +from framework import status from osf.exceptions import NodeStateError, RegistrationStuckError from osf.management.commands.change_node_region import _update_schema_meta from osf.models import ( @@ -53,9 +51,7 @@ REINDEX_ELASTIC, ) from osf.utils.permissions import ADMIN, API_CONTRIBUTOR_PERMISSIONS - from scripts.approve_registrations import approve_past_pendings - from website import settings, search from website.archiver.tasks import force_archive @@ -149,7 +145,8 @@ def get_context_data(self, **kwargs): 'STORAGE_LIMITS': settings.StorageLimits, 'node': node, # to edit contributors we should have guid as django prohibits _id usage as it starts with an underscore - 'annotated_contributors': node.contributor_set.prefetch_related('user__guids').annotate(guid=F('user__guids___id')), + 'annotated_contributors': node.contributor_set.prefetch_related('user__guids').annotate( + guid=F('user__guids___id')), 'children': children, 'permissions': API_CONTRIBUTOR_PERMISSIONS, 'has_update_permission': self.request.user.has_perm('osf.change_node'), @@ -209,7 +206,9 @@ class NodeRemoveContributorView(NodeMixin, View): def post(self, request, *args, **kwargs): node = self.get_object() user = OSFUser.objects.get(id=self.kwargs.get('user_id')) - if node.has_permission(user, ADMIN) and not node._get_admin_contributors_query(node._contributors.all(), require_active=False).exclude(user=user).exists(): + if node.has_permission(user, ADMIN) and not node._get_admin_contributors_query(node._contributors.all(), + require_active=False).exclude( + user=user).exists(): messages.error(self.request, 'Must be at least one admin on this node.') return redirect(self.get_success_url()) @@ -906,6 +905,7 @@ class ForceArchiveRegistrationsView(NodeMixin, View): def post(self, request, *args, **kwargs): # Prevents circular imports that cause admin app to hang at startup from osf.management.commands.force_archive import verify, DEFAULT_PERMISSIBLE_ADDONS + from osf.models.admin_log_entry import update_admin_log, MANUAL_ARCHIVE_RESTART registration = self.get_object() force_archive_params = request.POST @@ -933,16 +933,31 @@ def post(self, request, *args, **kwargs): messages.error(request, str(exc)) return redirect(self.get_success_url()) else: - # For actual archiving, skip synchronous verification to avoid 502 timeouts - # Verification will be performed asynchronously in the task - force_archive_task = force_archive.delay( - str(registration._id), - permissible_addons=list(addons), - allow_unconfigured=allow_unconfigured, - skip_collisions=skip_collision, - delete_collisions=delete_collision, - ) - messages.success(request, f'Registration archive process has started. Task id: {force_archive_task.id}.') + try: + update_admin_log( + user_id=request.user.id, + object_id=registration.pk, + object_repr=str(registration), + message=f'Manual archive restart initiated for registration {registration._id}', + action_flag=MANUAL_ARCHIVE_RESTART + ) + # For actual archiving, skip synchronous verification to avoid 502 timeouts + # Verification will be performed asynchronously in the task + force_archive_task = force_archive.delay( + str(registration._id), + permissible_addons=list(addons), + allow_unconfigured=allow_unconfigured, + skip_collisions=skip_collision, + delete_collisions=delete_collision, + ) + messages.success( + request, + f'Registration archive process has started. Task id: {force_archive_task.id}.' + ) + except Exception as exc: + messages.error(request, + f'This registration cannot be archived due to {exc.__class__.__name__}: {str(exc)}. ' + f'If the problem persists get a developer to fix it.') return redirect(self.get_success_url()) diff --git a/api/institutions/serializers.py b/api/institutions/serializers.py index 5beffe60348..6f4bc4f9e15 100644 --- a/api/institutions/serializers.py +++ b/api/institutions/serializers.py @@ -231,7 +231,9 @@ class Meta: number_of_users = ser.IntegerField(read_only=True) def get_absolute_url(self, obj): - raise NotImplementedError() + institution_id = self.context['request'].parser_context['kwargs']['institution_id'] + dept_id = obj['name'].replace(' ', '-') + return f'/institutions/{institution_id}/metrics/departments/{dept_id}/' class InstitutionUserMetricsSerializer(JSONAPISerializer): @@ -289,7 +291,8 @@ def get_contacts(self, obj): return list(results) def get_absolute_url(self, obj): - raise NotImplementedError() + institution_id = self.context['request'].parser_context['kwargs']['institution_id'] + return f'/institutions/{institution_id}/metrics/users/' class InstitutionSummaryMetricsSerializer(JSONAPISerializer): @@ -323,7 +326,8 @@ class Meta: ) def get_absolute_url(self, obj): - raise NotImplementedError() + institution_id = self.context['request'].parser_context['kwargs']['institution_id'] + return f'/institutions/{institution_id}/metrics/summary/' class InstitutionRelated(JSONAPIRelationshipSerializer): diff --git a/osf/management/commands/process_manual_restart_approvals.py b/osf/management/commands/process_manual_restart_approvals.py new file mode 100644 index 00000000000..e708320357f --- /dev/null +++ b/osf/management/commands/process_manual_restart_approvals.py @@ -0,0 +1,145 @@ +import logging +from datetime import timedelta +from django.core.management.base import BaseCommand +from django.utils import timezone +from osf.models import Registration +from osf.models.admin_log_entry import AdminLogEntry, MANUAL_ARCHIVE_RESTART +from website import settings +from scripts.approve_registrations import approve_past_pendings + +logger = logging.getLogger(__name__) + + +class Command(BaseCommand): + help = 'Process registrations that were manually restarted and may need approval' + + def add_arguments(self, parser): + parser.add_argument( + '--dry-run', + action='store_true', + help='Show what would be done without actually doing it', + ) + parser.add_argument( + '--hours-back', + type=int, + default=72, + help='How many hours back to look for manual restarts (default: 72)', + ) + parser.add_argument( + '--registration-id', + type=str, + help='Process a specific registration ID only', + ) + + def handle(self, *args, **options): + dry_run = options['dry_run'] + hours_back = options['hours_back'] + specific_registration = options.get('registration_id') + + if dry_run: + self.stdout.write(self.style.WARNING('Running in DRY RUN mode - no changes will be made')) + + since = timezone.now() - timedelta(hours=hours_back) + + query = AdminLogEntry.objects.filter( + action_flag=MANUAL_ARCHIVE_RESTART, + action_time__gte=since + ) + + if specific_registration: + try: + reg = Registration.objects.get(_id=specific_registration) + query = query.filter(object_id=reg.pk) + self.stdout.write(f"Processing specific registration: {specific_registration}") + except Registration.DoesNotExist: + self.stdout.write(self.style.ERROR(f"Registration {specific_registration} not found")) + return + + manual_restart_logs = query.values_list('object_id', flat=True).distinct() + + registrations_to_check = Registration.objects.filter( + pk__in=manual_restart_logs, + ) + + self.stdout.write(f"Found {registrations_to_check.count()} manually restarted registrations to check") + + approvals_ready = [] + skipped_registrations = [] + + for registration in registrations_to_check: + status = self.should_auto_approve(registration) + + if status == 'ready': + approval = registration.registration_approval + if approval: + approvals_ready.append(approval) + self.stdout.write( + self.style.SUCCESS(f"✓ Queuing registration {registration._id} for approval") + ) + else: + skipped_registrations.append((registration._id, status)) + self.stdout.write( + self.style.WARNING(f"⚠ Skipping registration {registration._id}: {status}") + ) + + if approvals_ready: + if dry_run: + self.stdout.write( + self.style.WARNING(f"DRY RUN: Would approve {len(approvals_ready)} registrations") + ) + else: + try: + approve_past_pendings(approvals_ready, dry_run=False) + self.stdout.write( + self.style.SUCCESS(f"✓ Successfully approved {len(approvals_ready)} manually restarted registrations") + ) + except Exception as e: + self.stdout.write( + self.style.ERROR(f"✗ Error approving registrations: {e}") + ) + else: + self.stdout.write('No registrations ready for approval') + + self.stdout.write(f"Total checked: {registrations_to_check.count()}") + self.stdout.write(f"Ready for approval: {len(approvals_ready)}") + self.stdout.write(f"Skipped: {len(skipped_registrations)}") + + if skipped_registrations: + self.stdout.write('\nSkipped registrations:') + for reg_id, reason in skipped_registrations: + self.stdout.write(f" - {reg_id}: {reason}") + + def should_auto_approve(self, registration): + if registration.is_public: + return 'already public' + + if registration.is_registration_approved: + return 'already approved' + + if registration.archiving: + return 'still archiving' + + archive_job = registration.archive_job + if archive_job and hasattr(archive_job, 'status'): + if archive_job.status not in ['SUCCESS', None]: + return f'archive status: {archive_job.status}' + + approval = registration.registration_approval + if not approval: + return 'no approval object' + + if approval.is_approved: + return 'approval already approved' + + if approval.is_rejected: + return 'approval was rejected' + + time_since_initiation = timezone.now() - approval.initiation_date + if time_since_initiation < settings.REGISTRATION_APPROVAL_TIME: + remaining = settings.REGISTRATION_APPROVAL_TIME - time_since_initiation + return f'not ready yet ({remaining} remaining)' + + if registration.is_stuck_registration: + return 'registration still stuck' + + return 'ready' diff --git a/osf/models/admin_log_entry.py b/osf/models/admin_log_entry.py index 99f4de940f5..1597f514375 100644 --- a/osf/models/admin_log_entry.py +++ b/osf/models/admin_log_entry.py @@ -37,6 +37,8 @@ DOI_CREATION_FAILED = 80 DOI_UPDATE_FAILED = 81 +MANUAL_ARCHIVE_RESTART = 90 + def update_admin_log(user_id, object_id, object_repr, message, action_flag=UNKNOWN): AdminLogEntry.objects.log_action( user_id=user_id, diff --git a/scripts/check_manual_restart_approval.py b/scripts/check_manual_restart_approval.py new file mode 100644 index 00000000000..e9e6c70de0c --- /dev/null +++ b/scripts/check_manual_restart_approval.py @@ -0,0 +1,74 @@ +import logging +from framework.celery_tasks import app as celery_app +from django.core.management import call_command +from osf.models import Registration + +logger = logging.getLogger(__name__) + + +@celery_app.task(name='scripts.check_manual_restart_approval') +def check_manual_restart_approval(registration_id): + try: + try: + registration = Registration.objects.get(_id=registration_id) + except Registration.DoesNotExist: + logger.error(f"Registration {registration_id} not found") + return f"Registration {registration_id} not found" + + if registration.is_public or registration.is_registration_approved: + return f"Registration {registration_id} already approved/public" + + if registration.archiving: + logger.info(f"Registration {registration_id} still archiving, retrying in 10 minutes") + check_manual_restart_approval.apply_async( + args=[registration_id], + countdown=600 + ) + return f"Registration {registration_id} still archiving, scheduled retry" + + logger.info(f"Processing manual restart approval for registration {registration_id}") + + call_command( + 'process_manual_restart_approvals', + registration_id=registration_id, + dry_run=False, + hours_back=24, + verbosity=1 + ) + + return f"Processed manual restart approval check for registration {registration_id}" + + except Exception as e: + logger.error(f"Error processing manual restart approval for {registration_id}: {e}") + raise + + +@celery_app.task(name='scripts.check_manual_restart_approvals_batch') +def check_manual_restart_approvals_batch(hours_back=24): + try: + logger.info(f"Running batch check for manual restart approvals (last {hours_back} hours)") + + call_command( + 'process_manual_restart_approvals', + dry_run=False, + hours_back=hours_back, + verbosity=1 + ) + + return f"Completed batch manual restart approval check for last {hours_back} hours" + + except Exception as e: + logger.error(f"Error in batch manual restart approval check: {e}") + raise + + +@celery_app.task(name='scripts.delayed_manual_restart_approval') +def delayed_manual_restart_approval(registration_id, delay_minutes=30): + logger.info(f"Scheduling delayed manual restart approval check for {registration_id} in {delay_minutes} minutes") + + check_manual_restart_approval.apply_async( + args=[registration_id], + countdown=delay_minutes * 60 + ) + + return f"Scheduled manual restart approval check for {registration_id} in {delay_minutes} minutes" \ No newline at end of file diff --git a/scripts/enhanced_stuck_registration_audit.py b/scripts/enhanced_stuck_registration_audit.py new file mode 100644 index 00000000000..3905526ae52 --- /dev/null +++ b/scripts/enhanced_stuck_registration_audit.py @@ -0,0 +1,137 @@ +import logging + +from django.core.management import call_command +from framework.celery_tasks import app as celery_app +from osf.models import Registration +from osf.management.commands.force_archive import archive, DEFAULT_PERMISSIBLE_ADDONS +from scripts.stuck_registration_audit import analyze_failed_registration_nodes + +logger = logging.getLogger(__name__) + + +@celery_app.task(name='scripts.enhanced_stuck_registration_audit') +def enhanced_stuck_registration_audit(): + logger.info('Starting enhanced stuck registration audit') + + try: + logger.info('Processing pending manual restart approvals') + call_command('process_manual_restart_approvals', dry_run=False, hours_back=72) + except Exception as e: + logger.error(f"Error processing manual restart approvals: {e}") + + logger.info('Analyzing failed registrations') + failed_registrations = analyze_failed_registration_nodes() + + if not failed_registrations: + logger.info('No failed registrations found') + return 'No failed registrations found' + + logger.info(f"Found {len(failed_registrations)} failed registrations") + + auto_retryable = [] + needs_manual_intervention = [] + + for reg_info in failed_registrations: + registration_id = reg_info['registration'] + + try: + registration = Registration.objects.get(_id=registration_id) + + if should_auto_retry(reg_info, registration): + auto_retryable.append(registration) + logger.info(f"Registration {registration_id} eligible for auto-retry") + else: + needs_manual_intervention.append(reg_info) + logger.info(f"Registration {registration_id} needs manual intervention") + + except Registration.DoesNotExist: + logger.warning(f"Registration {registration_id} not found") + needs_manual_intervention.append(reg_info) + continue + + successfully_retried = [] + failed_auto_retries = [] + + for reg in auto_retryable: + try: + logger.info(f"Attempting auto-retry for stuck registration {reg._id}") + + archive( + reg, + permissible_addons=DEFAULT_PERMISSIBLE_ADDONS, + allow_unconfigured=True, + skip_collisions=True + ) + + successfully_retried.append(reg._id) + logger.info(f"Successfully auto-retried registration {reg._id}") + + except Exception as e: + logger.error(f"Auto-retry failed for registration {reg._id}: {e}") + failed_auto_retries.append({ + 'registration': reg._id, + 'auto_retry_error': str(e), + 'original_info': next(info for info in failed_registrations if info['registration'] == reg._id) + }) + + needs_manual_intervention.extend(failed_auto_retries) + + logger.info(f"Auto-retry results: {len(successfully_retried)} successful, {len(failed_auto_retries)} failed") + + summary = { + 'total_failed': len(failed_registrations), + 'auto_retried_success': len(successfully_retried), + 'auto_retried_failed': len(failed_auto_retries), + 'needs_manual': len(needs_manual_intervention), + 'successfully_retried_ids': successfully_retried + } + + logger.info(f"Enhanced audit completed: {summary}") + return summary + + +def should_auto_retry(reg_info, registration): + if not reg_info.get('can_be_reset', False): + return False + + addon_list = reg_info.get('addon_list', []) + complex_addons = set(addon_list) - {'osfstorage', 'wiki'} + if complex_addons: + logger.info(f"Registration {registration._id} has complex addons: {complex_addons}") + return False + + logs_after_reg = reg_info.get('logs_on_original_after_registration_date', []) + if logs_after_reg: + logger.info(f"Registration {registration._id} has post-registration logs: {logs_after_reg}") + return False + + successful_after = reg_info.get('succeeded_registrations_after_failed', []) + if successful_after: + logger.info(f"Registration {registration._id} has successful registrations after failure: {successful_after}") + return False + + import django.utils.timezone as timezone + from datetime import timedelta + if registration.registered_date: + age = timezone.now() - registration.registered_date + if age > timedelta(days=30): + logger.info(f"Registration {registration._id} is too old ({age.days} days)") + return False + return True + +@celery_app.task(name='scripts.manual_restart_approval_batch') +def manual_restart_approval_batch(): + logger.info('Running manual restart approval batch task') + + try: + from scripts.check_manual_restart_approval import check_manual_restart_approvals_batch + result = check_manual_restart_approvals_batch.delay(hours_back=24) + return f"Queued manual restart approval batch task: {result.id}" + except Exception as e: + logger.error(f"Error running manual restart approval batch: {e}") + raise + + +if __name__ == '__main__': + result = enhanced_stuck_registration_audit() + print(f"Audit completed: {result}") \ No newline at end of file diff --git a/scripts/tests/test_populate_new_and_noteworthy.py b/scripts/tests/test_populate_new_and_noteworthy.py index 2141baf1607..d2a66ef613d 100644 --- a/scripts/tests/test_populate_new_and_noteworthy.py +++ b/scripts/tests/test_populate_new_and_noteworthy.py @@ -1,12 +1,16 @@ +from unittest import mock + from tests.base import OsfTestCase from osf_tests.factories import ProjectFactory from osf.models import Node -from website.settings import NEW_AND_NOTEWORTHY_LINKS_NODE from scripts import populate_new_and_noteworthy_projects as script +NEW_AND_NOTEWORTHY_LINKS_NODE = 'nguid' + +@mock.patch('scripts.populate_new_and_noteworthy_projects.NEW_AND_NOTEWORTHY_LINKS_NODE', NEW_AND_NOTEWORTHY_LINKS_NODE) class TestPopulateNewAndNoteworthy(OsfTestCase): def setUp(self): @@ -16,11 +20,11 @@ def setUp(self): self.new_and_noteworthy_links_node._id = NEW_AND_NOTEWORTHY_LINKS_NODE self.new_and_noteworthy_links_node.save() - self.nn1 = ProjectFactory(is_public=True) - self.nn2 = ProjectFactory(is_public=True) - self.nn3 = ProjectFactory(is_public=True) - self.nn4 = ProjectFactory(is_public=True) - self.nn5 = ProjectFactory(is_public=True) + self.nn1 = ProjectFactory(is_public=True, title='Noteworthy Project Alpha') + self.nn2 = ProjectFactory(is_public=True, title='Noteworthy Project Beta') + self.nn3 = ProjectFactory(is_public=True, title='Noteworthy Project Gamma') + self.nn4 = ProjectFactory(is_public=True, title='Noteworthy Project Delta') + self.nn5 = ProjectFactory(is_public=True, title='Noteworthy Project Epsilon') self.all_ids = {self.nn1._id, self.nn2._id, self.nn3._id, self.nn4._id, self.nn5._id} diff --git a/website/archiver/tasks.py b/website/archiver/tasks.py index 6b8436b9523..197b41b886b 100644 --- a/website/archiver/tasks.py +++ b/website/archiver/tasks.py @@ -7,6 +7,9 @@ import celery from celery.utils.log import get_task_logger +from django.utils import timezone +from datetime import timedelta + from framework.celery_tasks import app as celery_app from framework.celery_tasks.utils import logged from framework.exceptions import HTTPError @@ -29,9 +32,13 @@ from website.archiver.utils import normalize_unicode_filenames from website.archiver import signals as archiver_signals +from scripts.check_manual_restart_approval import delayed_manual_restart_approval + from website.project import signals as project_signals from website import settings from website.app import init_addons + +from osf.models.admin_log_entry import AdminLogEntry, MANUAL_ARCHIVE_RESTART from osf.models import ( ArchiveJob, AbstractNode, @@ -370,9 +377,23 @@ def archive_success(self, dst_pk, job_pk): job.save() dst.sanction.ask(dst.get_active_contributors_recursive(unique_users=True)) + if was_manually_restarted(dst): + logger.info(f'Registration {dst._id} was manually restarted, scheduling approval check') + delayed_manual_restart_approval.delay(dst._id, delay_minutes=5) + dst.update_search() +def was_manually_restarted(registration): + recent_logs = AdminLogEntry.objects.filter( + object_id=registration.pk, + action_flag=MANUAL_ARCHIVE_RESTART, + action_time__gte=timezone.now() - timedelta(hours=48) + ) + + return recent_logs.exists() + + @celery_app.task(bind=True) def force_archive(self, registration_id, permissible_addons, allow_unconfigured=False, skip_collisions=False, delete_collisions=False): from osf.management.commands.force_archive import archive, verify diff --git a/website/settings/defaults.py b/website/settings/defaults.py index 3a142ed9f4c..bab77fe053c 100644 --- a/website/settings/defaults.py +++ b/website/settings/defaults.py @@ -474,6 +474,8 @@ class CeleryConfig: 'scripts.add_missing_identifiers_to_preprints', 'osf.management.commands.approve_pending_schema_response', 'api.share.utils', + 'scripts.check_manual_restart_approval', + 'scripts.enhanced_stuck_registration_audit', } try: From 2ef7a53b00d7539e58d5beea2d35ec832616427f Mon Sep 17 00:00:00 2001 From: ihorsokhanexoft Date: Mon, 23 Feb 2026 16:04:44 +0200 Subject: [PATCH 17/31] [ENG-8048] Optimized GV requests (#11566) * use GV addons caching when it's needed * fixed None issue when iterate * fixed tests --- osf/models/archive.py | 2 +- osf/models/mixins.py | 4 +-- osf/models/node.py | 31 ++++++++++++++--------- osf_tests/test_gv_session_optimization.py | 12 ++++++--- 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/osf/models/archive.py b/osf/models/archive.py index 052d918a99c..9e622764ca7 100644 --- a/osf/models/archive.py +++ b/osf/models/archive.py @@ -146,7 +146,7 @@ def _set_target(self, addon_short_name): def set_targets(self): addons = [] - for addon in [self.src_node.get_addon(name) + for addon in [self.src_node.get_addon(name, cached=False) for name in settings.ADDONS_ARCHIVABLE if settings.ADDONS_ARCHIVABLE[name] != 'none']: if not addon or not isinstance(addon, BaseStorageAddon) or not addon.complete: diff --git a/osf/models/mixins.py b/osf/models/mixins.py index b7ae467f99c..1d162ba2bb9 100644 --- a/osf/models/mixins.py +++ b/osf/models/mixins.py @@ -563,14 +563,14 @@ def get_or_add_addon(self, name, *args, **kwargs): return addon return self.add_addon(name, *args, **kwargs) - def get_addon(self, name, is_deleted=False, auth=None): + def get_addon(self, name, is_deleted=False, auth=None, cached=True): # Avoid test-breakages by avoiding early access to the request context if name not in self.OSF_HOSTED_ADDONS: request, user_id = get_request_and_user_id() if not user_id and auth and auth.user: user_id = auth.user._id if flag_is_active(request, features.ENABLE_GV): - return self._get_addon_from_gv(gv_pk=name, requesting_user_id=user_id, auth=auth) + return self._get_addon_from_gv(gv_pk=name, requesting_user_id=user_id, auth=auth, cached=cached) try: settings_model = self._settings_model(name) diff --git a/osf/models/node.py b/osf/models/node.py index 380bc6cda0e..6bb91c62611 100644 --- a/osf/models/node.py +++ b/osf/models/node.py @@ -2505,21 +2505,28 @@ def _remove_from_associated_collections(self, auth=None, force=False): force=True ) - def _get_addon_from_gv(self, gv_pk, requesting_user_id, auth=None): + def _get_addons_from_gv_without_caching(self, gv_pk, requesting_user_id, auth=None): + requesting_user = OSFUser.load(requesting_user_id) + services = gv_translations.get_external_services(requesting_user) + for service in services: + if service.short_name == gv_pk: + break + else: + return [] + + return self._get_addons_from_gv(requesting_user_id, service.type, auth=auth) + + def _get_addon_from_gv(self, gv_pk, requesting_user_id, auth=None, cached=True): request = get_current_request() # This is to avoid making multiple requests to GV # within the lifespan of one request on the OSF side - try: - gv_addons = request.gv_addons - except AttributeError: - requesting_user = OSFUser.load(requesting_user_id) - services = gv_translations.get_external_services(requesting_user) - for service in services: - if service.short_name == gv_pk: - break - else: - return None - gv_addons = request.gv_addons = self._get_addons_from_gv(requesting_user_id, service.type, auth=auth) + if cached: + try: + gv_addons = request.gv_addons + except AttributeError: + gv_addons = request.gv_addons = self._get_addons_from_gv_without_caching(gv_pk, requesting_user_id, auth=auth) + else: + gv_addons = self._get_addons_from_gv_without_caching(gv_pk, requesting_user_id, auth=auth) for item in gv_addons: if item.short_name == gv_pk: diff --git a/osf_tests/test_gv_session_optimization.py b/osf_tests/test_gv_session_optimization.py index 5fdccffdc10..b94451e339d 100644 --- a/osf_tests/test_gv_session_optimization.py +++ b/osf_tests/test_gv_session_optimization.py @@ -376,7 +376,8 @@ def test_get_addon_uses_auth_user_id_when_request_user_id_is_none( mock_get_addon_from_gv.assert_called_once_with( gv_pk='github', requesting_user_id=user._id, - auth=auth + auth=auth, + cached=True ) assert result == mock_addon @@ -402,7 +403,8 @@ def test_get_addon_uses_request_user_id_when_available( mock_get_addon_from_gv.assert_called_once_with( gv_pk='github', requesting_user_id=request_user_id, - auth=auth + auth=auth, + cached=True ) assert result == mock_addon @@ -425,7 +427,8 @@ def test_get_addon_handles_none_auth_gracefully( mock_get_addon_from_gv.assert_called_once_with( gv_pk='github', requesting_user_id=None, - auth=None + auth=None, + cached=True ) assert result == mock_addon @@ -464,7 +467,8 @@ def test_get_addon_with_auth_user_none_falls_back_to_request_user_id( mock_get_addon_from_gv.assert_called_once_with( gv_pk='github', requesting_user_id=request_user_id, - auth=auth + auth=auth, + cached=True ) assert result == mock_addon From 62f581328a1217e1e5f50bd54b8e83b21fbc6188 Mon Sep 17 00:00:00 2001 From: antkryt Date: Wed, 25 Feb 2026 17:52:17 +0200 Subject: [PATCH 18/31] [Rebase] [ENG-9177] Removed ember (#11531) * removed ember mentions of ember in docker and readme * removed ember-related constants, flags, tests and functionality * fixed redirects to unexisting index and dashboard flask views * fixed redirects * added redirect for removed views * removed assert for duplicated redirect as it'll be handled by angular * fix imports after notification refactor * fix tests * remove edit_draft_registration_page and new_draft_registration views --------- Co-authored-by: Ihor Sokhan --- README-docker-compose.md | 22 +- addons/base/views.py | 6 +- addons/osfstorage/tests/test_views.py | 34 +-- addons/wiki/views.py | 3 - api/sparse/serializers.py | 4 +- .../views/test_user_confirm_external_login.py | 2 +- docker-compose-dist.override.yml | 74 ------ docker-compose.yml | 32 --- framework/auth/campaigns.py | 4 +- framework/auth/views.py | 29 +-- framework/sessions/__init__.py | 2 +- osf/features.yaml | 145 +---------- osf_tests/test_guid.py | 238 ------------------ osf_tests/test_user.py | 4 +- tests/test_addons.py | 76 +----- tests/test_auth.py | 20 +- tests/test_auth_basic_auth.py | 2 +- tests/test_auth_views.py | 18 +- tests/test_campaigns.py | 2 +- tests/test_comfirmation_view_block_bing.py | 4 +- tests/test_ember_osf_web.py | 59 ----- tests/test_misc_views.py | 40 +-- tests/test_preprints.py | 14 -- tests/test_project_contributor_views.py | 4 +- tests/test_registrations/test_views.py | 31 --- tests/test_webtests.py | 10 +- website/conferences/views.py | 4 - website/ember_osf_web/__init__.py | 0 website/ember_osf_web/decorators.py | 22 -- website/ember_osf_web/views.py | 26 -- website/institutions/__init__.py | 0 website/institutions/views.py | 7 - website/preprints/views.py | 3 - website/profile/views.py | 14 -- website/project/metadata/utils.py | 1 - website/project/views/contributor.py | 8 +- website/project/views/drafts.py | 59 +---- website/project/views/file.py | 7 - website/project/views/node.py | 14 +- website/project/views/register.py | 7 - website/registries/views.py | 9 - website/reviews/views.py | 2 - website/routes.py | 178 +------------ website/search/views.py | 3 - website/settings/defaults.py | 6 - website/settings/local-ci.py | 15 -- website/settings/local-dist.py | 23 -- website/templates/base.mako | 2 +- .../project/edit_draft_registration.mako | 94 ------- website/templates/public/forgot_password.mako | 2 +- .../public/pages/preprint_landing.mako | 19 -- .../public/pages/registries_landing.mako | 19 -- .../public/pages/reviews_landing.mako | 19 -- website/views.py | 72 ++---- 54 files changed, 110 insertions(+), 1404 deletions(-) delete mode 100644 tests/test_ember_osf_web.py delete mode 100644 website/ember_osf_web/__init__.py delete mode 100644 website/ember_osf_web/decorators.py delete mode 100644 website/ember_osf_web/views.py delete mode 100644 website/institutions/__init__.py delete mode 100644 website/institutions/views.py delete mode 100644 website/reviews/views.py delete mode 100644 website/templates/project/edit_draft_registration.mako delete mode 100644 website/templates/public/pages/preprint_landing.mako delete mode 100644 website/templates/public/pages/registries_landing.mako delete mode 100644 website/templates/public/pages/reviews_landing.mako diff --git a/README-docker-compose.md b/README-docker-compose.md index 57aeb8f6be7..47b0653ef2e 100644 --- a/README-docker-compose.md +++ b/README-docker-compose.md @@ -171,7 +171,7 @@ - When starting with an empty database you will need to run migrations and populate preprint providers. See the [Running arbitrary commands](#running-arbitrary-commands) section below for instructions. 6. Start the OSF Web, API Server, and Preprints (Detached) ```bash - docker compose up -d worker web api admin preprints ember_osf_web gv + docker compose up -d worker web api admin preprints gv ``` 7. View the OSF at [http://localhost:5000](http://localhost:5000). @@ -181,7 +181,7 @@ - Once the requirements have all been installed, you can start the OSF in the background with ```bash - docker compose up -d assets admin_assets mfr wb fakecas sharejs worker web api admin preprints ember_osf_web gv + docker compose up -d assets admin_assets mfr wb fakecas sharejs worker web api admin preprints gv ``` - To view the logs for a given container: @@ -270,20 +270,10 @@ ```bash docker compose run --rm web python3 -m scripts.parse_citation_styles ``` -- Populate Notification Types - - Needed for notifications. - ```bash - docker compose run --rm web python3 manage.py populate_notification_types - ``` - - _NOTE: The waffle switch `POPULATE_NOTIFICATION_TYPES` needs to be turned on. -- Start ember_osf_web - - Needed for ember app: - - `docker-compose up -d ember_osf_web` - OPTIONAL: Register OAuth Scopes - - Needed for things such as the ember-osf dummy app - ```bash - docker compose run --rm web python3 -m scripts.register_oauth_scopes - ``` + ```bash + docker compose run --rm web python3 -m scripts.register_oauth_scopes + ``` - OPTIONAL: Create migrations: - After changing a model you will need to create migrations and apply them. Migrations are python code that changes either the structure or the data of a database. This will compare the django models on disk to the database, find the differences, and create migration code to change the database. If there are no changes this command is a noop. ```bash @@ -506,4 +496,4 @@ wb: ### Running Collections -To run collections, you must uncomment COLLECTIONS_ENABLED=true in docker-compose.yml under ember_osf_web, then recreate your ember and web containers. +To run collections, you must uncomment COLLECTIONS_ENABLED=true in docker-compose.yml, then recreate web container. diff --git a/addons/base/views.py b/addons/base/views.py index 92f930c085b..22009cc1d9e 100644 --- a/addons/base/views.py +++ b/addons/base/views.py @@ -929,12 +929,12 @@ def addon_view_or_download_file(auth, path, provider, **kwargs): ) ) - # There's no download action redirect to the Ember front-end file view and create guid. + # There's no download action redirect to the front-end file view and create guid. if action != 'download': - if isinstance(target, Node) and flag_is_active(request, features.EMBER_FILE_PROJECT_DETAIL): + if isinstance(target, Node): guid = file_node.get_guid(create=True) return redirect(f'{settings.DOMAIN}{guid._id}/') - if isinstance(target, Registration) and flag_is_active(request, features.EMBER_FILE_REGISTRATION_DETAIL): + if isinstance(target, Registration): guid = file_node.get_guid(create=True) return redirect(f'{settings.DOMAIN}{guid._id}/') diff --git a/addons/osfstorage/tests/test_views.py b/addons/osfstorage/tests/test_views.py index 23df3a136fd..16d928e3343 100644 --- a/addons/osfstorage/tests/test_views.py +++ b/addons/osfstorage/tests/test_views.py @@ -36,7 +36,6 @@ from osf_tests.factories import ProjectFactory, ApiOAuth2PersonalTokenFactory, PreprintFactory from website.files.utils import attach_versions -from website.settings import EXTERNAL_EMBER_APPS from api_tests.draft_nodes.views.test_draft_node_files_lists import prepare_mock_wb_response @@ -1413,28 +1412,17 @@ def test_file_view_updates_history(self): {'name': 'testpath', 'path': '/testpath', 'materialized': '/testpath', 'kind': 'file'}, ] ) - with override_flag(features.EMBER_FILE_PROJECT_DETAIL, active=True): - url = self.node.web_url_for('addon_view_or_download_file', path='testpath', provider='github') - self.app.get(url, auth=self.user.auth) - file = GithubFile.objects.get(_path='/testpath', provider='github') - assert file.history - - @mock.patch('website.views.stream_emberapp') - def test_file_views(self, mock_ember): - with override_flag(features.EMBER_FILE_PROJECT_DETAIL, active=True): - file = create_test_file(target=self.node, user=self.user) - url = self.node.web_url_for('addon_view_or_download_file', path=file._id, provider=file.provider) - res = self.app.get(url, auth=self.user.auth) - assert res.status_code == 302 - assert res.headers['Location'] == f'{settings.DOMAIN}{file.get_guid()._id}/' - assert not mock_ember.called - res = self.app.get(url, auth=self.user.auth, follow_redirects=True) - assert res.status_code == 200 - assert mock_ember.called - args, kwargs = mock_ember.call_args - - assert args[0] == EXTERNAL_EMBER_APPS['ember_osf_web']['server'] - assert args[1] == EXTERNAL_EMBER_APPS['ember_osf_web']['path'].rstrip('/') + url = self.node.web_url_for('addon_view_or_download_file', path='testpath', provider='github') + self.app.get(url, auth=self.user.auth) + file = GithubFile.objects.get(_path='/testpath', provider='github') + assert file.history + + def test_file_views(self): + file = create_test_file(target=self.node, user=self.user) + url = self.node.web_url_for('addon_view_or_download_file', path=file._id, provider=file.provider) + res = self.app.get(url, auth=self.user.auth) + assert res.status_code == 302 + assert res.headers['Location'] == f'{settings.DOMAIN}{file.get_guid()._id}/' def test_download_file(self): file = create_test_file(target=self.node, user=self.user) diff --git a/addons/wiki/views.py b/addons/wiki/views.py index 11009c10b07..fed244cd97d 100644 --- a/addons/wiki/views.py +++ b/addons/wiki/views.py @@ -13,11 +13,9 @@ from addons.wiki import settings from addons.wiki import utils as wiki_utils from addons.wiki.models import WikiPage, WikiVersion -from osf import features from website.profile.utils import get_profile_image_url from website.project.views.node import _view_project from website.project.model import has_anonymous_link -from website.ember_osf_web.decorators import ember_flag_is_active from website.project.decorators import ( must_be_contributor_or_public, must_have_addon, must_not_be_registration, @@ -358,7 +356,6 @@ def get_node_wiki_permissions(node, auth, **kwargs): @must_be_valid_project @must_have_addon('wiki', 'node') -@ember_flag_is_active(features.EMBER_PROJECT_WIKI) def project_wiki_home(**kwargs): node = kwargs['node'] or kwargs['project'] return redirect(node.web_url_for('project_wiki_view', wname='home', _guid=True)) diff --git a/api/sparse/serializers.py b/api/sparse/serializers.py index a085b7344ec..97142771296 100644 --- a/api/sparse/serializers.py +++ b/api/sparse/serializers.py @@ -23,7 +23,7 @@ class SparseNodeSerializer(NodeSerializer): 'contributors', ]) links = LinksField({ - 'self': 'get_absolute_url', # self links will break ember data unless we make a specific sparse detail serializer + 'self': 'get_absolute_url', 'html': 'get_absolute_html_url', }) detail = RelationshipField( @@ -109,7 +109,7 @@ class SparseRegistrationSerializer(RegistrationSerializer): ]) links = LinksField({ - 'self': 'get_absolute_url', # self links will break ember data unless we make a specific sparse detail serializer + 'self': 'get_absolute_url', 'html': 'get_absolute_html_url', }) detail = RelationshipField( diff --git a/api_tests/users/views/test_user_confirm_external_login.py b/api_tests/users/views/test_user_confirm_external_login.py index bcac3fb1d6c..7a877017a96 100644 --- a/api_tests/users/views/test_user_confirm_external_login.py +++ b/api_tests/users/views/test_user_confirm_external_login.py @@ -34,7 +34,7 @@ def payload(self, user_one): 'attributes': { 'uid': user_one._id, 'token': user_one.get_confirmation_token(user_one.username), - 'destination': 'dashboard', + 'destination': 'my_projects', } } } diff --git a/docker-compose-dist.override.yml b/docker-compose-dist.override.yml index 7a35d24b27b..3a3c2fb8160 100644 --- a/docker-compose-dist.override.yml +++ b/docker-compose-dist.override.yml @@ -29,80 +29,6 @@ # volumes: # - ../modular-file-renderer:/code:cached -# preprints: -# volumes: -# - ../ember-osf-preprints:/code:cached -# -## # Use this for ember-osf linked development: -## - preprints_dist_vol:/code/dist -## - ../ember-osf:/ember-osf -## depends_on: -## - emberosf -## command: -## - /bin/bash -## - -c -## - cd /ember-osf && -## yarn link && -## cd /code && -## (rm -r node_modules || true) && -## yarn --frozen-lockfile && -## yarn link @centerforopenscience/ember-osf && -## (rm -r bower_components || true) && -## ./node_modules/.bin/bower install --allow-root --config.interactive=false && -## yarn start --host 0.0.0.0 --port 4201 --live-reload-port 41954 - -# registries: -# volumes: -# - ../ember-osf-registries:/code:cached -# -## # Use this for ember-osf linked development: -## - registries_dist_vol:/code/dist -## - ../ember-osf:/ember-osf -## depends_on: -## - emberosf -## command: -## - /bin/bash -## - -c -## - cd /ember-osf && -## yarn link && -## cd /code && -## (rm -r node_modules || true) && -## yarn --frozen-lockfile && -## yarn link @centerforopenscience/ember-osf && -## yarn start --host 0.0.0.0 --port 4202 --live-reload-port 41955 - -# reviews: -# volumes: -# - ../ember-osf-reviews:/code:cached -# -## # Use this for ember-osf linked development: -## - reviews_dist_vol:/code/dist -## - ../ember-osf:/ember-osf -## depends_on: -## - emberosf -## command: -## - /bin/bash -## - -c -## - cd /ember-osf && -## yarn link && -## cd /code && -## yarn link @centerforopenscience/ember-osf && -## yarn --frozen-lockfile && -## yarn start --host 0.0.0.0 --port 4203 --live-reload-port 41956 - -# # Use this for ember-osf linked development: -# emberosf: -# build: ../ember-osf -# command: -# - /bin/bash -# - -c -# - (rm -r node_modules || true) && -# yarn --frozen-lockfile --ignore-engines && -# (rm -r bower_components || true) && -# ./node_modules/.bin/bower install --allow-root --config.interactive=false -# volumes: -# - ../ember-osf/:/code:nocopy - # #################### # # RabbitMQ SSL # # Enable this, place the certs in ./ssl, and uncomment the BROKER_USE_SSL dictionary in local.py diff --git a/docker-compose.yml b/docker-compose.yml index f00b589f7e0..9914c24728b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,8 +15,6 @@ volumes: external: false rabbitmq_vol: external: false - ember_osf_web_dist_vol: - external: false preprints_dist_vol: external: false reviews_dist_vol: @@ -255,35 +253,6 @@ services: - postgres stdin_open: true - - ################# - # Ember OSF Web # - ################# - - ember_osf_web: - image: quay.io/centerforopenscience/osf-web:develop-local - command: yarn run start --path dist --host 0.0.0.0 --port 4200 --live-reload-port 41953 - restart: unless-stopped - depends_on: - - api - - web - environment: - # Uncomment below to enable collections on ember - # - COLLECTIONS_ENABLED=true - - BACKEND=local - - SHARE_BASE_URL=http://localhost:8003/ - - SHARE_API_URL=http://localhost:8003/api/v2 - - SHARE_SEARCH_URL=http://localhost:8003/api/v2/search/creativeworks/_search - expose: - - 4200 - - 41953 - ports: - - 4200:4200 - - 41953:41953 - volumes: - - ember_osf_web_dist_vol:/code/dist - stdin_open: true - ############# # Preprints # ############# @@ -523,7 +492,6 @@ services: - osf_requirements_3_12_vol:/usr/local/lib/python3.12/ - osf_bower_components_vol:/code/website/static/vendor/bower_components - osf_node_modules_vol:/code/node_modules - - ember_osf_web_dist_vol:/ember_osf_web - preprints_dist_vol:/preprints - reviews_dist_vol:/reviews stdin_open: true diff --git a/framework/auth/campaigns.py b/framework/auth/campaigns.py index 307413c779c..93ff9ccca4f 100644 --- a/framework/auth/campaigns.py +++ b/framework/auth/campaigns.py @@ -95,7 +95,7 @@ def get_campaigns(): newest_campaigns.update({ 'agu_conference_2023': { 'system_tag': CampaignSourceTags.AguConference2023.value, - 'redirect_url': furl(DOMAIN).add(path='dashboard/').url, + 'redirect_url': furl(DOMAIN).add(path='my_projects/').url, 'confirmation_email_template': NotificationType.Type.USER_CAMPAIGN_CONFIRM_EMAIL_AGU_CONFERENCE_2023, 'login_type': 'native', } @@ -104,7 +104,7 @@ def get_campaigns(): newest_campaigns.update({ 'agu_conference': { 'system_tag': CampaignSourceTags.AguConference.value, - 'redirect_url': furl(DOMAIN).add(path='dashboard/').url, + 'redirect_url': furl(DOMAIN).add(path='my_projects/').url, 'confirmation_email_template': NotificationType.Type.USER_CAMPAIGN_CONFIRM_EMAIL_AGU_CONFERENCE, 'login_type': 'native', } diff --git a/framework/auth/views.py b/framework/auth/views.py index 0338654fac3..c8a41b795f6 100644 --- a/framework/auth/views.py +++ b/framework/auth/views.py @@ -35,8 +35,6 @@ from osf.models.tag import Tag from osf.utils.requests import check_select_for_update from website.util.metrics import CampaignClaimedTags, CampaignSourceTags -from website.ember_osf_web.decorators import ember_flag_is_active -from osf import features @block_bing_preview @@ -85,8 +83,8 @@ def _reset_password_get(auth, uid=None, token=None, institutional=False): } raise HTTPError(http_status.HTTP_400_BAD_REQUEST, data=error_data) - # override routes.py login_url to redirect to dashboard - service_url = web_url_for('dashboard', _absolute=True) + # override routes.py login_url to redirect to myprojects + service_url = web_url_for('my_projects', _absolute=True) return { 'uid': user_obj._id, @@ -176,9 +174,9 @@ def forgot_password_get(auth): if auth.logged_in: return auth_logout(redirect_url=request.url) - #overriding the routes.py sign in url to redirect to the dashboard after login + #overriding the routes.py sign in url to redirect to the myprojects after login context = {} - context['login_url'] = web_url_for('dashboard', _absolute=True) + context['login_url'] = web_url_for('my_projects', _absolute=True) return context @@ -328,7 +326,7 @@ def login_and_register_handler(auth, login=True, campaign=None, next_url=None, l # unlike other campaigns, institution login serves as an alternative for authentication if campaign == 'institution': if next_url is None: - next_url = web_url_for('dashboard', _absolute=True) + next_url = web_url_for('my_projects', _absolute=True) data['status_code'] = http_status.HTTP_302_FOUND if auth.logged_in: data['next_url'] = next_url @@ -395,7 +393,7 @@ def login_and_register_handler(auth, login=True, campaign=None, next_url=None, l # `/login/` or `/register/` without any parameter if auth.logged_in: data['status_code'] = http_status.HTTP_302_FOUND - data['next_url'] = web_url_for('dashboard', _absolute=True) + data['next_url'] = web_url_for('my_projects', _absolute=True) return data @@ -412,7 +410,7 @@ def auth_login(auth): if campaign and logged out, go to campaign register page (with next_url if presents) if next_url and logged in, go to next url if next_url and logged out, go to cas login page with current request url as service parameter - if none, go to `/dashboard` which is decorated by `@must_be_logged_in` + if none, go to `/myprojects` which is decorated by `@must_be_logged_in` :param auth: the auth context :return: redirects @@ -427,7 +425,6 @@ def auth_login(auth): @collect_auth -@ember_flag_is_active(features.EMBER_AUTH_REGISTER) def auth_register(auth): """ View for OSF register. Land on the register page, redirect or go to `auth_logout` @@ -440,7 +437,7 @@ def auth_register(auth): if next_url and logged in, go to next url if next_url and logged out, go to cas login page with current request url as service parameter if next_url and logout flag, log user out first and then go to the next_url - if none, go to `/dashboard` which is decorated by `@must_be_logged_in` + if none, go to `/myprojects` which is decorated by `@must_be_logged_in` :param auth: the auth context :return: land, redirect or `auth_logout` @@ -550,7 +547,7 @@ def auth_email_logout(token, user): When a user is adding an email or merging an account, add the email to the user and log them out. """ - redirect_url = cas.get_logout_url(service_url=cas.get_login_url(service_url=web_url_for('index', _absolute=True))) + redirect_url = cas.get_logout_url(service_url=cas.get_login_url(service_url=web_url_for('auth_login', _absolute=True))) try: unconfirmed_email = user.get_unconfirmed_email_for_token(token) except InvalidTokenError: @@ -619,7 +616,7 @@ def external_login_confirm_email_get(auth, uid, token): return redirect(campaign_url) if new: status.push_status_message(language.WELCOME_MESSAGE, kind='default', jumbotron=True, trust=True, id='welcome_message') - return redirect(web_url_for('dashboard')) + return redirect(web_url_for('my_projects')) # token is invalid if token not in user.email_verifications: @@ -719,7 +716,7 @@ def confirm_email_get(token, auth=None, **kwargs): status.push_status_message(language.WELCOME_MESSAGE, kind='default', jumbotron=True, trust=True, id='welcome_message') if token in auth.user.email_verifications: status.push_status_message(language.CONFIRM_ALTERNATE_EMAIL_ERROR, kind='danger', trust=True, id='alternate_email_error') - return redirect(web_url_for('index')) + return redirect(web_url_for('my_projects')) status.push_status_message(language.MERGE_COMPLETE, kind='success', trust=False) return redirect(web_url_for('user_account')) @@ -1002,7 +999,7 @@ def resend_confirmation_post(auth): try: send_confirm_email(user, clean_email, renew=True) except KeyError: - # already confirmed, redirect to dashboard + # already confirmed, redirect to myprojects status_message = f'This email {clean_email} has already been confirmed.' kind = 'warning' user.email_last_sent = timezone.now() @@ -1062,7 +1059,7 @@ def external_login_email_post(): service_url = session.get('service_url', None) # TODO: @cslzchen use user tags instead of destination - destination = 'dashboard' + destination = 'my_projects' for campaign in campaigns.get_campaigns(): if campaign != 'institution': # Handle different url encoding schemes between `furl` and `urlparse/urllib`. diff --git a/framework/sessions/__init__.py b/framework/sessions/__init__.py index 21dc850cb53..5891cb6d69f 100644 --- a/framework/sessions/__init__.py +++ b/framework/sessions/__init__.py @@ -216,7 +216,7 @@ def before_request(): try: user_session = flask_get_session_from_cookie(cookie) except InvalidCookieOrSessionError: - response = redirect(web_url_for('index')) + response = redirect(web_url_for('auth_login')) response.delete_cookie(settings.COOKIE_NAME, domain=settings.OSF_COOKIE_DOMAIN) return response # Case 1: anonymous session that is used for first time external (e.g. ORCiD) login only diff --git a/osf/features.yaml b/osf/features.yaml index 00a792b4933..cce490a25a4 100644 --- a/osf/features.yaml +++ b/osf/features.yaml @@ -9,7 +9,7 @@ # 3. Use the admin app to enable/disable the flag/switch at your convenience # 4. When feature is complete add the activity status (active or everyone) to the value it will have in production until # the old flipping code can be removed. -# 5. When a flag name is no longer referenced anywhere in this repo or in the Ember app remove it from this list. +# 5. When a flag name is no longer referenced anywhere in this repo remove it from this list. flags: - flag_name: MANUAL_DOI_AND_GUID @@ -21,18 +21,7 @@ flags: - flag_name: ENABLE_GV name: gravy_waffle note: This is used to enable GravyValet, the system responsible for addons, this will remove the files widget on the - project overview page. Will be used with EMBER_USER_SETTINGS_ADDONS and EMBER_NODE_SETTINGS_ADDONS to flip all - UI elements to the new addons system. - everyone: true - - - flag_name: EMBER_FILE_PROJECT_DETAIL - name: ember_file_project_detail_page - note: This is part of the upcoming files page redesign - everyone: true - - - flag_name: EMBER_PROJECT_FILES - name: ember_project_files_page - note: This is part of the upcoming files page redesign + project overview page. everyone: true - flag_name: STORAGE_USAGE @@ -60,136 +49,6 @@ flags: note: Indicates whether EGAP admins have special access to custom schemas everyone: true - - flag_name: EMBER_AUTH_REGISTER - name: ember_auth_register - note: This indicates whether this view is routed for OSF register, redirect or go to `auth_logout` - everyone: true - - - flag_name: EMBER_PROJECT_DETAIL - name: ember_project_detail_page - note: This flag controls whether the project overview page is routed to the ember app - everyone: false - - - flag_name: EMBER_CREATE_DRAFT_REGISTRATION - name: ember_create_draft_registration_page - note: This flag controls whether POST requests to /project//registrations/ and - /project//node//registrations/ are routed to the ember app - everyone: false - - - flag_name: EMBER_MEETING_DETAIL - name: ember_meeting_detail_page - note: This flag controls whether the `conference_results` view routes to the Ember app - everyone: true - - - flag_name: EMBER_MY_PROJECTS - name: ember_my_projects_page - note: This flag controls whether the `My Projects Page` view routes to the Ember app - everyone: false - - - flag_name: EMBER_PROJECT_CONTRIBUTORS - name: ember_project_contributors_page - note: This flag controls whether the `Node Contributor Page` view routes to the Ember app - everyone: false - - - flag_name: EMBER_PROJECT_SETTINGS - name: ember_project_settings_page - note: This flag controls whether the `Node Settings Page` view routes to the Ember app - everyone: false - - - flag_name: EMBER_PROJECT_WIKI - name: ember_project_wiki_page - note: This flag controls whether the `Project Wiki Home Page` view routes to the Ember app - everyone: false - - - flag_name: EMBER_REGISTRATION_FORM_DETAIL - name: ember_registration_form_detail_page - note: This flag controls whether the `Node Register Template Page` view routes to the Ember app - everyone: false - - - flag_name: EMBER_SEARCH_PAGE - name: ember_search_page - note: This flag controls whether the `Search Page` view routes to the Ember app - everyone: true - - - flag_name: EMBER_USER_PROFILE - name: ember_user_profile_page - note: This flag controls whether the `User Profile Page` view routes to the Ember app - everyone: false - - - flag_name: EMBER_USER_SETTINGS - name: ember_user_settings_page - note: This flag controls whether the `User Settings Page` view routes to the Ember app - everyone: false - - - flag_name: EMBER_USER_SETTINGS_NOTIFICATIONS - name: ember_user_settings_notifications_page - note: This flag controls whether the `User Notifications Page` view routes to the Ember app - everyone: false - - - flag_name: EMBER_MEETINGS - name: ember_meetings_page - note: This is complete and should be permanently on. - everyone: true - - - flag_name: EMBER_EDIT_DRAFT_REGISTRATION - name: ember_edit_draft_registration_page - note: This is complete and should be permanently on. - everyone: true - - - flag_name: EMBER_FILE_REGISTRATION_DETAIL - name: ember_file_registration_detail_page - note: This is complete and should be permanently on. - everyone: true - - - flag_name: EMBER_REGISTRATION_FILES - name: ember_registration_files_page - note: This is complete and should be permanently on. - everyone: true - - - flag_name: EMBER_REGISTRIES_DETAIL_PAGE - name: ember_registries_detail_page - note: This is complete and should be permanently on. - everyone: true - - - flag_name: EMBER_USER_SETTINGS_ACCOUNTS - name: ember_user_settings_account_page - note: This is complete and should be permanently on. - everyone: true - - - flag_name: EMBER_USER_SETTINGS_APPS - name: ember_user_settings_apps_page - note: This is complete and should be permanently on. - everyone: true - - - flag_name: EMBER_USER_SETTINGS_TOKENS - name: ember_user_settings_tokens_page - note: This is complete and should be permanently on. - everyone: true - - - flag_name: EMBER_AB_TESTING_HOME_PAGE_VERSION_B - name: ab_testing_home_page_version_b - note: This is no longer used. - - - flag_name: EMBER_AB_TESTING_HOME_PAGE_HERO_TEXT_VERSION_B - name: ab_testing_home_page_hero_text_version_b - note: This is no longer used. - everyone: true - - - flag_name: EMBER_PROJECT_ANALYTICS - name: ember_project_analytics_page - note: This is no longer used. - everyone: false - - - flag_name: EMBER_PROJECT_FORKS - name: ember_project_forks_page - note: This is no longer used. - everyone: false - - - flag_name: EMBER_PROJECT_REGISTRATIONS - name: ember_project_registrations_page - note: This is no longer used. - everyone: false - - flag_name: ENABLE_CHRONOS name: enable_chronos note: This is not used diff --git a/osf_tests/test_guid.py b/osf_tests/test_guid.py index 1eb7ceea9ee..276ceecb05a 100644 --- a/osf_tests/test_guid.py +++ b/osf_tests/test_guid.py @@ -1,14 +1,11 @@ from unittest import mock -from urllib.parse import quote -from django.utils import timezone from django.core.exceptions import MultipleObjectsReturned import pytest from framework.auth import Auth from osf.models import Guid, GuidVersionsThrough, NodeLicenseRecord, OSFUser, Preprint from osf.models.base import VersionedGuidMixin -from osf.utils.permissions import ADMIN from osf_tests.factories import ( AuthUserFactory, NodeFactory, @@ -19,9 +16,6 @@ UserFactory, ) from tests.base import OsfTestCase -from tests.test_websitefiles import TestFile -from tests.utils import capture_notifications -from website.settings import MFR_SERVER_URL, WATERBUTLER_URL @pytest.mark.django_db @@ -235,238 +229,6 @@ def test_resolve_guid_private_request_access_or_redirect_to_cas(self): assert res.status_code == 403 assert 'OSF | Request Access' in res.text - def test_resolve_guid_download_file(self): - pp = PreprintFactory(finish=True) - - res = self.app.get(pp.url + 'download') - assert res.status_code == 302 - assert f'{WATERBUTLER_URL}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}?action=download&direct&version=1' in res.location - - res = self.app.get(pp.url + 'download/') - assert res.status_code == 302 - assert f'{WATERBUTLER_URL}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}?action=download&direct&version=1' in res.location - - res = self.app.get(f'/{pp.primary_file.get_guid(create=True)._id}/download') - assert res.status_code == 302 - assert f'{WATERBUTLER_URL}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}?action=download&direct&version=1' in res.location - - pp.primary_file.create_version( - creator=pp.creator, - location={'folder': 'osf', 'object': 'deadbe', 'service': 'cloud'}, - metadata={'contentType': 'img/png', 'size': 9001} - ) - pp.primary_file.save() - - res = self.app.get(pp.url + 'download/') - assert res.status_code == 302 - assert f'{WATERBUTLER_URL}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}?action=download&direct&version=2' in res.location - - res = self.app.get(pp.url + 'download/?version=1') - assert res.status_code == 302 - assert f'{WATERBUTLER_URL}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}?version=1&action=download&direct' in res.location - - unpub_pp = PreprintFactory(project=self.node, is_published=False) - res = self.app.get(unpub_pp.url + 'download/?version=1', auth=unpub_pp.creator.auth) - assert res.status_code == 302 - assert f'{WATERBUTLER_URL}/v1/resources/{unpub_pp._id}/providers/{unpub_pp.primary_file.provider}{unpub_pp.primary_file.path}?version=1&action=download&direct' in res.location - - @mock.patch('website.settings.USE_EXTERNAL_EMBER', True) - @mock.patch('website.settings.EXTERNAL_EMBER_APPS', { - 'preprints': { - 'server': 'http://localhost:4200', - 'path': '/preprints/' - }, - }) - def test_resolve_guid_download_file_from_emberapp_preprints(self): - provider = PreprintProviderFactory(_id='sockarxiv', name='Sockarxiv') - pp = PreprintFactory(finish=True, provider=provider) - assert pp.url.startswith('/preprints/sockarxiv') - - res = self.app.get(pp.url + 'download') - assert res.status_code == 302 - assert f'{WATERBUTLER_URL}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}?action=download&direct&version=1' in res.location - - res = self.app.get(pp.url + 'download/') - assert res.status_code == 302 - assert f'{WATERBUTLER_URL}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}?action=download&direct&version=1' in res.location - - @mock.patch('website.settings.USE_EXTERNAL_EMBER', True) - @mock.patch('website.settings.EXTERNAL_EMBER_APPS', { - 'preprints': { - 'server': 'http://localhost:4200', - 'path': '/preprints/' - }, - }) - def test_resolve_guid_download_file_from_emberapp_preprints_unpublished(self): - # non-branded domains - provider = PreprintProviderFactory(_id='sockarxiv', name='Sockarxiv', reviews_workflow='pre-moderation') - - # branded domains - branded_provider = PreprintProviderFactory(_id='spot', name='Spotarxiv', reviews_workflow='pre-moderation') - branded_provider.allow_submissions = False - branded_provider.domain = 'https://www.spotarxiv.com' - branded_provider.description = 'spots not dots' - branded_provider.domain_redirect_enabled = True - branded_provider.share_publish_type = 'Thesis' - branded_provider.save() - - # test_provider_submitter_can_download_unpublished - submitter = AuthUserFactory() - pp = PreprintFactory(finish=True, provider=provider, is_published=False, creator=submitter) - with capture_notifications(): - pp.run_submit(submitter) - pp_branded = PreprintFactory(finish=True, provider=branded_provider, is_published=False, filename='preprint_file_two.txt', creator=submitter) - with capture_notifications(): - pp_branded.run_submit(submitter) - - res = self.app.get(f'{pp.url}download', auth=submitter.auth) - assert res.status_code == 302 - assert f'{WATERBUTLER_URL}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}?action=download&direct&version=1' in res.location - - res = self.app.get(f'{pp_branded.url}download', auth=submitter.auth) - assert res.status_code == 302 - - # test_provider_super_user_can_download_unpublished - super_user = AuthUserFactory() - super_user.is_superuser = True - super_user.save() - - res = self.app.get(f'{pp.url}download', auth=super_user.auth) - assert res.status_code == 302 - assert f'{WATERBUTLER_URL}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}?action=download&direct&version=1' in res.location - - res = self.app.get(f'{pp_branded.url}download', auth=super_user.auth) - assert res.status_code == 302 - - # test_provider_moderator_can_download_unpublished - moderator = AuthUserFactory() - provider.add_to_group(moderator, 'moderator') - provider.save() - - res = self.app.get(f'{pp.url}download', auth=moderator.auth) - assert res.status_code == 302 - assert f'{WATERBUTLER_URL}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}?action=download&direct&version=1' in res.location - - branded_provider.add_to_group(moderator, 'moderator') - branded_provider.save() - - res = self.app.get(f'{pp_branded.url}download', auth=moderator.auth) - assert res.status_code == 302 - - # test_provider_admin_can_download_unpublished - admin = AuthUserFactory() - provider.add_to_group(admin, ADMIN) - provider.save() - - res = self.app.get(f'{pp.url}download', auth=admin.auth) - assert res.status_code == 302 - assert f'{WATERBUTLER_URL}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}?action=download&direct&version=1' in res.location - - branded_provider.add_to_group(admin, ADMIN) - branded_provider.save() - - res = self.app.get(f'{pp_branded.url}download', auth=admin.auth) - assert res.status_code == 302 - - def test_resolve_guid_download_file_export(self): - pp = PreprintFactory(finish=True) - - res = self.app.get(pp.url + 'download?format=asdf') - assert res.status_code == 302 - assert f'{MFR_SERVER_URL}/export?format=asdf&url=' in res.location - assert f'{quote(WATERBUTLER_URL)}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}%3Fformat%3Dasdf%26action%3Ddownload%26direct%26version%3D1' in res.location - - res = self.app.get(pp.url + 'download/?format=asdf') - assert res.status_code == 302 - assert f'{MFR_SERVER_URL}/export?format=asdf&url=' in res.location - assert f'{quote(WATERBUTLER_URL)}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}%3Fformat%3Dasdf%26action%3Ddownload%26direct%26version%3D1' in res.location - - res = self.app.get(f'/{pp.primary_file.get_guid(create=True)._id}/download?format=asdf') - assert res.status_code == 302 - assert f'{MFR_SERVER_URL}/export?format=asdf&url=' in res.location - - assert f'{quote(WATERBUTLER_URL)}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}%3Fformat%3Dasdf%26action%3Ddownload%26direct%26version%3D1' in res.location - - res = self.app.get(f'/{pp.primary_file.get_guid(create=True)._id}/download/?format=asdf') - assert res.status_code == 302 - assert f'{MFR_SERVER_URL}/export?format=asdf&url=' in res.location - - assert f'{quote(WATERBUTLER_URL)}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}%3Fformat%3Dasdf%26action%3Ddownload%26direct%26version%3D1' in res.location - - pp.primary_file.create_version( - creator=pp.creator, - location={'folder': 'osf', 'object': 'deadbe', 'service': 'cloud'}, - metadata={'contentType': 'img/png', 'size': 9001} - ) - pp.primary_file.save() - - res = self.app.get(pp.url + 'download/?format=asdf') - assert res.status_code == 302 - assert f'{MFR_SERVER_URL}/export?format=asdf&url=' in res.location - assert f'{quote(WATERBUTLER_URL)}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}%3F' in res.location - quarams = res.location.split('%3F')[1].split('%26') - assert 'action%3Ddownload' in quarams - assert 'version%3D2' in quarams - assert 'direct' in quarams - - res = self.app.get(pp.url + 'download/?format=asdf&version=1') - assert res.status_code == 302 - assert f'{MFR_SERVER_URL}/export?format=asdf&url=' in res.location - assert f'{quote(WATERBUTLER_URL)}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}%3F' in res.location - quarams = res.location.split('%3F')[1].split('%26') - assert 'action%3Ddownload' in quarams - assert 'version%3D1' in quarams - assert 'direct' in quarams - - unpub_pp = PreprintFactory(project=self.node, is_published=False) - res = self.app.get(unpub_pp.url + 'download?format=asdf', auth=unpub_pp.creator.auth) - assert res.status_code == 302 - assert res.status_code == 302 - assert f'{MFR_SERVER_URL}/export?format=asdf&url=' in res.location - assert f'{quote(WATERBUTLER_URL)}/v1/resources/{unpub_pp._id}/providers/{unpub_pp.primary_file.provider}{unpub_pp.primary_file.path}%3F' in res.location - quarams = res.location.split('%3F')[1].split('%26') - assert 'action%3Ddownload' in quarams - assert 'version%3D1' in quarams - assert 'direct' in quarams - - def test_resolve_guid_download_file_export_same_format_optimization(self): - pp = PreprintFactory(filename='test.pdf', finish=True) - - res = self.app.get(pp.url + 'download/?format=pdf') - assert res.status_code == 302 - assert f'{MFR_SERVER_URL}/export?' not in res.location - assert f'{WATERBUTLER_URL}/v1/resources/{pp._id}/providers/{pp.primary_file.provider}{pp.primary_file.path}?format=pdf&action=download&direct&version=1' in res.location - - def test_resolve_guid_download_errors(self): - testfile = TestFile.get_or_create(self.node, 'folder/path') - testfile.name = 'asdf' - testfile.materialized_path = '/folder/path' - guid = testfile.get_guid(create=True) - testfile.save() - testfile.delete() - res = self.app.get(f'/{guid}/download') - assert res.status_code == 404 - - pp = PreprintFactory(is_published=False) - res = self.app.get(pp.url + 'download') - assert res.status_code == 404 - - pp.is_published = True - pp.save() - pp.is_public = False - pp.save() - - non_contrib = AuthUserFactory() - - res = self.app.get(pp.url + 'download', auth=non_contrib.auth) - assert res.status_code == 403 - - pp.deleted = timezone.now() - pp.save() - - res = self.app.get(pp.url + 'download', auth=non_contrib.auth) - assert res.status_code == 410 - def test_resolve_guid_redirect_to_versioned_guid(self): pp = PreprintFactory(filename='test.pdf', finish=True) diff --git a/osf_tests/test_user.py b/osf_tests/test_user.py index 97d20db65d7..1846652f66a 100644 --- a/osf_tests/test_user.py +++ b/osf_tests/test_user.py @@ -507,8 +507,8 @@ def test_add_blocked_domain_unconfirmed_email(self, user): def test_get_confirmation_url_for_external_service(self, random_string): random_string.return_value = 'abcde' u = UnconfirmedUserFactory() - assert (u.get_confirmation_url(u.username, external_id_provider='service', destination='dashboard') == - f'{settings.DOMAIN}confirm/external/{u._id}/abcde/?destination=dashboard') + assert (u.get_confirmation_url(u.username, external_id_provider='service', destination='my_projects') == + f'{settings.DOMAIN}confirm/external/{u._id}/abcde/?destination=my_projects') @mock.patch('website.security.random_string') def test_get_confirmation_token(self, random_string): diff --git a/tests/test_addons.py b/tests/test_addons.py index 59aef22bfd3..f1686fbc56d 100644 --- a/tests/test_addons.py +++ b/tests/test_addons.py @@ -30,7 +30,6 @@ from addons.github.tests.factories import GitHubAccountFactory from addons.osfstorage.models import OsfStorageFileNode, OsfStorageFolder, OsfStorageFile from addons.osfstorage.tests.factories import FileVersionFactory -from osf import features from osf.models import files as file_models from osf.models.files import BaseFileNode, TrashedFileNode from osf.utils.permissions import WRITE, READ @@ -43,8 +42,6 @@ from api.caching.utils import storage_usage_cache from dateutil.parser import parse as parse_date from framework import sentry -from website.settings import EXTERNAL_EMBER_APPS -from waffle.testutils import override_flag from django.conf import settings as django_conf_settings SessionStore = import_module(django_conf_settings.SESSION_ENGINE).SessionStore @@ -1333,7 +1330,7 @@ def test_redirects_to_guid(self): ) assert resp.status_code == 302 - assert resp.location == f'/{guid._id}/' + assert resp.location == f'{settings.DOMAIN}{guid._id}/' def test_action_download_redirects_to_download_with_param(self): file_node = self.get_test_file() @@ -1376,40 +1373,6 @@ def test_action_download_redirects_to_download_with_version(self): # Note: version is added but us but all other url params are added as well assert_urls_equal(location.url, file_node.generate_waterbutler_url(action='download', direct=None, revision=1, version='')) - @mock.patch('website.views.stream_emberapp') - @pytest.mark.enable_bookmark_creation - def test_action_view_calls_view_file(self, mock_ember): - self.user.reload() - self.project.reload() - - file_node = self.get_test_file() - guid = file_node.get_guid(create=True) - - with override_flag(features.EMBER_FILE_PROJECT_DETAIL, active=True): - self.app.get(f'/{guid._id}/?action=view', auth=self.user.auth) - - args, kwargs = mock_ember.call_args - assert kwargs == {} - assert args[0] == EXTERNAL_EMBER_APPS['ember_osf_web']['server'] - assert args[1] == EXTERNAL_EMBER_APPS['ember_osf_web']['path'].rstrip('/') - - @mock.patch('website.views.stream_emberapp') - @pytest.mark.enable_bookmark_creation - def test_no_action_calls_view_file(self, mock_ember): - self.user.reload() - self.project.reload() - - file_node = self.get_test_file() - guid = file_node.get_guid(create=True) - - with override_flag(features.EMBER_FILE_PROJECT_DETAIL, active=True): - self.app.get(f'/{guid._id}/', auth=self.user.auth) - - args, kwargs = mock_ember.call_args - assert kwargs == {} - assert args[0] == EXTERNAL_EMBER_APPS['ember_osf_web']['server'] - assert args[1] == EXTERNAL_EMBER_APPS['ember_osf_web']['path'].rstrip('/') - def test_download_create_guid(self): file_node = self.get_test_file() assert file_node.get_guid() is None @@ -1478,30 +1441,19 @@ def test_nonstorage_addons_raise(self): ) assert resp.status_code == 400 - @mock.patch('website.views.stream_emberapp') - def test_head_returns_url_and_redirect(self, mock_ember): + def test_head_returns_url_and_redirect(self): file_node = self.get_test_file() guid = file_node.get_guid(create=True) - with override_flag(features.EMBER_FILE_PROJECT_DETAIL, active=True): - resp = self.app.head(f'/{guid._id}/', auth=self.user.auth) - assert resp.status_code == 200 - - args, kwargs = mock_ember.call_args - assert kwargs == {} - assert args[0] == EXTERNAL_EMBER_APPS['ember_osf_web']['server'] - assert args[1] == EXTERNAL_EMBER_APPS['ember_osf_web']['path'].rstrip('/') - + resp = self.app.head(f'/{guid._id}/', auth=self.user.auth) + assert resp.status_code == 302 def test_head_returns_url_with_version_and_redirect(self): file_node = self.get_test_file() guid = file_node.get_guid(create=True) resp = self.app.head(f'/{guid._id}/?revision=1&foo=bar', auth=self.user.auth) - location = furl(resp.location) - # Note: version is added but us but all other url params are added as well assert resp.status_code == 302 - assert_urls_equal(location.url, file_node.generate_waterbutler_url(direct=None, revision=1, version='', foo='bar')) def test_nonexistent_addons_raise(self): path = 'cloudfiles' @@ -1539,26 +1491,6 @@ def test_unauth_addons_raise(self): self.assertEqual(resp.status_code, 401) assert resp.status_code == 401 - def test_resolve_folder_raise(self): - folder = OsfStorageFolder( - name='folder', - target=self.project, - path='/test/folder/', - materialized_path='/test/folder/', - ) - folder.save() - resp = self.app.get( - self.project.web_url_for( - 'addon_view_or_download_file', - path=folder._id, - provider='osfstorage', - ), - auth=self.user.auth, - - ) - - assert resp.status_code == 400 - def test_delete_action_creates_trashed_file_node(self): file_node = self.get_test_file() payload = { diff --git a/tests/test_auth.py b/tests/test_auth.py index 14afa96b3b0..ad5fa602a22 100644 --- a/tests/test_auth.py +++ b/tests/test_auth.py @@ -90,13 +90,13 @@ def test_confirm_email(self): user.reload() - self.app.set_cookie(settings.COOKIE_NAME, user.get_or_create_cookie().decode()) - res = self.app.get(f'/confirm/{user._id}/{token}') - - res = self.app.resolve_redirect(res) + with capture_notifications(expect_none=True): + self.app.set_cookie(settings.COOKIE_NAME, user.get_or_create_cookie().decode()) + res = self.app.get(f'/confirm/{user._id}/{token}') + res = self.app.resolve_redirect(res) - assert res.status_code == 302 - assert '/' == urlparse(res.location).path + assert res.status_code == 302 + assert '/myprojects/' == urlparse(res.location).path # assert len(get_session()['status']) == 1 def test_get_user_by_id(self): @@ -114,7 +114,7 @@ def test_get_user_with_wrong_password_returns_false(self): assert not auth.get_user(email=user.username, password='wrong') def test_get_user_by_external_info(self): - service_url = 'http://localhost:5000/dashboard/' + service_url = 'http://localhost:5000/my_projects/' user, validated_credentials, cas_resp = generate_external_user_with_resp(service_url) user.save() assert auth.get_user(external_id_provider=validated_credentials['provider'], external_id=validated_credentials['id']) == user @@ -123,7 +123,7 @@ def test_get_user_by_external_info(self): @mock.patch('framework.auth.cas.CasClient.service_validate') def test_successful_external_login_cas_redirect(self, mock_service_validate, mock_get_user_from_cas_resp): # TODO: check in qa url encoding - service_url = 'http://localhost:5000/dashboard/' + service_url = 'http://localhost:5000/my_projects/' user, validated_credentials, cas_resp = generate_external_user_with_resp(service_url) mock_service_validate.return_value = cas_resp mock_get_user_from_cas_resp.return_value = (user, validated_credentials, 'authenticate') @@ -138,7 +138,7 @@ def test_successful_external_login_cas_redirect(self, mock_service_validate, moc @mock.patch('framework.auth.cas.get_user_from_cas_resp') @mock.patch('framework.auth.cas.CasClient.service_validate') def test_successful_external_first_login(self, mock_service_validate, mock_get_user_from_cas_resp): - service_url = 'http://localhost:5000/dashboard/' + service_url = 'http://localhost:5000/my_projects/' _, validated_credentials, cas_resp = generate_external_user_with_resp(service_url, user=False) mock_service_validate.return_value = cas_resp mock_get_user_from_cas_resp.return_value = (None, validated_credentials, 'external_first_login') @@ -151,7 +151,7 @@ def test_successful_external_first_login(self, mock_service_validate, mock_get_u @mock.patch('framework.auth.cas.get_user_from_cas_resp') @mock.patch('framework.auth.cas.CasClient.service_validate') def test_successful_external_first_login_without_attributes(self, mock_service_validate, mock_get_user_from_cas_resp, mock_external_first_login_authenticate): - service_url = 'http://localhost:5000/dashboard/' + service_url = 'http://localhost:5000/my_projects/' user, validated_credentials, cas_resp = generate_external_user_with_resp(service_url, user=False, release=False) mock_service_validate.return_value = cas_resp mock_get_user_from_cas_resp.return_value = (None, validated_credentials, 'external_first_login') diff --git a/tests/test_auth_basic_auth.py b/tests/test_auth_basic_auth.py index bad44316bfa..e1b9d6e5b8d 100644 --- a/tests/test_auth_basic_auth.py +++ b/tests/test_auth_basic_auth.py @@ -99,4 +99,4 @@ def test_expired_cookie(self): self.app.set_cookie(settings.COOKIE_NAME, str(cookie)) res = self.app.get(self.reachable_url) assert res.status_code == 302 - assert '/' == res.location + assert '/login/' == res.location diff --git a/tests/test_auth_views.py b/tests/test_auth_views.py index 8e8cc5fafb1..dcd18e3fd58 100644 --- a/tests/test_auth_views.py +++ b/tests/test_auth_views.py @@ -558,25 +558,25 @@ def test_osf_login_with_auth(self): # login: user with auth data = login_and_register_handler(self.auth) assert data.get('status_code') == http_status.HTTP_302_FOUND - assert data.get('next_url') == web_url_for('dashboard', _absolute=True) + assert data.get('next_url') == web_url_for('my_projects', _absolute=True) def test_osf_login_without_auth(self): # login: user without auth data = login_and_register_handler(self.no_auth) assert data.get('status_code') == http_status.HTTP_302_FOUND - assert data.get('next_url') == web_url_for('dashboard', _absolute=True) + assert data.get('next_url') == web_url_for('my_projects', _absolute=True) def test_osf_register_with_auth(self): # register: user with auth data = login_and_register_handler(self.auth, login=False) assert data.get('status_code') == http_status.HTTP_302_FOUND - assert data.get('next_url') == web_url_for('dashboard', _absolute=True) + assert data.get('next_url') == web_url_for('my_projects', _absolute=True) def test_osf_register_without_auth(self): # register: user without auth data = login_and_register_handler(self.no_auth, login=False) assert data.get('status_code') == http_status.HTTP_200_OK - assert data.get('next_url') == web_url_for('dashboard', _absolute=True) + assert data.get('next_url') == web_url_for('my_projects', _absolute=True) def test_next_url_login_with_auth(self): # next_url login: user with auth @@ -610,13 +610,13 @@ def test_institution_login_with_auth(self): # institution login: user with auth data = login_and_register_handler(self.auth, campaign='institution') assert data.get('status_code') == http_status.HTTP_302_FOUND - assert data.get('next_url') == web_url_for('dashboard', _absolute=True) + assert data.get('next_url') == web_url_for('my_projects', _absolute=True) def test_institution_login_without_auth(self): # institution login: user without auth data = login_and_register_handler(self.no_auth, campaign='institution') assert data.get('status_code') == http_status.HTTP_302_FOUND - assert data.get('next_url') == cas.get_login_url(web_url_for('dashboard', _absolute=True), + assert data.get('next_url') == cas.get_login_url(web_url_for('my_projects', _absolute=True), campaign='institution') def test_institution_login_next_url_with_auth(self): @@ -635,13 +635,13 @@ def test_institution_register_with_auth(self): # institution register: user with auth data = login_and_register_handler(self.auth, login=False, campaign='institution') assert data.get('status_code') == http_status.HTTP_302_FOUND - assert data.get('next_url') == web_url_for('dashboard', _absolute=True) + assert data.get('next_url') == web_url_for('my_projects', _absolute=True) def test_institution_register_without_auth(self): # institution register: user without auth data = login_and_register_handler(self.no_auth, login=False, campaign='institution') assert data.get('status_code') == http_status.HTTP_302_FOUND - assert data.get('next_url') == cas.get_login_url(web_url_for('dashboard', _absolute=True), campaign='institution') + assert data.get('next_url') == cas.get_login_url(web_url_for('my_projects', _absolute=True), campaign='institution') def test_campaign_login_with_auth(self): for campaign in get_campaigns(): @@ -782,7 +782,7 @@ def setUp(self): super().setUp() self.goodbye_url = web_url_for('goodbye', _absolute=True) self.redirect_url = web_url_for('forgot_password_get', _absolute=True) - self.valid_next_url = web_url_for('dashboard', _absolute=True) + self.valid_next_url = web_url_for('my_projects', _absolute=True) self.invalid_next_url = 'http://localhost:1234/abcde' self.auth_user = AuthUserFactory() diff --git a/tests/test_campaigns.py b/tests/test_campaigns.py index 1df6a32169a..221ce03f8cf 100644 --- a/tests/test_campaigns.py +++ b/tests/test_campaigns.py @@ -238,7 +238,7 @@ def setUp(self): super().setUp() self.url_login = web_url_for('auth_login', campaign='institution') self.url_register = web_url_for('auth_register', campaign='institution') - self.service_url = web_url_for('dashboard', _absolute=True) + self.service_url = web_url_for('my_projects', _absolute=True) # go to CAS institution login page if not logged in def test_institution_not_logged_in(self): diff --git a/tests/test_comfirmation_view_block_bing.py b/tests/test_comfirmation_view_block_bing.py index 8ef5290b6e3..bfb207272aa 100644 --- a/tests/test_comfirmation_view_block_bing.py +++ b/tests/test_comfirmation_view_block_bing.py @@ -152,7 +152,7 @@ def test_external_login_confirm_email_get_create_user(self): create_url = user.get_confirmation_url( user.username, external_id_provider='service', - destination='dashboard' + destination='my_projects' ) res = self.app.get( @@ -179,7 +179,7 @@ def test_external_login_confirm_email_get_link_user(self): link_url = user.get_confirmation_url( user.username, external_id_provider='service', - destination='dashboard' + destination='my_projects' ) res = self.app.get( diff --git a/tests/test_ember_osf_web.py b/tests/test_ember_osf_web.py deleted file mode 100644 index 31868132fb7..00000000000 --- a/tests/test_ember_osf_web.py +++ /dev/null @@ -1,59 +0,0 @@ -from unittest import mock -from flask import request - -from tests.base import OsfTestCase -from website.ember_osf_web.decorators import ember_flag_is_active -from osf_tests.factories import FlagFactory, UserFactory - -from django.contrib.auth.models import Group - - -class TestEmberFlagIsActive(OsfTestCase): - - def setUp(self): - super().setUp() - self.flag = FlagFactory(name='active_flag') - FlagFactory(name='inactive_flag', everyone=False).save() - self.mock_func = lambda: 'test value' - - @mock.patch('website.ember_osf_web.decorators.use_ember_app') - def test_use_ember_app(self, mock_use_ember_app): - ember_flag_is_active('active_flag')(self.mock_func)() - - mock_use_ember_app.assert_called_with() - - @mock.patch('website.ember_osf_web.decorators.use_ember_app') - def test_dont_use_ember_app(self, mock_use_ember_app): - # mock over external module 'waffle.flag_is_active` not ours - - ember_flag_is_active('inactive_flag')(self.mock_func)() - - assert not mock_use_ember_app.called - - @mock.patch('api.waffle.utils._get_current_user') - @mock.patch('website.ember_osf_web.decorators.flag_is_active') - @mock.patch('website.ember_osf_web.decorators.use_ember_app') - def test_ember_flag_is_active_authenticated_user(self, mock_use_ember_app, mock_flag_is_active, mock__get_current_user): - # mock over external module 'waffle.flag_is_active` not ours - - user = UserFactory() - mock__get_current_user.return_value = user - - ember_flag_is_active('active_flag')(self.mock_func)() - - mock_flag_is_active.assert_called_with(request, 'active_flag') - mock_use_ember_app.assert_called_with() - - @mock.patch('api.waffle.utils._get_current_user', return_value=None) - @mock.patch('website.ember_osf_web.decorators.flag_is_active') - @mock.patch('website.ember_osf_web.decorators.use_ember_app') - def test_ember_flag_is_active_unauthenticated_user(self, mock_use_ember_app, mock_flag_is_active, mock__get_current_user): - # mock over external module 'waffle.flag_is_active` not ours - - ember_flag_is_active('active_flag')(self.mock_func)() - group = Group.objects.create(name='foo') - - self.flag.groups.add(group) - - mock_flag_is_active.assert_called_with(request, 'active_flag') - mock_use_ember_app.assert_called_with() diff --git a/tests/test_misc_views.py b/tests/test_misc_views.py index 56c804f794f..d51c0e2d098 100644 --- a/tests/test_misc_views.py +++ b/tests/test_misc_views.py @@ -390,7 +390,7 @@ def test_external_login_email_get_with_invalid_session(self): def test_external_login_confirm_email_get_with_another_user_logged_in(self): # TODO: check in qa url encoding another_user = AuthUserFactory() - url = self.user.get_confirmation_url(self.user.username, external_id_provider='orcid', destination='dashboard') + url = self.user.get_confirmation_url(self.user.username, external_id_provider='orcid', destination='my_projects') res = self.app.get(url, auth=another_user.auth) assert res.status_code == 302, 'redirects to cas logout' assert '/logout?service=' in res.location @@ -404,7 +404,7 @@ def test_external_login_confirm_email_get_without_destination(self): def test_external_login_confirm_email_get_create(self): # TODO: check in qa url encoding assert not self.user.is_registered - url = self.user.get_confirmation_url(self.user.username, external_id_provider='orcid', destination='dashboard') + url = self.user.get_confirmation_url(self.user.username, external_id_provider='orcid', destination='my_projects') res = self.app.get(url) assert res.status_code == 302, 'redirects to cas login' assert '/login?service=' in res.location @@ -419,11 +419,9 @@ def test_external_login_confirm_email_get_link(self): self.user.external_identity['orcid'][self.provider_id] = 'LINK' self.user.save() assert not self.user.is_registered - url = self.user.get_confirmation_url(self.user.username, external_id_provider='orcid', destination='dashboard') - with capture_notifications() as notifications: + url = self.user.get_confirmation_url(self.user.username, external_id_provider='orcid', destination='my_projects') + with capture_notifications(): res = self.app.get(url) - assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_EXTERNAL_LOGIN_LINK_SUCCESS assert res.status_code == 302, 'redirects to cas login' assert 'You should be redirected automatically' in str(res.html) assert '/login?service=' in res.location @@ -437,7 +435,7 @@ def test_external_login_confirm_email_get_link(self): def test_external_login_confirm_email_get_duped_id(self): dupe_user = UserFactory(external_identity={'orcid': {self.provider_id: 'CREATE'}}) assert dupe_user.external_identity == self.user.external_identity - url = self.user.get_confirmation_url(self.user.username, external_id_provider='orcid', destination='dashboard') + url = self.user.get_confirmation_url(self.user.username, external_id_provider='orcid', destination='my_projects') res = self.app.get(url) assert res.status_code == 302, 'redirects to cas login' assert 'You should be redirected automatically' in str(res.html) @@ -451,7 +449,7 @@ def test_external_login_confirm_email_get_duped_id(self): def test_external_login_confirm_email_get_duping_id(self): dupe_user = UserFactory(external_identity={'orcid': {self.provider_id: 'VERIFIED'}}) - url = self.user.get_confirmation_url(self.user.username, external_id_provider='orcid', destination='dashboard') + url = self.user.get_confirmation_url(self.user.username, external_id_provider='orcid', destination='my_projects') res = self.app.get(url) assert res.status_code == 403, 'only allows one user to link an id' @@ -766,28 +764,10 @@ def test_find_unread_includes_edited_comments(self): n_unread = Comment.find_n_unread(user=user, node=project, page='node') assert n_unread == 1 -@mock.patch('website.views.PROXY_EMBER_APPS', False) class TestResolveGuid(OsfTestCase): def setUp(self): super().setUp() - @mock.patch('website.views.use_ember_app') - def test_preprint_provider_without_domain(self, mock_use_ember_app): - provider = PreprintProviderFactory(domain='') - preprint = PreprintFactory(provider=provider) - url = web_url_for('resolve_guid', _guid=True, guid=preprint._id) - res = self.app.get(url) - mock_use_ember_app.assert_called_with() - - @mock.patch('website.views.use_ember_app') - def test_preprint_provider_with_domain_without_redirect(self, mock_use_ember_app): - domain = 'https://test.com/' - provider = PreprintProviderFactory(_id='test', domain=domain, domain_redirect_enabled=False) - preprint = PreprintFactory(provider=provider) - url = web_url_for('resolve_guid', _guid=True, guid=preprint._id) - res = self.app.get(url) - mock_use_ember_app.assert_called_with() - def test_preprint_provider_with_domain_with_redirect(self): domain = 'https://test.com/' provider = PreprintProviderFactory(_id='test', domain=domain, domain_redirect_enabled=True) @@ -799,11 +779,3 @@ def test_preprint_provider_with_domain_with_redirect(self): assert res.status_code == 301 assert res.headers['location'] == f'{domain}{preprint._id}/' assert res.request.path == f'/{preprint._id}/' - - @mock.patch('website.views.use_ember_app') - def test_preprint_provider_with_osf_domain(self, mock_use_ember_app): - provider = PreprintProviderFactory(_id='osf', domain='https://osf.io/') - preprint = PreprintFactory(provider=provider) - url = web_url_for('resolve_guid', _guid=True, guid=preprint._id) - res = self.app.get(url) - mock_use_ember_app.assert_called_with() diff --git a/tests/test_preprints.py b/tests/test_preprints.py index 205d356c65b..77104e655b2 100644 --- a/tests/test_preprints.py +++ b/tests/test_preprints.py @@ -2770,17 +2770,3 @@ def test_date_created_first_version_with_rejected_v1(self, creator, moderator): assert v2.date_created_first_version != v2_created assert v1.date_created_first_version == v1_created - - -class TestEmberRedirect(OsfTestCase): - - def test_ember_redirect_to_versioned_guid(self): - pp = PreprintFactory(filename='test.pdf', finish=True) - res = self.app.get(f'preprints/provider/{pp.get_guid()._id}/') - guid_with_version = pp._id - assert res.status_code == 302 - assert res.location.endswith(f'{guid_with_version}') - guid_with_no_version = guid_with_version.split('_')[0] - location_with_no_guid = res.location.replace(guid_with_version, '') - # check if location has not wrong format https://osf.io/preprints/socarxiv/3rhyz/3rhyz_v1 - assert location_with_no_guid == location_with_no_guid.replace(guid_with_no_version, '') diff --git a/tests/test_project_contributor_views.py b/tests/test_project_contributor_views.py index 9bfd98870d5..7fa97ca5aac 100644 --- a/tests/test_project_contributor_views.py +++ b/tests/test_project_contributor_views.py @@ -432,7 +432,7 @@ def test_multiple_project_remove_contributor(self): self.project.reload() self.project2.reload() assert self.user2._id not in self.project.contributors - assert '/dashboard/' not in res.json + assert '/my_projects/' not in res.json assert self.user2._id not in self.project2.contributors # A log event was added @@ -453,7 +453,7 @@ def test_private_project_remove_self_not_admin(self): ) self.project.reload() assert res.status_code == 200 - assert res.json['redirectUrl'] == '/dashboard/' + assert res.json['redirectUrl'] == '/myprojects/' assert self.user2._id not in self.project.contributors def test_public_project_remove_self_not_admin(self): diff --git a/tests/test_registrations/test_views.py b/tests/test_registrations/test_views.py index 052a54ff11c..4c0bdde8419 100644 --- a/tests/test_registrations/test_views.py +++ b/tests/test_registrations/test_views.py @@ -166,31 +166,6 @@ def test_get_draft_registrations_only_gets_drafts_for_that_node(self): for draft in res.json['drafts']: assert draft['pk'] in [f._id for f in found] - def test_new_draft_registration_POST(self): - target = NodeFactory(creator=self.user) - payload = { - 'schema_name': self.meta_schema.name, - 'schema_version': self.meta_schema.schema_version - } - url = target.web_url_for('new_draft_registration') - - with capture_notifications(): - res = self.app.post(url, data=payload, auth=self.user.auth) - assert res.status_code == http_status.HTTP_302_FOUND - target.reload() - draft = DraftRegistration.objects.get(branched_from=target) - assert draft.registration_schema == self.meta_schema - - def test_new_draft_registration_on_registration(self): - target = RegistrationFactory(user=self.user) - payload = { - 'schema_name': self.meta_schema.name, - 'schema_version': self.meta_schema.schema_version - } - url = target.web_url_for('new_draft_registration') - res = self.app.post(url, json=payload, auth=self.user.auth) - assert res.status_code == http_status.HTTP_403_FORBIDDEN - def test_update_draft_registration_cant_update_registered(self): metadata = { 'summary': {'value': 'updated'} @@ -207,12 +182,6 @@ def test_update_draft_registration_cant_update_registered(self): res = self.app.put(url, json=payload, auth=self.user.auth) assert res.status_code == http_status.HTTP_403_FORBIDDEN - def test_edit_draft_registration_page_already_registered(self): - self.draft.register(self.auth, save=True) - url = self.node.web_url_for('edit_draft_registration_page', draft_id=self.draft._id) - res = self.app.get(url, auth=self.user.auth) - assert res.status_code == http_status.HTTP_403_FORBIDDEN - def test_update_draft_registration(self): metadata = { 'summary': { diff --git a/tests/test_webtests.py b/tests/test_webtests.py index cf0ea89c579..66f5995d208 100644 --- a/tests/test_webtests.py +++ b/tests/test_webtests.py @@ -79,7 +79,7 @@ def test_can_see_profile_url(self): res = self.app.get(self.user.url, follow_redirects=True) assert self.user.url in res.text - # `GET /login/` without parameters is redirected to `/dashboard/` page which has `@must_be_logged_in` decorator + # `GET /login/` without parameters is redirected to `/myprojects/` page which has `@must_be_logged_in` decorator # if user is not logged in, she/he is further redirected to CAS login page def test_is_redirected_to_cas_if_not_logged_in_at_login_page(self): res = self.app.resolve_redirect(self.app.get('/login/')) @@ -87,19 +87,19 @@ def test_is_redirected_to_cas_if_not_logged_in_at_login_page(self): location = res.headers.get('Location') assert 'login?service=' in location - def test_is_redirected_to_dashboard_if_already_logged_in_at_login_page(self): + def test_is_redirected_to_myprojects_if_already_logged_in_at_login_page(self): res = self.app.get('/login/', auth=self.user.auth) assert res.status_code == 302 - assert 'dashboard' in res.headers.get('Location') + assert 'myprojects' in res.headers.get('Location') def test_register_page(self): res = self.app.get('/register/') assert res.status_code == 200 - def test_is_redirected_to_dashboard_if_already_logged_in_at_register_page(self): + def test_is_redirected_to_myprojects_if_already_logged_in_at_register_page(self): res = self.app.get('/register/', auth=self.user.auth) assert res.status_code == 302 - assert 'dashboard' in res.headers.get('Location') + assert 'myprojects' in res.headers.get('Location') def test_sees_projects_in_her_dashboard(self): # the user already has a project diff --git a/website/conferences/views.py b/website/conferences/views.py index 913c991cda9..14038134cb2 100644 --- a/website/conferences/views.py +++ b/website/conferences/views.py @@ -8,12 +8,10 @@ from framework.exceptions import HTTPError from framework.flask import redirect from framework.transactions.handlers import no_auto_transaction -from osf import features from osf.models import AbstractNode, Node, Conference, OSFUser from website import settings from website.conferences import utils from website.conferences.message import ConferenceMessage, ConferenceError -from website.ember_osf_web.decorators import ember_flag_is_active from website.util import web_url_for from website.util.metrics import CampaignSourceTags @@ -209,7 +207,6 @@ def serialize_conference(conf): 'talk': conf.talk, } -@ember_flag_is_active(features.EMBER_MEETING_DETAIL) def conference_results(meeting): """Return the data for the grid view for a conference. :param str meeting: Endpoint name for a conference. @@ -240,7 +237,6 @@ def conference_submissions(**kwargs): """ return {'success': True} -@ember_flag_is_active(features.EMBER_MEETINGS) def conference_view(**kwargs): meetings = [] for conf in Conference.objects.all(): diff --git a/website/ember_osf_web/__init__.py b/website/ember_osf_web/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/website/ember_osf_web/decorators.py b/website/ember_osf_web/decorators.py deleted file mode 100644 index 6b939312ee2..00000000000 --- a/website/ember_osf_web/decorators.py +++ /dev/null @@ -1,22 +0,0 @@ -import functools - -from flask import request - -from api.waffle.utils import flag_is_active -from website.ember_osf_web.views import use_ember_app - - -def ember_flag_is_active(flag_name): - """ - Decorator for checking whether ember flag is active. If so, proxy to ember - app; otherwise, load old view. - """ - def decorator(func): - @functools.wraps(func) - def wrapped(*args, **kwargs): - if flag_is_active(request, flag_name): - return use_ember_app() - else: - return func(*args, **kwargs) - return wrapped - return decorator diff --git a/website/ember_osf_web/views.py b/website/ember_osf_web/views.py deleted file mode 100644 index 84f23ad8327..00000000000 --- a/website/ember_osf_web/views.py +++ /dev/null @@ -1,26 +0,0 @@ -import os -import json -from website import settings -from framework.status import pop_status_messages - -from website.settings import EXTERNAL_EMBER_APPS - -ember_osf_web_dir = os.path.abspath(os.path.join(os.getcwd(), EXTERNAL_EMBER_APPS['ember_osf_web']['path'])) - -routes = [ - '/institutions/', -] - -def use_ember_app(**kwargs): - from website.views import stream_emberapp - resp = stream_emberapp(EXTERNAL_EMBER_APPS['ember_osf_web']['server'], ember_osf_web_dir) - messages = pop_status_messages() - if messages: - try: - status = [{'id': stat[5] if stat[5] else stat[0], 'class': stat[2], 'jumbo': stat[1], 'dismiss': stat[3], 'extra': stat[6]} for stat in messages] - resp.set_cookie(settings.COOKIE_NAME + '_status', json.dumps(status)) - except IndexError: - # Ignoring the error as it will only occur when statuses were created prior to merging the changes that add - # extra and id, (patch to prevent breaking the app meanwhile) - pass - return resp diff --git a/website/institutions/__init__.py b/website/institutions/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/website/institutions/views.py b/website/institutions/views.py deleted file mode 100644 index 9477fa8c910..00000000000 --- a/website/institutions/views.py +++ /dev/null @@ -1,7 +0,0 @@ -from website.ember_osf_web.views import use_ember_app - -def view_institution(inst_id, **kwargs): - return use_ember_app() - -def view_institution_dashboard(inst_id, **kwargs): - return use_ember_app() diff --git a/website/preprints/views.py b/website/preprints/views.py index e27da1e7f1f..d42a19b48ae 100644 --- a/website/preprints/views.py +++ b/website/preprints/views.py @@ -1,8 +1,5 @@ from framework.flask import redirect # VOL-aware redirect -def preprint_landing_page(**kwargs): - return {} - def preprint_redirect(**kwargs): return redirect('/preprints/') diff --git a/website/profile/views.py b/website/profile/views.py index fb03f52fa5c..42d5590f212 100644 --- a/website/profile/views.py +++ b/website/profile/views.py @@ -25,14 +25,12 @@ from framework.status import push_status_message from framework.utils import throttle_period_expired -from osf import features from osf.models import ApiOAuth2Application, ApiOAuth2PersonalToken, OSFUser, NotificationType from osf.exceptions import BlockedEmailError, OSFError from osf.utils.requests import string_type_request_headers from website import mailchimp_utils from website import settings from website import language -from website.ember_osf_web.decorators import ember_flag_is_active from website.oauth.utils import get_available_scopes from website.profile import utils as profile_utils from website.util import api_v2_url, web_url_for, paths @@ -254,7 +252,6 @@ def profile_view_id_json(uid, auth): return _profile_view(user, is_profile) @must_be_logged_in -@ember_flag_is_active(features.EMBER_USER_PROFILE) def profile_view(auth): # Embed node data, so profile node lists can be rendered return _profile_view(auth.user, True, include_node_counts=True) @@ -269,7 +266,6 @@ def profile_view_id(uid, auth): @must_be_logged_in -@ember_flag_is_active(features.EMBER_USER_SETTINGS) def user_profile(auth, **kwargs): user = auth.user return { @@ -279,7 +275,6 @@ def user_profile(auth, **kwargs): @must_be_logged_in -@ember_flag_is_active(features.EMBER_USER_SETTINGS_ACCOUNTS) def user_account(auth, **kwargs): user = auth.user user_addons = addon_utils.get_addons_by_config_type('user', user) @@ -298,7 +293,6 @@ def user_account(auth, **kwargs): @must_be_logged_in -@ember_flag_is_active(features.EMBER_USER_SETTINGS_ACCOUNTS) def user_account_password(auth, **kwargs): user = auth.user old_password = request.form.get('old_password', None) @@ -337,7 +331,6 @@ def user_account_password(auth, **kwargs): @must_be_logged_in -@ember_flag_is_active(features.ENABLE_GV) def user_addons(auth, **kwargs): user = auth.user @@ -355,7 +348,6 @@ def user_addons(auth, **kwargs): return ret @must_be_logged_in -@ember_flag_is_active(features.EMBER_USER_SETTINGS_NOTIFICATIONS) def user_notifications(auth, **kwargs): """Get subscribe data from user""" return { @@ -363,7 +355,6 @@ def user_notifications(auth, **kwargs): } @must_be_logged_in -@ember_flag_is_active(features.EMBER_USER_SETTINGS_APPS) def oauth_application_list(auth, **kwargs): """Return app creation page with list of known apps. API is responsible for tying list to current user.""" app_list_url = api_v2_url('applications/') @@ -372,7 +363,6 @@ def oauth_application_list(auth, **kwargs): } @must_be_logged_in -@ember_flag_is_active(features.EMBER_USER_SETTINGS_APPS) def oauth_application_register(auth, **kwargs): """Register an API application: blank form view""" app_list_url = api_v2_url('applications/') # POST request to this url @@ -380,7 +370,6 @@ def oauth_application_register(auth, **kwargs): 'app_detail_url': ''} @must_be_logged_in -@ember_flag_is_active(features.EMBER_USER_SETTINGS_APPS) def oauth_application_detail(auth, **kwargs): """Show detail for a single OAuth application""" client_id = kwargs.get('client_id') @@ -402,7 +391,6 @@ def oauth_application_detail(auth, **kwargs): 'app_detail_url': app_detail_url} @must_be_logged_in -@ember_flag_is_active(features.EMBER_USER_SETTINGS_TOKENS) def personal_access_token_list(auth, **kwargs): """Return token creation page with list of known tokens. API is responsible for tying list to current user.""" token_list_url = api_v2_url('tokens/') @@ -411,7 +399,6 @@ def personal_access_token_list(auth, **kwargs): } @must_be_logged_in -@ember_flag_is_active(features.EMBER_USER_SETTINGS_TOKENS) def personal_access_token_register(auth, **kwargs): """Register a personal access token: blank form view""" token_list_url = api_v2_url('tokens/') # POST request to this url @@ -420,7 +407,6 @@ def personal_access_token_register(auth, **kwargs): 'scope_options': get_available_scopes()} @must_be_logged_in -@ember_flag_is_active(features.EMBER_USER_SETTINGS_TOKENS) def personal_access_token_detail(auth, **kwargs): """Show detail for a single personal access token""" _id = kwargs.get('_id') diff --git a/website/project/metadata/utils.py b/website/project/metadata/utils.py index e094da63753..de2bfb82f6a 100644 --- a/website/project/metadata/utils.py +++ b/website/project/metadata/utils.py @@ -39,7 +39,6 @@ def serialize_draft_registration(draft, auth=None): 'updated': utils.iso8601format(draft.datetime_updated), 'flags': draft.flags, 'urls': { - 'edit': node.web_url_for('edit_draft_registration_page', draft_id=draft._id, _guid=True), 'before_register': node.api_url_for('project_before_register'), 'register': absolute_reverse('nodes:node-registrations', kwargs={'node_id': node._id, 'version': 'v2'}), 'register_page': node.web_url_for('draft_before_register_page', draft_id=draft._id, _guid=True), diff --git a/website/project/views/contributor.py b/website/project/views/contributor.py index 6bacb1b158d..6315452cda9 100644 --- a/website/project/views/contributor.py +++ b/website/project/views/contributor.py @@ -321,7 +321,7 @@ def project_manage_contributors(auth, node, **kwargs): raise HTTPError(http_status.HTTP_409_CONFLICT, data={'message_long': error.args[0]}) # If user has removed herself from project, alert; redirect to - # node summary if node is public, else to user's dashboard page + # node summary if node is public, else to user's my_projects page if not node.is_contributor_or_group_member(auth.user): status.push_status_message( 'You have removed yourself as a contributor from this project', @@ -330,7 +330,7 @@ def project_manage_contributors(auth, node, **kwargs): ) if node.is_public: return {'redirectUrl': node.url} - return {'redirectUrl': web_url_for('dashboard')} + return {'redirectUrl': web_url_for('my_projects')} # Else if user has revoked her admin permissions, alert and stay on # current page if not node.has_permission(auth.user, ADMIN): @@ -385,7 +385,7 @@ def project_remove_contributor(auth, **kwargs): 'message_long': 'Could not remove contributor.'}) # On parent node, if user has removed herself from project, alert; redirect to - # node summary if node is public, else to user's dashboard page + # node summary if node is public, else to user's my_projects page if not node.is_contributor_or_group_member(auth.user) and node_id == parent_id: status.push_status_message( 'You have removed yourself as a contributor from this project', @@ -396,7 +396,7 @@ def project_remove_contributor(auth, **kwargs): if node.is_public: redirect_url = {'redirectUrl': node.url} else: - redirect_url = {'redirectUrl': web_url_for('dashboard')} + redirect_url = {'redirectUrl': web_url_for('my_projects')} if node.is_public: node.update_search() diff --git a/website/project/views/drafts.py b/website/project/views/drafts.py index e4ee762c992..e4ecd1bc92a 100644 --- a/website/project/views/drafts.py +++ b/website/project/views/drafts.py @@ -7,13 +7,12 @@ from dateutil.parser import parse as parse_date from django.utils import timezone -from flask import request, redirect +from flask import request import pytz from framework.database import autoload from framework.exceptions import HTTPError -from osf import features from osf.utils.sanitize import strip_html from osf.utils.permissions import ADMIN from osf.utils.functional import rapply @@ -25,9 +24,7 @@ must_have_permission, ) from website import settings -from website.ember_osf_web.decorators import ember_flag_is_active -from website.project import utils from website.project.metadata.schemas import METASCHEMA_ORDERING from website.project.metadata.utils import serialize_meta_schema, serialize_draft_registration from website.project.utils import serialize_node @@ -150,60 +147,6 @@ def get_draft_registrations(auth, node, *args, **kwargs): 'drafts': sorted_serialized_drafts }, http_status.HTTP_200_OK -@must_have_permission(ADMIN) -@must_be_valid_project -@must_be_contributor_and_not_group_member -@ember_flag_is_active(features.EMBER_CREATE_DRAFT_REGISTRATION) -def new_draft_registration(auth, node, *args, **kwargs): - """Create a new draft registration for the node - - :return: Redirect to the new draft's edit page - :rtype: flask.redirect - :raises: HTTPError - """ - if node.is_registration: - raise HTTPError(http_status.HTTP_403_FORBIDDEN, data={ - 'message_short': "Can't create draft", - 'message_long': 'Creating draft registrations on registered projects is not allowed.' - }) - data = request.values - - schema_name = data.get('schema_name') - if not schema_name: - raise HTTPError( - http_status.HTTP_400_BAD_REQUEST, - data={ - 'message_short': 'Must specify a schema_name', - 'message_long': 'Please specify a schema_name' - } - ) - - schema_version = data.get('schema_version', 2) - - meta_schema = get_schema_or_fail(schema_name, int(schema_version)) - draft = DraftRegistration.create_from_node( - node=node, - user=auth.user, - schema=meta_schema, - data={} - ) - return redirect(node.web_url_for('edit_draft_registration_page', draft_id=draft._id, _guid=True)) - - -@must_have_permission(ADMIN) -@must_be_contributor_and_not_group_member -@ember_flag_is_active(features.EMBER_EDIT_DRAFT_REGISTRATION) -@must_be_branched_from_node -def edit_draft_registration_page(auth, node, draft, **kwargs): - """Draft registration editor - - :return: serialized DraftRegistration - :rtype: dict - """ - check_draft_state(draft) - ret = utils.serialize_node(node, auth, primary=True) - ret['draft'] = serialize_draft_registration(draft, auth) - return ret @must_have_permission(ADMIN) @must_be_contributor_and_not_group_member diff --git a/website/project/views/file.py b/website/project/views/file.py index 780b26a740c..393782d47ef 100644 --- a/website/project/views/file.py +++ b/website/project/views/file.py @@ -4,13 +4,11 @@ from flask import request from osf import features -from osf.models import Node, Registration from api.waffle.utils import flag_is_active from website.util import rubeus from website.project.decorators import must_be_contributor_or_public, must_not_be_retracted_registration from website.project.views.node import _view_project -from website.ember_osf_web.views import use_ember_app @must_not_be_retracted_registration @@ -19,11 +17,6 @@ def collect_file_trees(auth, node, **kwargs): """Collect file trees for all add-ons implementing HGrid views, then format data as appropriate. """ - if isinstance(node, Node) and flag_is_active(request, features.EMBER_PROJECT_FILES): - return use_ember_app() - - if isinstance(node, Registration) and flag_is_active(request, features.EMBER_REGISTRATION_FILES): - return use_ember_app() serialized = _view_project(node, auth, primary=True) # Add addon static assets diff --git a/website/project/views/node.py b/website/project/views/node.py index c07a1377086..94e4a63fe47 100644 --- a/website/project/views/node.py +++ b/website/project/views/node.py @@ -18,7 +18,6 @@ from framework.auth.decorators import must_be_logged_in, collect_auth from osf.external.gravy_valet.request_helpers import get_gv_citation_url_list_for_project from osf.external.gravy_valet.translations import EphemeralAddonConfig -from website.ember_osf_web.decorators import ember_flag_is_active from api.waffle.utils import flag_is_active, storage_i18n_flag_active, storage_usage_flag_active from framework.exceptions import HTTPError from osf.models.nodelog import NodeLog @@ -31,7 +30,6 @@ from website import language from website.util import rubeus -from website.ember_osf_web.views import use_ember_app from osf.exceptions import NodeStateError from website.project import new_node, new_private_link from website.project.decorators import ( @@ -269,7 +267,6 @@ def project_before_template(auth, node, **kwargs): def node_registrations(auth, node, **kwargs): if request.path.startswith('/project/'): return redirect(f'/{node._id}/registrations/') - return use_ember_app() @must_be_valid_project @@ -278,18 +275,13 @@ def node_registrations(auth, node, **kwargs): def node_forks(auth, node, **kwargs): if request.path.startswith('/project/'): return redirect('/' + node._id + '/forks/') - return use_ember_app() @must_be_valid_project @must_not_be_retracted_registration @must_be_logged_in @must_have_permission(READ) -@ember_flag_is_active(features.EMBER_PROJECT_SETTINGS) def node_setting(auth, node, **kwargs): - if node.is_registration and flag_is_active(request, features.EMBER_REGISTRIES_DETAIL_PAGE): - # Registration settings page obviated during redesign - return redirect(node.url) auth.user.update_affiliated_institutions_by_email_domain() auth.user.save() ret = _view_project(node, auth, primary=True) @@ -324,7 +316,6 @@ def node_setting(auth, node, **kwargs): @must_not_be_registration @must_be_logged_in @must_have_permission(WRITE) -@ember_flag_is_active(features.ENABLE_GV) def node_addons(auth, node, **kwargs): ret = _view_project(node, auth, primary=True) @@ -410,7 +401,6 @@ def node_choose_addons(auth, node, **kwargs): @must_be_valid_project @must_not_be_retracted_registration @must_have_permission(READ) -@ember_flag_is_active(features.EMBER_PROJECT_CONTRIBUTORS) def node_contributors(auth, node, **kwargs): ret = _view_project(node, auth, primary=True) ret['contributors'] = utils.serialize_contributors(node.contributors, node) @@ -458,7 +448,6 @@ def make_citation_widget_data(addon_name: str): @process_token_or_pass @must_be_valid_project(retractions_valid=True) @must_be_contributor_or_public -@ember_flag_is_active(features.EMBER_PROJECT_DETAIL) def view_project(auth, node, **kwargs): primary = '/api/v1' not in request.path ret = _view_project(node, auth, @@ -576,7 +565,6 @@ def project_reorder_components(node, **kwargs): def project_statistics(auth, node, **kwargs): if request.path.startswith('/project/'): return redirect('/' + node._id + '/analytics/') - return use_ember_app() ############################################################################### @@ -654,7 +642,7 @@ def component_remove(auth, node, **kwargs): if parent and parent.can_view(auth): redirect_url = node.parent_node.url else: - redirect_url = '/dashboard/' + redirect_url = '/my_projects/' return { 'url': redirect_url, diff --git a/website/project/views/register.py b/website/project/views/register.py index 265fda1edea..6d8fe5a293f 100644 --- a/website/project/views/register.py +++ b/website/project/views/register.py @@ -15,19 +15,16 @@ must_not_be_registration, must_not_be_retracted_registration ) -from osf import features from osf.models import Identifier, RegistrationSchema from website.project.utils import serialize_node from osf.utils.permissions import ADMIN from website import language -from website.ember_osf_web.decorators import ember_flag_is_active from website.project.metadata.schemas import _id_to_name from website import util from website.project.metadata.utils import serialize_meta_schema from website.project.model import has_anonymous_link from .node import _view_project -from api.waffle.utils import flag_is_active @must_be_valid_project @must_not_be_retracted_registration @@ -117,11 +114,7 @@ def node_registration_retraction_post(auth, node, **kwargs): @must_be_valid_project @must_not_be_retracted_registration @must_be_contributor_or_public -@ember_flag_is_active(features.EMBER_REGISTRATION_FORM_DETAIL) def node_register_template_page(auth, node, metaschema_id, **kwargs): - if flag_is_active(request, features.EMBER_REGISTRIES_DETAIL_PAGE): - # Registration meta page obviated during redesign - return redirect(node.url) if node.is_registration and bool(node.registered_schema): try: meta_schema = RegistrationSchema.objects.get(_id=metaschema_id) diff --git a/website/registries/views.py b/website/registries/views.py index c7307fe626f..4fc631553c2 100644 --- a/website/registries/views.py +++ b/website/registries/views.py @@ -19,16 +19,7 @@ def draft_registrations(auth, **kwargs): 'initiator': { 'name': draft.initiator.fullname, }, - 'url': draft.branched_from.web_url_for( - 'edit_draft_registration_page', - draft_id=draft._id, - ), } for draft in drafts ], } - - -def registries_landing_page(**kwargs): - # placeholder for developer who don't have ember app set up. - return {} diff --git a/website/reviews/views.py b/website/reviews/views.py deleted file mode 100644 index bbb97564245..00000000000 --- a/website/reviews/views.py +++ /dev/null @@ -1,2 +0,0 @@ -def reviews_landing_page(**kwargs): - return {} diff --git a/website/routes.py b/website/routes.py index 80b0d8bec92..e5af9991281 100644 --- a/website/routes.py +++ b/website/routes.py @@ -1,7 +1,5 @@ import os from rest_framework import status as http_status -import requests -from urllib.parse import urljoin import json import waffle @@ -9,8 +7,6 @@ from flask import request from flask import send_from_directory -from flask import Response -from flask import stream_with_context from flask import g from django.conf import settings as api_settings from django.utils.encoding import smart_str @@ -30,7 +26,7 @@ from framework.auth.core import _get_current_user from osf import features -from osf.models import Institution, Preprint +from osf.models import Institution from osf.utils import sanitize from osf.utils import permissions from website import util @@ -54,13 +50,9 @@ from website.policies import views as policy_views from website.preprints import views as preprint_views from website.registries import views as registries_views -from website.reviews import views as reviews_views -from website.institutions import views as institution_views from website.notifications import views as notification_views -from website.ember_osf_web import views as ember_osf_web_views from website.closed_challenges import views as closed_challenges_views from website.identifiers import views as identifier_views -from website.settings import EXTERNAL_EMBER_APPS, EXTERNAL_EMBER_SERVER_TIMEOUT from api.waffle.utils import flag_is_active @@ -237,58 +229,9 @@ def sitemap_file(path): mimetype=mime ) -def ember_app(path=None): - """Serve the contents of the ember application""" - ember_app_folder = None - fp = path or 'index.html' - - ember_app = None - - for k in EXTERNAL_EMBER_APPS.keys(): - if request.path.strip('/').startswith(k): - ember_app = EXTERNAL_EMBER_APPS[k] - if k == 'preprints': - # If a valid guid is provided w/o version, find and redirect to the latest version. This only applies - # to route preprints//: e.g. /preprints/osf/abcde -> /preprints/osf/abcde_v3 - if path: - path_values = path.split('/') - guid_str = path_values[1] if len(path_values) > 1 else None - if guid_str: - preprint = Preprint.load(guid_str) - if preprint and preprint._id != guid_str: - return redirect(f"{settings.DOMAIN}preprints/{path_values[0]}/{preprint._id}", code=302) - # For all other cases, let ember app handle it - ember_app = EXTERNAL_EMBER_APPS.get('ember_osf_web', False) or ember_app - break - - if not ember_app: - raise HTTPError(http_status.HTTP_404_NOT_FOUND) - - if settings.PROXY_EMBER_APPS: - path = request.path[len(ember_app['path']):] - url = urljoin(ember_app['server'], path) - resp = requests.get(url, stream=True, timeout=EXTERNAL_EMBER_SERVER_TIMEOUT, headers={'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}) - excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection'] - headers = [(name, value) for (name, value) in resp.raw.headers.items() if name.lower() not in excluded_headers] - return Response(resp.content, resp.status_code, headers) - - ember_app_folder = os.path.abspath(os.path.join(os.getcwd(), ember_app['path'])) - - if not ember_app_folder: - raise HTTPError(http_status.HTTP_404_NOT_FOUND) - - if not os.path.abspath(os.path.join(ember_app_folder, fp)).startswith(ember_app_folder): - # Prevent accessing files outside of the ember build dir - raise HTTPError(http_status.HTTP_404_NOT_FOUND) - - if not os.path.isfile(os.path.join(ember_app_folder, fp)): - fp = 'index.html' - - return send_from_directory(ember_app_folder, fp) - def goodbye(): # Redirect to dashboard if logged in - redirect_url = util.web_url_for('index') + redirect_url = util.web_url_for('auth_login') if _get_current_user(): return redirect(redirect_url) else: @@ -348,70 +291,17 @@ def make_url_map(app): Rule('/sitemaps/', 'get', sitemap_file, json_renderer), ]) - # Ember Applications - if settings.USE_EXTERNAL_EMBER: - # Routes that serve up the Ember application. Hide behind feature flag. - for prefix in EXTERNAL_EMBER_APPS.keys(): - process_rules(app, [ - Rule( - [ - '///download', - '///download/', - ], - ['get', 'post', 'put', 'patch', 'delete'], - website_views.resolve_guid_download, - notemplate, - endpoint_suffix='__' + prefix - ), - ], prefix='/' + prefix) - - process_rules(app, [ - Rule( - [ - '/', - '/', - ], - 'get', - ember_app, - json_renderer, - endpoint_suffix='__' + prefix - ), - ], prefix='/' + prefix) - - if EXTERNAL_EMBER_APPS.get('ember_osf_web'): - process_rules(app, [ - Rule( - ember_osf_web_views.routes, - 'get', - ember_osf_web_views.use_ember_app, - notemplate - ) - ]) - if 'routes' in EXTERNAL_EMBER_APPS['ember_osf_web']: - for route in EXTERNAL_EMBER_APPS['ember_osf_web']['routes']: - process_rules(app, [ - Rule( - [ - '/', - '/', - ], - 'get', - ember_osf_web_views.use_ember_app, - notemplate, - endpoint_suffix='__' + route - ) - ], prefix='/' + route) - ### Base ### process_rules(app, [ - + Rule('/', 'get', website_views.index, notemplate), Rule( '/dashboard/', 'get', website_views.dashboard, notemplate ), + Rule( '/metadata//', 'get', @@ -520,26 +410,6 @@ def make_url_map(app): closed_challenges_views.erpc_landing_page, OsfWebRenderer('erpc_landing_page.mako', trust=False) ), - Rule( - '/preprints/', - 'get', - preprint_views.preprint_landing_page, - OsfWebRenderer('public/pages/preprint_landing.mako', trust=False), - ), - - Rule( - '/registries/', - 'get', - registries_views.registries_landing_page, - OsfWebRenderer('public/pages/registries_landing.mako', trust=False), - ), - - Rule( - '/reviews/', - 'get', - reviews_views.reviews_landing_page, - OsfWebRenderer('public/pages/reviews_landing.mako', trust=False), - ), Rule( '/preprint/', @@ -1116,28 +986,9 @@ def make_url_map(app): ], prefix='/api/v1') - # Institution - - process_rules(app, [ - Rule('/institutions//', 'get', institution_views.view_institution, notemplate) - ]) - - process_rules(app, [ - Rule([ - '/institutions//dashboard/', - ], - 'get', - institution_views.view_institution_dashboard, - notemplate) - ]) - - # Project - # Web process_rules(app, [ - Rule('/', 'get', website_views.index, notemplate), - Rule('/goodbye/', 'get', goodbye, notemplate), Rule( @@ -1255,22 +1106,6 @@ def make_url_map(app): project_views.node.node_registrations, notemplate, ), - Rule( - [ - '/project//registrations/', - '/project//node//registrations/', - ], - 'post', - project_views.drafts.new_draft_registration, - OsfWebRenderer('project/edit_draft_registration.mako', trust=False)), - Rule( - [ - '/project//drafts//', - '/project//node//drafts//', - ], - 'get', - project_views.drafts.edit_draft_registration_page, - OsfWebRenderer('project/edit_draft_registration.mako', trust=False)), Rule( [ '/project//drafts//register/', @@ -1801,8 +1636,3 @@ def addon_static(addon, filename): @app.route('/assets/') def provider_static(filename): return send_from_directory(directory=provider_static_path, path=filename) - - @app.route('/ember-cli-live-reload.js') - def ember_cli_live_reload(): - req = requests.get(f'{settings.LIVE_RELOAD_DOMAIN}/ember-cli-live-reload.js', stream=True) - return Response(stream_with_context(req.iter_content()), content_type=req.headers['content-type']) diff --git a/website/search/views.py b/website/search/views.py index e774d52532e..828cd0e5661 100644 --- a/website/search/views.py +++ b/website/search/views.py @@ -12,11 +12,9 @@ from framework import sentry from framework.utils import sanitize_html from website import language -from osf import features from osf.models import OSFUser, AbstractNode from website import settings from website.project.views.contributor import get_node_contributors_abbrev -from website.ember_osf_web.decorators import ember_flag_is_active from website.search import exceptions import website.search.search as search from website.search.util import build_query @@ -73,7 +71,6 @@ def search_search(**kwargs): results['time'] = round(time.time() - tick, 2) return results -@ember_flag_is_active(features.EMBER_SEARCH_PAGE) def search_view(): return {'shareUrl': settings.SHARE_URL}, diff --git a/website/settings/defaults.py b/website/settings/defaults.py index bab77fe053c..bfe78beea09 100644 --- a/website/settings/defaults.py +++ b/website/settings/defaults.py @@ -96,12 +96,6 @@ def parent_dir(path): 'prefix': PROTOCOL, 'suffix': '/' } -# External Ember App Local Development -USE_EXTERNAL_EMBER = False -PROXY_EMBER_APPS = False -# http://docs.python-requests.org/en/master/user/advanced/#timeouts -EXTERNAL_EMBER_SERVER_TIMEOUT = 3.05 -EXTERNAL_EMBER_APPS = {} LOG_PATH = os.path.join(APP_PATH, 'logs') TEMPLATES_PATH = os.path.join(BASE_PATH, 'templates') diff --git a/website/settings/local-ci.py b/website/settings/local-ci.py index 022a973b35a..0831b5b8dbc 100644 --- a/website/settings/local-ci.py +++ b/website/settings/local-ci.py @@ -23,21 +23,6 @@ 'prefix': 'http://local.', 'suffix': ':4201/' } -USE_EXTERNAL_EMBER = True -EXTERNAL_EMBER_APPS = { - 'ember_osf_web': { - 'server': 'http://localhost:4200', - 'path': os.environ.get('HOME') + 'website/ember_osf_web/' - }, - 'preprints': { - 'server': 'http://localhost:4201', - 'path': os.environ.get('HOME') + '/preprints/' - }, - 'registries': { - 'server': 'http://localhost:4202/', - 'path': os.environ.get('HOME') + '/registries/' - } -} SEARCH_ENGINE = 'elastic' diff --git a/website/settings/local-dist.py b/website/settings/local-dist.py index bd817c16302..a35288d2eba 100644 --- a/website/settings/local-dist.py +++ b/website/settings/local-dist.py @@ -29,29 +29,6 @@ 'prefix': 'http://local.', 'suffix': ':4201/' } -USE_EXTERNAL_EMBER = True -PROXY_EMBER_APPS = True -EMBER_DOMAIN = environ.get('EMBER_DOMAIN', 'localhost') -LIVE_RELOAD_DOMAIN = f'http://{EMBER_DOMAIN}:4200' # Change port for the current app -EXTERNAL_EMBER_APPS = { - 'ember_osf_web': { - 'server': f'http://{EMBER_DOMAIN}:4200/', - 'path': '/ember_osf_web/', - 'routes': [ - 'collections', - 'registries', - 'handbook', - ], - }, - 'preprints': { - 'server': f'http://{EMBER_DOMAIN}:4201/', - 'path': '/preprints/' - }, - 'reviews': { - 'server': f'http://{EMBER_DOMAIN}:4203/', - 'path': '/reviews/' - }, -} SEARCH_ENGINE = 'elastic' ELASTIC_TIMEOUT = 10 diff --git a/website/templates/base.mako b/website/templates/base.mako index 51abe36b06a..d1f08a8ff97 100644 --- a/website/templates/base.mako +++ b/website/templates/base.mako @@ -203,7 +203,7 @@

Start managing your projects on the OSF today.

Free and easy to use, the Open Science Framework supports the entire research lifecycle: planning, execution, reporting, archiving, and discovery.

- Create an Account + Create an Account Learn More Hide this message diff --git a/website/templates/project/edit_draft_registration.mako b/website/templates/project/edit_draft_registration.mako deleted file mode 100644 index 2eed807abcf..00000000000 --- a/website/templates/project/edit_draft_registration.mako +++ /dev/null @@ -1,94 +0,0 @@ -<%inherit file="project/project_base.mako" /> -<%def name="title()">Edit ${node['title']} registration - -
-
-
-

Edit draft registration

-
-
-
-
-
-
-
-
-
- -
-
- % if draft['registration_schema']['schema_name'] != 'Open-Ended Registration': - -
-
- -
-
-
-
-
-
- % endif - -
-
-
-
-
- -
- - Last auto-saved: - - - - - Responses to some questions are invalid or missing where required. - - - -
-
- - - Preview for submission - - - - Next Page - -
-
-
-
-
-
-
-
- -<%def name="javascript_bottom()"> - ${parent.javascript_bottom()} - - - - - -<%include file="project/registration_editor_templates.mako" /> diff --git a/website/templates/public/forgot_password.mako b/website/templates/public/forgot_password.mako index 63d32ffd7f6..73a0f82b09e 100644 --- a/website/templates/public/forgot_password.mako +++ b/website/templates/public/forgot_password.mako @@ -42,7 +42,7 @@

-
Back to OSF
+
Back to OSF
% endif diff --git a/website/templates/public/pages/preprint_landing.mako b/website/templates/public/pages/preprint_landing.mako deleted file mode 100644 index b405eaa38ab..00000000000 --- a/website/templates/public/pages/preprint_landing.mako +++ /dev/null @@ -1,19 +0,0 @@ -<%inherit file="base.mako"/> - -<%def name="title()">Preprints - -<%def name="content()"> -

Preprints service is not activated.

-
    -
  • Set the following in local.py:
  • -
    USE_EXTERNAL_EMBER = True
    -EXTERNAL_EMBER_APPS = {
    -  'preprints': {
    -    'url': '/preprints/',
    -    'server': 'http://localhost:4200',
    -    'path': '/preprints/'
    -  }
    -}
    -
  • Start the preprints container with docker-compose up -d preprints.
  • -
- diff --git a/website/templates/public/pages/registries_landing.mako b/website/templates/public/pages/registries_landing.mako deleted file mode 100644 index ff974f4e270..00000000000 --- a/website/templates/public/pages/registries_landing.mako +++ /dev/null @@ -1,19 +0,0 @@ -<%inherit file="base.mako"/> - -<%def name="title()">Registries - -<%def name="content()"> -

Registries service is not activated.

-
    -
  • Set the following in local.py:
  • -
    USE_EXTERNAL_EMBER = True
    -EXTERNAL_EMBER_APPS = {
    -  'registries': {
    -    'url': '/registries/',
    -    'server': 'http://localhost:4300',
    -    'path': '/registries/'
    -  }
    -}
    -
  • Start the registries container with docker-compose up -d registries.
  • -
- diff --git a/website/templates/public/pages/reviews_landing.mako b/website/templates/public/pages/reviews_landing.mako deleted file mode 100644 index 0a7fa40575e..00000000000 --- a/website/templates/public/pages/reviews_landing.mako +++ /dev/null @@ -1,19 +0,0 @@ -<%inherit file="base.mako"/> - -<%def name="title()">OSF Reviews - -<%def name="content()"> -

Reviews service is not activated.

-
    -
  • Set the following in local.py:
  • -
    USE_EXTERNAL_EMBER = True
    -EXTERNAL_EMBER_APPS = {
    -  'reviews': {
    -    'url': '/reviews/',
    -    'server': 'http://localhost:4400',
    -    'path': '/reviews/'
    -  }
    -}
    -
  • Start the reviews container with docker-compose up -d reviews.
  • -
- diff --git a/website/views.py b/website/views.py index 112e78f8f88..2d8784618d3 100644 --- a/website/views.py +++ b/website/views.py @@ -3,12 +3,10 @@ from rest_framework import status as http_status import logging import math -import os -import requests from urllib.parse import unquote from django.apps import apps -from flask import request, send_from_directory, Response, stream_with_context +from flask import request, Response from framework.auth import Auth from framework.auth.decorators import must_be_logged_in @@ -21,21 +19,18 @@ from addons.osfstorage.models import Region, OsfStorageFile -from osf import features, exceptions -from osf.models import Guid, Preprint, AbstractNode, Node, DraftNode, Registration, BaseFileNode +from osf import exceptions +from osf.models import Guid, Preprint, AbstractNode, Node, DraftNode -from website.settings import EXTERNAL_EMBER_APPS, PROXY_EMBER_APPS, EXTERNAL_EMBER_SERVER_TIMEOUT, DOMAIN -from website.ember_osf_web.decorators import ember_flag_is_active -from website.ember_osf_web.views import use_ember_app +from website.settings import DOMAIN from website.project.decorators import check_contributor_auth from website.project.model import has_anonymous_link from osf.utils import permissions from osf.metadata.tools import pls_gather_metadata_file -from api.waffle.utils import storage_i18n_flag_active, flag_is_active +from api.waffle.utils import storage_i18n_flag_active logger = logging.getLogger(__name__) -ember_osf_web_dir = os.path.abspath(os.path.join(os.getcwd(), EXTERNAL_EMBER_APPS['ember_osf_web']['path'])) def serialize_contributors_for_summary(node, max_count=3): @@ -131,19 +126,13 @@ def serialize_node_summary(node, auth, primary=True, show_path=False): return summary -def index(): - return use_ember_app() def find_bookmark_collection(user): Collection = apps.get_model('osf.Collection') return Collection.objects.get(creator=user, deleted__isnull=True, is_bookmark_collection=True) -@must_be_logged_in -def dashboard(auth): - return use_ember_app() @must_be_logged_in -@ember_flag_is_active(features.EMBER_MY_PROJECTS) def my_projects(auth): user = auth.user @@ -175,6 +164,14 @@ def paginate(items, total, page, size): return paginated_items, pages +def index(): + return redirect('/myprojects/') + + +def dashboard(): + return redirect('/myprojects/') + + def reproducibility(): return redirect('/ezcuj/wiki') @@ -230,13 +227,6 @@ def resolve_guid_download(guid, provider=None): return proxy_url(_build_guid_url(unquote(resource.deep_url))) -def stream_emberapp(server, directory): - if PROXY_EMBER_APPS: - resp = requests.get(server, stream=True, timeout=EXTERNAL_EMBER_SERVER_TIMEOUT) - return Response(stream_with_context(resp.iter_content()), resp.status_code) - return send_from_directory(directory, 'index.html') - - def _build_guid_url(base, suffix=None): url = '/'.join([ each.strip('/') for each in [base, suffix] @@ -298,41 +288,9 @@ def resolve_guid(guid, suffix=None): format_arg = request.args.get('format') if format_arg: return guid_metadata_download(guid, resource, format_arg) - else: - return use_ember_app() - - # Stream to ember app if resource has emberized view - if isinstance(resource, Preprint): - if resource.provider.domain_redirect_enabled: - return redirect(resource.absolute_url, http_status.HTTP_301_MOVED_PERMANENTLY) - return use_ember_app() - - elif isinstance(resource, Registration) and (clean_suffix in ('', 'comments', 'links', 'components', 'resources',)) and flag_is_active(request, features.EMBER_REGISTRIES_DETAIL_PAGE): - return use_ember_app() - - elif isinstance(resource, Registration) and clean_suffix and clean_suffix.startswith('metadata') and flag_is_active(request, features.EMBER_REGISTRIES_DETAIL_PAGE): - return use_ember_app() - - elif isinstance(resource, Registration) and (clean_suffix in ('files', 'files/osfstorage')) and flag_is_active(request, features.EMBER_REGISTRATION_FILES): - return use_ember_app() - - elif isinstance(resource, Registration) and clean_suffix and (clean_suffix.startswith('recent-activity')): - return use_ember_app() - - elif isinstance(resource, Node) and clean_suffix and clean_suffix.startswith('files') and flag_is_active(request, features.EMBER_PROJECT_FILES): - return use_ember_app() - - elif isinstance(resource, Node) and clean_suffix and (clean_suffix.startswith('metadata') or clean_suffix.startswith('components') or clean_suffix.startswith('links')): - return use_ember_app() - - elif isinstance(resource, OsfStorageFile) and isinstance(resource.target, DraftNode): - return use_ember_app() - elif isinstance(resource, BaseFileNode) and resource.is_file and not isinstance(resource.target, Preprint): - if isinstance(resource.target, Registration) and flag_is_active(request, features.EMBER_FILE_REGISTRATION_DETAIL): - return use_ember_app() - if isinstance(resource.target, Node) and flag_is_active(request, features.EMBER_FILE_PROJECT_DETAIL): - return use_ember_app() + if isinstance(resource, Preprint) and resource.provider.domain_redirect_enabled: + return redirect(resource.absolute_url, http_status.HTTP_301_MOVED_PERMANENTLY) # Redirect to legacy endpoint for Nodes, Wikis etc. url = _build_guid_url(unquote(resource.deep_url), suffix) From f7a489b68822d35fe71607bd0bd1c264403f17d4 Mon Sep 17 00:00:00 2001 From: antkryt Date: Wed, 25 Feb 2026 18:47:31 +0200 Subject: [PATCH 19/31] [ENG-9157] [AOI] Add atomic ability to remove contributors from children projects in API (#11605) * raise permission error if user is not admin on child node * fix tests --- api/nodes/serializers.py | 5 ++-- api/nodes/views.py | 3 +++ ...t_draft_registration_contributor_detail.py | 13 ++++++++++ .../views/test_node_contributors_detail.py | 24 ++++++++++++++++++- 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/api/nodes/serializers.py b/api/nodes/serializers.py index 51e614bcdd9..1e68d1ff2e4 100644 --- a/api/nodes/serializers.py +++ b/api/nodes/serializers.py @@ -1223,7 +1223,7 @@ def get_unregistered_contributor(self, obj): class NodeContributorsBulkCreateListSerializer(JSONAPIListSerializer): - email_preferences = ['default', 'false'] + email_preferences = ['false'] def _parse_payload_item(self, item, user_map): uid = item.get('_id') @@ -1234,7 +1234,8 @@ def _parse_payload_item(self, item, user_map): raise exceptions.ValidationError(detail='A user ID or full name must be provided to add a contributor.') email_pref = self.context['request'].GET.get('send_email') or self.context['default_email'] - if email_pref not in self.email_preferences: + email_preferences = getattr(self.child, 'email_preferences', self.email_preferences) + if email_pref not in email_preferences: raise exceptions.ValidationError(f'{email_pref} is not a valid email preference.') return { diff --git a/api/nodes/views.py b/api/nodes/views.py index 51332fea7c4..69c7fa7d25e 100644 --- a/api/nodes/views.py +++ b/api/nodes/views.py @@ -98,6 +98,7 @@ NodeLinksShowIfVersion, ReadOnlyIfWithdrawn, ) +from osf.utils import permissions as osf_permissions from api.nodes.serializers import ( NodeSerializer, ForwardNodeAddonSettingsSerializer, @@ -568,6 +569,8 @@ def perform_destroy(self, instance): ) with transaction.atomic(): for descendant in targets: + if not descendant.has_permission(auth.user, osf_permissions.ADMIN): + raise PermissionDenied(f'Must have admin permission on {descendant._id} to remove contributor.') removed = descendant.remove_contributor(instance, auth) if not removed: raise ValidationError(f'{descendant._id} must have at least one registered admin contributor') diff --git a/api_tests/draft_registrations/views/test_draft_registration_contributor_detail.py b/api_tests/draft_registrations/views/test_draft_registration_contributor_detail.py index ff7907c85fc..b60527b7780 100644 --- a/api_tests/draft_registrations/views/test_draft_registration_contributor_detail.py +++ b/api_tests/draft_registrations/views/test_draft_registration_contributor_detail.py @@ -277,6 +277,19 @@ def test_remove_contributor_include_children_is_atomic_on_violation(self, app, u project.reload() assert user_write_contrib not in project.contributors + def test_remove_contributor_include_children_forbidden_if_unauthorized_child(self, app, user, user_write_contrib, project): + # Draft registrations have no child components, so include_children does not + # trigger any descendant permission checks; the contributor is simply removed. + assert user_write_contrib in project.contributors + + url = f'/{API_BASE}draft_registrations/{project._id}/contributors/{user_write_contrib._id}/?include_children=true' + with disconnected_from_listeners(contributor_removed): + res = app.delete(url, auth=user.auth) + assert res.status_code == 204 + + project.reload() + assert user_write_contrib not in project.contributors + @pytest.mark.django_db class TestDraftBibliographicContributorDetail(): diff --git a/api_tests/nodes/views/test_node_contributors_detail.py b/api_tests/nodes/views/test_node_contributors_detail.py index 54487511681..0f5435df52e 100644 --- a/api_tests/nodes/views/test_node_contributors_detail.py +++ b/api_tests/nodes/views/test_node_contributors_detail.py @@ -493,7 +493,29 @@ def test_remove_contributor_include_children_is_atomic_on_violation(self, app, u with disconnected_from_listeners(contributor_removed): res = app.delete(url, auth=user.auth, expect_errors=True) - assert res.status_code == 400 + assert res.status_code == 403 + + project.reload() + child.reload() + + assert user_write_contrib in project.contributors + assert user_write_contrib in child.contributors + + def test_remove_contributor_include_children_forbidden_if_unauthorized_child(self, app, user, user_write_contrib, project): + other_admin = AuthUserFactory() + child = ProjectFactory(parent=project, creator=other_admin) + child.add_contributor(user_write_contrib, permissions=permissions.WRITE, visible=True, save=True) + + assert user in project.contributors + assert user not in child.contributors + assert other_admin in child.contributors + assert user_write_contrib in project.contributors + assert user_write_contrib in child.contributors + + url = f'/{API_BASE}nodes/{project._id}/contributors/{user_write_contrib._id}/?include_children=true' + with disconnected_from_listeners(contributor_removed): + res = app.delete(url, auth=user.auth, expect_errors=True) + assert res.status_code == 403 project.reload() child.reload() From 7e5c9f8ddfb1702df60e07d67ca8fbc4013a3d16 Mon Sep 17 00:00:00 2001 From: mkovalua Date: Mon, 2 Mar 2026 15:35:58 +0200 Subject: [PATCH 20/31] [ENG-10309] Add meta to API preprint detail view to indicate spam status (#11604) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * indicate if the preprint is spammy with meta: {flagged_content: true} * make sure that the sitemap doesn’t include any spammy preprint. * update generate sitemap test * get base get_meta in child meta to keep all needed meta data * exclude spam content for preprints sitemap * unify server response on getting specific registry/node/preprint if it is spammy to make it possible to create info page on front end * exclude spam from Nodes and Registrations on sitemap generation * avoid errors for objects where spam may not be determined * update code * show more specific message for spammy resource on contributor access {'flagged_content': True} to render specific UI to show contributor how to get support to ham the resource * implement unittests for spammy resource contributor access * refactor code * show if resource is spammed on retrieval to all types of user * add tests * ensure that the sitemap is working correctly for spammed content * Delete api_tests/preprints/views/test_preprint_detail_new_behaviors.py remove not needed test * raise Gone for deleted not spammed preprint to keep it same as for other deleted resources * change 404 to 410 for deleted preprints in tests * change 404 to 410 for deleted preprints in tests --- api/base/utils.py | 6 ++- api/files/views.py | 2 +- api/preprints/views.py | 11 +++-- api/registrations/views.py | 2 +- api_tests/files/views/test_file_detail.py | 18 +++++++ .../identifiers/views/test_identifier_list.py | 10 ++-- api_tests/nodes/views/test_node_detail.py | 19 ++++++++ .../views/test_preprint_citations.py | 16 +++---- .../test_preprint_contributors_detail.py | 8 ++-- .../views/test_preprint_contributors_list.py | 8 ++-- .../preprints/views/test_preprint_detail.py | 20 ++++++++ .../views/test_preprint_files_list.py | 8 ++-- .../views/test_registration_detail.py | 23 +++++++++ osf_tests/test_generate_sitemap.py | 47 +++++++++++++++++++ scripts/generate_sitemap.py | 7 +-- 15 files changed, 170 insertions(+), 35 deletions(-) diff --git a/api/base/utils.py b/api/base/utils.py index 31bc35fd8d4..6b967760e32 100644 --- a/api/base/utils.py +++ b/api/base/utils.py @@ -155,7 +155,11 @@ def get_object_or_error(model_or_qs, query_or_pk=None, request=None, display_nam if display_name is None: raise Gone else: - raise Gone(detail=f'The requested {display_name} is no longer available.') + AbstractNode = apps.get_model('osf', 'AbstractNode') + spammy_node = isinstance(obj, AbstractNode) and obj.is_spammy + raise Gone( + detail=f'The requested {display_name} is no longer available.', meta={'flagged_content': True} if spammy_node else {}, + ) return obj diff --git a/api/files/views.py b/api/files/views.py index c19aec53d2c..d96289d4010 100644 --- a/api/files/views.py +++ b/api/files/views.py @@ -51,7 +51,7 @@ def get_file(self, check_permissions=True): raise Gone(detail='The requested file is no longer available.') if getattr(obj.target, 'deleted', None): - raise Gone(detail='The requested file is no longer available') + raise Gone(detail='The requested file is no longer available.', meta={'flagged_content': getattr(obj.target, 'is_spammy', False)}) if getattr(obj.target, 'is_retracted', False): raise Gone(detail='The requested file is no longer available.') diff --git a/api/preprints/views.py b/api/preprints/views.py index 27986428958..35bc61aa9d5 100644 --- a/api/preprints/views.py +++ b/api/preprints/views.py @@ -22,7 +22,7 @@ from api.actions.serializers import ReviewActionSerializer from api.actions.views import get_review_actions_queryset from api.base.pagination import PreprintContributorPagination -from api.base.exceptions import Conflict +from api.base.exceptions import Conflict, Gone from api.base.views import JSONAPIBaseView, WaterButlerMixin from api.base.filters import ListFilterMixin, PreprintAsTargetFilterMixin, PreprintFilterMixin from api.base.parsers import ( @@ -126,16 +126,19 @@ def get_preprint(self, check_object_permissions=True, ignore_404=False): qs = Preprint.published_objects.filter(versioned_guids__guid___id=base_guid_id).order_by('-versioned_guids__version') preprint = qs.select_for_update().first() if check_select_for_update(self.request) else qs.select_related('node').first() + user = self.request.user if not preprint: sentry.log_message(f'Preprint not found: [guid={base_guid_id}, version={preprint_version}]') if ignore_404: return raise NotFound if preprint.deleted is not None: - sentry.log_message(f'Preprint deleted: [guid={base_guid_id}, version={preprint_version}]') - raise NotFound + if preprint.is_spammy: + raise Gone(detail='The requested preprint is no longer available.', meta={'flagged_content': True}) + else: + sentry.log_message(f'Preprint deleted: [guid={base_guid_id}, version={preprint_version}]') + raise Gone(detail='The requested preprint is no longer available.') - user = self.request.user if isinstance(user, AnonymousUser): user_is_reviewer = user_is_contributor = False else: diff --git a/api/registrations/views.py b/api/registrations/views.py index caab1e134de..c1bb1ba42a4 100644 --- a/api/registrations/views.py +++ b/api/registrations/views.py @@ -122,7 +122,7 @@ def get_node(self, check_object_permissions=True, **annotations): raise NotFound if node.deleted: - raise Gone(detail='The requested registration is no longer available.') + raise Gone(detail='The requested registration is no longer available.', meta={'flagged_content': node.is_spammy}) if check_object_permissions: self.check_object_permissions(self.request, node) diff --git a/api_tests/files/views/test_file_detail.py b/api_tests/files/views/test_file_detail.py index 45d3888dcc3..e9f432d60d1 100644 --- a/api_tests/files/views/test_file_detail.py +++ b/api_tests/files/views/test_file_detail.py @@ -607,6 +607,24 @@ def test_folder_files_relationships_contains_guid_not_id( assert node._id in split_href assert node.id not in split_href + def test_spammed_node_file_detail_gone(self, app, node, file_url, user): + node.confirm_spam(save=True, train_spam_services=False) + res = app.get(file_url, expect_errors=True) + assert res.status_code == 410 + error = res.json['errors'][0] + assert error['detail'] == 'The requested file is no longer available.' + assert 'meta' in error + assert error['meta']['flagged_content'] + + def test_deleted_file_not_spammed_gone(self, app, user, file, file_url): + file.delete(user=user, save=True) + res = app.get(file_url, expect_errors=True) + assert res.status_code == 410 + error = res.json['errors'][0] + assert error['detail'] == 'The requested file is no longer available.' + assert 'meta' in error + assert not error['meta'].get('flagged_content', False) + @pytest.mark.django_db class TestFileVersionView: diff --git a/api_tests/identifiers/views/test_identifier_list.py b/api_tests/identifiers/views/test_identifier_list.py index 95277a38a13..7a117b4e6f4 100644 --- a/api_tests/identifiers/views/test_identifier_list.py +++ b/api_tests/identifiers/views/test_identifier_list.py @@ -380,26 +380,26 @@ def test_preprint_identifier_list_permissions_deleted( # test_unpublished_preprint_identifier_unauthenticated res = app.get(url_preprint_identifier, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # test_unpublished_preprint_identifier_noncontrib_authenticated non_contrib = AuthUserFactory() res = app.get(url_preprint_identifier, auth=non_contrib.auth, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # test_unpublished_preprint_identifier_admin_authenticated res = app.get(url_preprint_identifier, auth=user.auth, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # test_unpublished_preprint_identifier_readcontrib_authenticated read_user = AuthUserFactory() preprint.add_contributor(read_user, READ, save=True) res = app.get(url_preprint_identifier, auth=read_user.auth, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # test_published_preprint_identifier_unauthenticated res = app.get(url_preprint_identifier, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 def test_preprint_identifier_list_permissions_abandoned( self, app, user, data_preprint_identifier, preprint, url_preprint_identifier): diff --git a/api_tests/nodes/views/test_node_detail.py b/api_tests/nodes/views/test_node_detail.py index 5fa0cd8e150..e03cff83ca9 100644 --- a/api_tests/nodes/views/test_node_detail.py +++ b/api_tests/nodes/views/test_node_detail.py @@ -571,3 +571,22 @@ def test_current_user_permissions_vol(self, app, user, url_public, project_publi private_link.save() res = app.get(f'{url_public}?view_only={private_link.key}', auth=user.auth) assert [permissions.READ] == res.json['data']['attributes']['current_user_permissions'] + + def test_spammed_node_detail_gone(self, app, user, project_public, url_public): + project_public.confirm_spam(save=True, train_spam_services=False) + res = app.get(url_public, expect_errors=True) + assert res.status_code == 410 + error = res.json['errors'][0] + assert error['detail'] == 'The requested node is no longer available.' + assert 'meta' in error + assert error['meta']['flagged_content'] + + def test_not_spammed_deleted_node_detail_gone(self, app, user, project_public, url_public): + project_public.is_deleted = True + project_public.save() + res = app.get(url_public, expect_errors=True) + assert res.status_code == 410 + error = res.json['errors'][0] + assert error['detail'] == 'The requested node is no longer available.' + assert 'meta' in error + assert not error['meta'].get('flagged_content', False) diff --git a/api_tests/preprints/views/test_preprint_citations.py b/api_tests/preprints/views/test_preprint_citations.py index a95f7527d2f..4fa6fe69be3 100644 --- a/api_tests/preprints/views/test_preprint_citations.py +++ b/api_tests/preprints/views/test_preprint_citations.py @@ -122,21 +122,21 @@ def test_deleted_preprint_citations(self): # Unauthenticated res = self.app.get(self.published_preprint_url, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # Non contrib res = self.app.get(self.published_preprint_url, auth=self.other_contrib.auth, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # Write contrib self.published_preprint.add_contributor(self.other_contrib, WRITE, save=True) res = self.app.get(self.published_preprint_url, auth=self.other_contrib.auth, expect_errors=True) # Really because preprint is in initial machine state - assert res.status_code == 404 + assert res.status_code == 410 # Admin contrib res = self.app.get(self.published_preprint_url, auth=self.admin_contributor.auth, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 def test_abandoned_preprint_citations(self): self.published_preprint.machine_state = DefaultStates.INITIAL.value @@ -243,21 +243,21 @@ def test_deleted_preprint_citations(self): # Unauthenticated res = self.app.get(self.published_preprint_url, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # Non contrib res = self.app.get(self.published_preprint_url, auth=self.other_contrib.auth, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # Write contrib self.published_preprint.add_contributor(self.other_contrib, WRITE, save=True) res = self.app.get(self.published_preprint_url, auth=self.other_contrib.auth, expect_errors=True) # Really because preprint is in initial machine state - assert res.status_code == 404 + assert res.status_code == 410 # Admin contrib res = self.app.get(self.published_preprint_url, auth=self.admin_contributor.auth, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 def test_abandoned_preprint_citations(self): self.published_preprint.machine_state = DefaultStates.INITIAL.value diff --git a/api_tests/preprints/views/test_preprint_contributors_detail.py b/api_tests/preprints/views/test_preprint_contributors_detail.py index 726656fda75..e052c4eb62d 100644 --- a/api_tests/preprints/views/test_preprint_contributors_detail.py +++ b/api_tests/preprints/views/test_preprint_contributors_detail.py @@ -194,21 +194,21 @@ def test_preprint_contributor_deleted( # Unauthenticated res = app.get(url_published, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # Noncontrib user_two = AuthUserFactory() res = app.get(url_published, auth=user_two.auth, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # Write contrib preprint_published.add_contributor(user_two, permissions.WRITE, save=True) res = app.get(url_published, auth=user_two.auth, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # Admin contrib res = app.get(url_published, auth=user.auth, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 def test_preprint_contributor_private( self, app, user, preprint_published, url_published): diff --git a/api_tests/preprints/views/test_preprint_contributors_list.py b/api_tests/preprints/views/test_preprint_contributors_list.py index e069ec7d9d9..53da11cb453 100644 --- a/api_tests/preprints/views/test_preprint_contributors_list.py +++ b/api_tests/preprints/views/test_preprint_contributors_list.py @@ -205,20 +205,20 @@ def test_return_preprint_contributors_deleted_preprint( # test_deleted_preprint_contributors_logged_out res = app.get(url_published, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # test_deleted_preprint_contributor_non_contrib res = app.get(url_published, auth=user_two.auth, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # test_deleted_preprint_contributors_read_contrib_logged_out preprint_published.add_contributor(user_two, permissions.READ, save=True) res = app.get(url_published, auth=user_two.auth, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # test_deleted_preprint_contributors_admin res = app.get(url_published, auth=user.auth, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 def test_return_preprint_contributors_abandoned_preprint( self, app, user, user_two, preprint_published, url_published): diff --git a/api_tests/preprints/views/test_preprint_detail.py b/api_tests/preprints/views/test_preprint_detail.py index 283f7029c9f..1c08e34bc85 100644 --- a/api_tests/preprints/views/test_preprint_detail.py +++ b/api_tests/preprints/views/test_preprint_detail.py @@ -179,6 +179,26 @@ def test_return_affiliated_institutions(self, app, user, preprint, institution, relationship_link = res.json['data']['relationships']['affiliated_institutions']['links']['self']['href'] assert f'/v2/preprints/{preprint._id}/relationships/institutions/' in relationship_link + def test_spammed_preprint_detail_gone(self, app, preprint, user, url): + preprint.confirm_spam(save=True, train_spam_services=False) + url = f'/{API_BASE}preprints/{preprint._id}/' + res = app.get(url, expect_errors=True) + assert res.status_code == 410 + error = res.json['errors'][0] + assert error['detail'] == 'The requested preprint is no longer available.' + assert 'meta' in error + assert error['meta']['flagged_content'] is True + + def test_not_spammed_deleted_preprint_detail_gone(self, app, preprint, user, url): + preprint.deleted = timezone.now() + preprint.save() + res = app.get(url, expect_errors=True) + assert res.status_code == 410 + error = res.json['errors'][0] + assert error['detail'] == 'The requested preprint is no longer available.' + assert 'meta' in error + assert not error['meta'].get('flagged_content', False) + @pytest.mark.django_db class TestPreprintDelete: diff --git a/api_tests/preprints/views/test_preprint_files_list.py b/api_tests/preprints/views/test_preprint_files_list.py index 6b7af924e60..2443f429111 100644 --- a/api_tests/preprints/views/test_preprint_files_list.py +++ b/api_tests/preprints/views/test_preprint_files_list.py @@ -107,20 +107,20 @@ def test_deleted_preprint_files(self): # Unauthenticated res = self.app.get(self.url, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # Noncontrib res = self.app.get(self.url, auth=self.user_two.auth, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # Write contributor self.preprint.add_contributor(self.user_two, WRITE, save=True) res = self.app.get(self.url, auth=self.user_two.auth, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 # Admin contrib res = self.app.get(self.url, auth=self.user.auth, expect_errors=True) - assert res.status_code == 404 + assert res.status_code == 410 def test_withdrawn_preprint_files(self): self.preprint.date_withdrawn = timezone.now() diff --git a/api_tests/registrations/views/test_registration_detail.py b/api_tests/registrations/views/test_registration_detail.py index 17649ad7b8d..9d90703ed75 100644 --- a/api_tests/registrations/views/test_registration_detail.py +++ b/api_tests/registrations/views/test_registration_detail.py @@ -233,6 +233,29 @@ def test_registration_detail( expected_url = f'{public_url}relationships/subjects/' assert urlparse(self_url).path == expected_url + def test_spammed_registration_detail_gone(self, app, user, public_registration, private_registration): + for registration in (public_registration, private_registration): + registration.confirm_spam(save=True, train_spam_services=False) + url = f'/{API_BASE}registrations/{registration._id}/' + res = app.get(url, expect_errors=True) + assert res.status_code == 410 + error = res.json['errors'][0] + assert error['detail'] == 'The requested registration is no longer available.' + assert 'meta' in error + assert error['meta']['flagged_content'] + + def test_not_spammed_detailed_registration_detail_gone(self, app, user, public_registration, private_registration): + for registration in (public_registration, private_registration): + registration.deleted = timezone.now() + registration.save() + url = f'/{API_BASE}registrations/{registration._id}/' + res = app.get(url, expect_errors=True) + assert res.status_code == 410 + error = res.json['errors'][0] + assert error['detail'] == 'The requested registration is no longer available.' + assert 'meta' in error + assert not error['meta'].get('flagged_content', False) + class TestRegistrationUpdateTestCase: diff --git a/osf_tests/test_generate_sitemap.py b/osf_tests/test_generate_sitemap.py index a84bb1bdcfd..675901b7922 100644 --- a/osf_tests/test_generate_sitemap.py +++ b/osf_tests/test_generate_sitemap.py @@ -125,6 +125,33 @@ def preprint_other(self, project_preprint_other, user_admin_project_public, prov creator=user_admin_project_public, provider=provider_other) + @pytest.fixture(autouse=True) + def project_spammed(self, user_admin_project_public): + project = ProjectFactory(creator=user_admin_project_public, is_public=True) + project.confirm_spam(save=True, train_spam_services=False) + return project + + @pytest.fixture(autouse=True) + def preprint_spammed(self, project_preprint_osf, user_admin_project_public, provider_osf): + preprint = PreprintFactory( + project=project_preprint_osf, + creator=user_admin_project_public, + provider=provider_osf + ) + preprint.confirm_spam(save=True, train_spam_services=False) + return preprint + + @pytest.fixture(autouse=True) + def registration_spammed(self, user_admin_project_public, project_registration_public): + registration = RegistrationFactory( + project=project_registration_public, + creator=user_admin_project_public, + is_public=True + ) + # Flag the registration as spam + registration.confirm_spam(save=True, train_spam_services=False) + return registration + @pytest.fixture(autouse=True) def all_included_links(self, user_admin_project_public, user_admin_project_private, project_registration_public, project_preprint_osf, project_preprint_other, @@ -199,3 +226,23 @@ def test_deleted_project_link_not_included(self, project_deleted, create_tmp_dir urls = get_all_sitemap_urls() assert urljoin(settings.DOMAIN, project_deleted.url + 'overview') not in urls + + def test_spammed_project_link_not_included(self, project_spammed, create_tmp_directory): + with mock.patch('website.settings.STATIC_FOLDER', create_tmp_directory): + urls = get_all_sitemap_urls() + + assert urljoin(settings.DOMAIN, project_spammed.url + 'overview') not in urls + + def test_spammed_preprint_link_not_included(self, preprint_spammed, provider_osf, create_tmp_directory): + with mock.patch('website.settings.STATIC_FOLDER', create_tmp_directory): + urls = get_all_sitemap_urls() + + spammed_url = urljoin(settings.DOMAIN, f'/preprints/{provider_osf._id}/{preprint_spammed._id}') + assert spammed_url not in urls + + def test_spammed_registration_link_not_included(self, registration_spammed, create_tmp_directory): + with mock.patch('website.settings.STATIC_FOLDER', create_tmp_directory): + urls = get_all_sitemap_urls() + + # Verify the spammed registration's overview page does not make it into the XML + assert urljoin(settings.DOMAIN, registration_spammed.url + 'overview') not in urls diff --git a/scripts/generate_sitemap.py b/scripts/generate_sitemap.py index 6039eb56025..7ab62c42a99 100644 --- a/scripts/generate_sitemap.py +++ b/scripts/generate_sitemap.py @@ -19,6 +19,7 @@ from framework.celery_tasks import app as celery_app from django.db.models import Q, F, OuterRef, Subquery from osf.models import OSFUser, AbstractNode, Preprint, PreprintProvider +from osf.models.spam import SpamStatus from osf.utils.workflows import DefaultStates from scripts import utils as script_utils from website import settings @@ -185,7 +186,7 @@ def generate(self): # AbstractNode urls (Nodes and Registrations, no Collections) objs = (AbstractNode.objects .filter(is_public=True, is_deleted=False, retraction_id__isnull=True) - .exclude(type__in=['osf.collection']) + .exclude(type__in=['osf.collection'], spam_status__in=[SpamStatus.SPAM, SpamStatus.FLAGGED]) .values('guids___id', 'modified')) progress.start(objs.count(), 'NODE: ') for obj in objs: @@ -198,8 +199,8 @@ def generate(self): self.log_errors('NODE', obj['guids___id'], e) progress.increment() progress.stop() - #Removed previous logic as it blocked withdrawn preprints to get in sitemap generator - objs = Preprint.objects.filter(date_published__isnull=False).annotate( + objs = Preprint.objects.filter( + date_published__isnull=False).exclude(spam_status__in=[SpamStatus.SPAM, SpamStatus.FLAGGED]).annotate( most_recent_non_withdrawn=Subquery( Preprint.objects.filter( guids=OuterRef('guids') From c2adade574eb2493a35bf0f46da1467c00e97139 Mon Sep 17 00:00:00 2001 From: antkryt Date: Mon, 2 Mar 2026 16:59:42 +0200 Subject: [PATCH 21/31] remove old address from email templates (#11616) --- website/templates/file_operation_failed.html.mako | 1 - website/templates/file_operation_success.html.mako | 1 - website/templates/notify_base.mako | 3 --- website/templates/reviews_resubmission_confirmation.html.mako | 2 +- 4 files changed, 1 insertion(+), 6 deletions(-) diff --git a/website/templates/file_operation_failed.html.mako b/website/templates/file_operation_failed.html.mako index eef83a49cbd..fa9d7f8ebb8 100644 --- a/website/templates/file_operation_failed.html.mako +++ b/website/templates/file_operation_failed.html.mako @@ -72,7 +72,6 @@

Copyright © 2025 Center For Open Science, All rights reserved. | Privacy Policy

-

210 Ridge McIntire Road, Suite 500, Charlottesville, VA 22903-5083

diff --git a/website/templates/file_operation_success.html.mako b/website/templates/file_operation_success.html.mako index cf692dae0bd..16c63963638 100644 --- a/website/templates/file_operation_success.html.mako +++ b/website/templates/file_operation_success.html.mako @@ -71,7 +71,6 @@

Copyright © 2025 Center For Open Science, All rights reserved. | Privacy Policy

-

210 Ridge McIntire Road, Suite 500, Charlottesville, VA 22903-5083

diff --git a/website/templates/notify_base.mako b/website/templates/notify_base.mako index 676868b704b..816ae3fbcf0 100644 --- a/website/templates/notify_base.mako +++ b/website/templates/notify_base.mako @@ -119,9 +119,6 @@ Center For Open Science, All rights reserved. | Privacy Policy

-

- 210 Ridge McIntire Road, Suite 500, Charlottesville, VA 22903-5083 -

${self.footer()}

diff --git a/website/templates/reviews_resubmission_confirmation.html.mako b/website/templates/reviews_resubmission_confirmation.html.mako index 2b3188de595..e5e8e3caa81 100644 --- a/website/templates/reviews_resubmission_confirmation.html.mako +++ b/website/templates/reviews_resubmission_confirmation.html.mako @@ -35,7 +35,7 @@
Your ${reviewable_provider_name} and OSF teams

- Center for Open Science
210 Ridge McIntire Road, Suite 500, Charlottesville, VA 22903 + Center for Open Science

Privacy Policy From eff0ef79332bdcf7ff8abe70be826edc3dbb56cf Mon Sep 17 00:00:00 2001 From: ihorsokhanexoft Date: Wed, 4 Mar 2026 15:41:55 +0200 Subject: [PATCH 22/31] [ENG-9730] Spam data is not shared across all user's objects (#11614) * fixed not shared spam_data among user and his nodes/preprints * fixed case when resource is a user * handle hammy user cases * fixed old tests * creator is spammed instead of flagged when a node contains spam * fixed tests and case when suspend user directly thus must spam main node/preprint * capture notifications --- osf/external/spam/tasks.py | 104 ++- osf/models/mixins.py | 36 +- osf/models/spam.py | 2 +- osf/models/user.py | 9 +- osf_tests/external/akismet/test_akismet.py | 4 +- osf_tests/external/oopspam/test_oopspam.py | 4 +- osf_tests/test_node.py | 960 ++++++++++++++++++++- scripts/find_spammy_content.py | 4 +- scripts/tests/test_find_spammy_content.py | 6 +- 9 files changed, 1075 insertions(+), 54 deletions(-) diff --git a/osf/external/spam/tasks.py b/osf/external/spam/tasks.py index 9c2a348cdcd..4cb4c7784b5 100644 --- a/osf/external/spam/tasks.py +++ b/osf/external/spam/tasks.py @@ -103,6 +103,29 @@ def check_resource_with_spam_services(resource, content, author, author_email, r """ Return statements used only for debugging and recording keeping """ + from osf.models import OSFUser, AbstractNode, Preprint + + def set_found_spam_info(resource, client, details): + if not resource.spam_data.get('who_flagged'): + resource.spam_data['who_flagged'] = client.NAME + elif resource.spam_data['who_flagged'] != client.NAME: + resource.spam_data['who_flagged'] = 'both' + + if client.NAME == 'akismet': + resource.spam_pro_tip = details + if client.NAME == 'oopspam': + resource.spam_data['oopspam_data'] = details + + def set_collected_info(resource): + resource.spam_data['headers'] = { + 'Remote-Addr': request_kwargs.get('remote_addr'), + 'User-Agent': request_kwargs.get('user_agent'), + 'Referer': request_kwargs.get('referer'), + } + resource.spam_data['content'] = content + resource.spam_data['author'] = author + resource.spam_data['author_email'] = author_email + any_is_spam = False kwargs = dict( @@ -121,30 +144,57 @@ def check_resource_with_spam_services(resource, content, author, author_email, r if settings.OOPSPAM_ENABLED: spam_clients.append(OOPSpamClient()) + if isinstance(resource, OSFUser): + creator = resource + else: + creator = OSFUser.objects.get(username=author_email) + + nodes_to_flag = creator.nodes.filter(is_public=True, is_deleted=False) + preprints_to_flag = creator.preprints.filter(is_public=True, deleted__isnull=True) + for client in spam_clients: is_spam, details = client.check_content(**kwargs) - if is_spam: - any_is_spam = True - if not resource.spam_data.get('who_flagged'): - resource.spam_data['who_flagged'] = client.NAME - elif resource.spam_data['who_flagged'] != client.NAME: - resource.spam_data['who_flagged'] = 'both' - - if client.NAME == 'akismet': - resource.spam_pro_tip = details - if client.NAME == 'oopspam': - resource.spam_data['oopspam_data'] = details - - if any_is_spam: - resource.spam_data['headers'] = { - 'Remote-Addr': request_kwargs.get('remote_addr'), - 'User-Agent': request_kwargs.get('user_agent'), - 'Referer': request_kwargs.get('referer'), - } - resource.spam_data['content'] = content - resource.spam_data['author'] = author - resource.spam_data['author_email'] = author_email - resource.flag_spam() + if not is_spam: + continue + + any_is_spam = True + + set_found_spam_info(resource, client, details) + if not isinstance(resource, OSFUser) and not creator.is_hammy: + set_found_spam_info(creator, client, details) + + for node in nodes_to_flag: + set_found_spam_info(node, client, details) + + for preprint in preprints_to_flag: + set_found_spam_info(preprint, client, details) + + if not any_is_spam: + return any_is_spam + + sentry.log_message( + f"Spam data detected by akismet/oops for {resource._id}:" + f"{resource.spam_pro_tip or resource.spam_data.get('oopspam_data')}" + ) + + set_collected_info(resource) + resource.flag_spam(skip_user_suspension=True) + + # set spam_data but don't flag the creator because it'll happen at the end of check_resource_for_spam_postcommit + if not isinstance(resource, OSFUser) and not creator.is_hammy: + set_collected_info(creator) + creator.save() + + for node in nodes_to_flag: + set_collected_info(node) + node.flag_spam(skip_user_suspension=True) + + for preprint in preprints_to_flag: + set_collected_info(preprint) + preprint.flag_spam(skip_user_suspension=True) + + AbstractNode.objects.bulk_update(nodes_to_flag, ['spam_status', 'spam_data', 'spam_pro_tip'], batch_size=100) + Preprint.objects.bulk_update(preprints_to_flag, ['spam_status', 'spam_data', 'spam_pro_tip'], batch_size=100) return any_is_spam @@ -158,6 +208,10 @@ def check_resource_for_spam_postcommit(guid, content, author, author_email, requ if not resource: return f'{guid} not found' + if isinstance(resource, OSFUser) and resource.is_hammy: + sentry.log_message(f"User {guid} is not checked for spam because of ham status") + return + spammy_domains = _check_resource_for_domains(resource, content) if spammy_domains: sentry.log_message(f"Spammy domains detected for {guid}: {spammy_domains}") @@ -181,9 +235,9 @@ def check_resource_for_spam_postcommit(guid, content, author, author_email, requ resource.save() - if hasattr(resource, 'check_spam_user'): - user = OSFUser.objects.get(username=author_email) - resource.check_spam_user(user) + user = OSFUser.objects.get(username=author_email) + if hasattr(resource, 'check_spam_user') and not user.is_hammy: + resource.check_spam_user(user, domains=list(spammy_domains)) @celery_app.task(ignore_results=False, max_retries=5, default_retry_delay=60) diff --git a/osf/models/mixins.py b/osf/models/mixins.py index 1d162ba2bb9..66fc73c94fb 100644 --- a/osf/models/mixins.py +++ b/osf/models/mixins.py @@ -2365,28 +2365,32 @@ def check_spam(self, user, saved_fields, request_headers): request_headers, ) - def check_spam_user(self, user): + def check_spam_user(self, user, domains=None): if ( - settings.SPAM_ACCOUNT_SUSPENSION_ENABLED - and (timezone.now() - user.date_confirmed) <= settings.SPAM_ACCOUNT_SUSPENSION_THRESHOLD + settings.SPAM_ACCOUNT_SUSPENSION_ENABLED + and (timezone.now() - user.date_confirmed) <= settings.SPAM_ACCOUNT_SUSPENSION_THRESHOLD ) or ( - settings.SPAM_AUTOBAN_IP_BLOCK and self.spam_data.get('oopspam_data', None) - and self.spam_data['oopspam_data']['Details']['isIPBlocked'] + settings.SPAM_AUTOBAN_IP_BLOCK and self.spam_data.get('oopspam_data', None) + and self.spam_data['oopspam_data']['Details']['isIPBlocked'] ): - self.suspend_spam_user(user) + self.suspend_spam_user(user, domains=domains) - def suspend_spam_user(self, user): + def suspend_spam_user(self, user, domains=None, self_spam=False): """ This suspends a users account and makes all there resources private, key word here is SUSPENDS this should not delete the account or any info associated with it. It should not be assumed the account is spam and it should not be used to train spam detecting services. + + self_spam - defines if this object must be spammed. When spam is found by akismet or oopsystem, object becomes flagged + and we don't need to spam it but for some cases we want to manually call this method with self spamming. """ + domains = domains or [] if user.is_hammy: return False - self.confirm_spam(save=True, train_spam_services=False) + + self.flag_spam(skip_user_suspension=True) # Suspend the flagged user for spam. - user.flag_spam() if not user.is_disabled: user.deactivate_account() NotificationType.Type.USER_SPAM_BANNED.instance.emit( @@ -2397,19 +2401,21 @@ def suspend_spam_user(self, user): 'can_change_preferences': False } ) + + user.confirm_spam(domains=domains or [], save=False, skip_resources_spam=True) user.save() # Make public nodes private from this contributor for node in user.all_nodes: - if self._id != node._id and len(node.contributors) == 1 and node.is_public: - node.confirm_spam(save=True, train_spam_services=False) + if (self._id != node._id or self_spam) and len(node.contributors) == 1 and node.is_public: + node.confirm_spam(save=True, domains=domains, train_spam_services=False) # Make preprints private from this contributor for preprint in user.preprints.all(): - if self._id != preprint._id and len(preprint.contributors) == 1 and preprint.is_public: - preprint.confirm_spam(save=True, train_spam_services=False) + if (self._id != preprint._id or self_spam) and len(preprint.contributors) == 1 and preprint.is_public: + preprint.confirm_spam(save=True, domains=domains, train_spam_services=False) - def flag_spam(self): + def flag_spam(self, skip_user_suspension=False): """ Overrides SpamMixin#flag_spam. """ super().flag_spam() @@ -2425,7 +2431,7 @@ def flag_spam(self): ) log.save() - if settings.SPAM_THROTTLE_AUTOBAN: + if settings.SPAM_THROTTLE_AUTOBAN and not skip_user_suspension: creator = self.creator yesterday = timezone.now() - timezone.timedelta(days=1) node_spam_count = creator.all_nodes.filter(spam_status__in=[SpamStatus.FLAGGED, SpamStatus.SPAM], diff --git a/osf/models/spam.py b/osf/models/spam.py index d2f5946533c..43e862d97db 100644 --- a/osf/models/spam.py +++ b/osf/models/spam.py @@ -68,7 +68,7 @@ class Meta: default=dict, blank=True, validators=[_validate_reports] ) - def flag_spam(self): + def flag_spam(self, **kwargs): # If ham and unedited then tell user that they should read it again if self.spam_status == SpamStatus.UNKNOWN: self.spam_status = SpamStatus.FLAGGED diff --git a/osf/models/user.py b/osf/models/user.py index d80b06fba2c..5c8d7f165ed 100644 --- a/osf/models/user.py +++ b/osf/models/user.py @@ -1461,15 +1461,18 @@ def confirm_email(self, token, merge=False): return True - def confirm_spam(self, domains=None, save=True, train_spam_services=False): + def confirm_spam(self, domains=None, save=True, train_spam_services=False, skip_resources_spam=False): self.deactivate_account() super().confirm_spam(domains=domains, save=save, train_spam_services=train_spam_services) + if skip_resources_spam: + return + # Don't train on resources merely associated with spam user for node in self.nodes.filter(is_public=True, is_deleted=False): - node.confirm_spam(train_spam_services=train_spam_services) + node.confirm_spam(domains=domains, train_spam_services=train_spam_services) for preprint in self.preprints.filter(is_public=True, deleted__isnull=True): - preprint.confirm_spam(train_spam_services=train_spam_services) + preprint.confirm_spam(domains=domains, train_spam_services=train_spam_services) def confirm_ham(self, save=False, train_spam_services=False): self.reactivate_account() diff --git a/osf_tests/external/akismet/test_akismet.py b/osf_tests/external/akismet/test_akismet.py index 95b119c2651..d9c7cb2ec63 100644 --- a/osf_tests/external/akismet/test_akismet.py +++ b/osf_tests/external/akismet/test_akismet.py @@ -140,7 +140,7 @@ def test_do_spam_check_true(self, mock_akismet, user, request_headers): user.do_check_spam( author='test-author', - author_email='test@test.com', + author_email=user.username, content='test', request_headers=request_headers ) @@ -148,7 +148,7 @@ def test_do_spam_check_true(self, mock_akismet, user, request_headers): data = parse_qs(mock_akismet.calls[0].request.body) assert data['comment_author'] == ['test-author'] - assert data['comment_author_email'] == ['test@test.com'] + assert data['comment_author_email'] == [user.username] assert data['blog'] == [settings.DOMAIN] user.refresh_from_db() diff --git a/osf_tests/external/oopspam/test_oopspam.py b/osf_tests/external/oopspam/test_oopspam.py index b4300875a76..79b6bfe179e 100644 --- a/osf_tests/external/oopspam/test_oopspam.py +++ b/osf_tests/external/oopspam/test_oopspam.py @@ -98,7 +98,7 @@ def test_do_spam_check_true(self, mock_oopspam, user, request_headers): user.do_check_spam( author='test-author', - author_email='test@test.com', + author_email=user.username, content='test', request_headers=request_headers ) @@ -119,7 +119,7 @@ def test_do_spam_check_false(self, mock_oopspam, user, request_headers): user.do_check_spam( author='test-author', - author_email='test@test.com', + author_email=user.username, content='test', request_headers=request_headers ) diff --git a/osf_tests/test_node.py b/osf_tests/test_node.py index 6b52539c491..e6c9424b51d 100644 --- a/osf_tests/test_node.py +++ b/osf_tests/test_node.py @@ -2414,6 +2414,18 @@ def user(self): def project(self, user): return ProjectFactory(creator=user) + @pytest.fixture() + def project2(self, user): + return ProjectFactory(creator=user) + + @pytest.fixture() + def project3(self, user): + return ProjectFactory(creator=user) + + @pytest.fixture() + def preprint(self, user): + return PreprintFactory(creator=user) + @pytest.fixture() def request_headers(self): return { @@ -2422,6 +2434,109 @@ def request_headers(self): 'Referer': 'https://osf.io' } + def run_akismet_and_oops_tests( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers, + spam_object, akismet_spam_data, oops_spam_data, objects_to_be_spammed=None): + """ + This method makes the next checks when akismet and oopsystem are used: + 1. A resource and its creator become FLAGGED and other public nodes/preprints of this creator become SPAMMED and contain the same spam data + 2. Private nodes/preprints don't contain spam data + 3. If akismet confirms spam, all objects from #1 have spam_pro_tip + 4. If oopspam confirms spam, all objects from #1 have oopspam_data key in spam_data + 5. who_flagged property in spam_data contains either service name (akismet or oopspam) or 'both' value + 6. spam_data of objects from #1 contains headers, request user info and spammy content + + Params: + spam_object - object that is being checked for spam + akismet_spam_data - spam data returned by akismet + oops_spam_data - spam data returned by oopsystem + objects_to_be_spammed - objects to be spammed instead of flagged. Example: + spam_object = Node + spam objects is flagged, its creator is flagged and the others user's public nodes/preprints must be spammed + """ + project.set_privacy('public') + project2.set_privacy('public') + mock_check_domains.return_value = [] + + author = user.fullname + author_email = user.username + content = 'Check me for spam with akismet and oops' + objects_to_be_spammed = objects_to_be_spammed or [] + + # configurable part + spam_object = spam_object + akismet_spam_data = akismet_spam_data + oops_spam_data = oops_spam_data + + if akismet_spam_data and oops_spam_data: + expected_who_flagged = 'both' + elif akismet_spam_data: + expected_who_flagged = 'akismet' + elif oops_spam_data: + expected_who_flagged = 'oopspam' + else: + expected_who_flagged = None + + if akismet_spam_data or oops_spam_data: + expected_spam_data = { + 'headers': request_headers, + 'author': author, + 'author_email': author_email, + 'content': content, + 'who_flagged': expected_who_flagged + } + if oops_spam_data: + expected_spam_data['oopspam_data'] = oops_spam_data + else: + expected_spam_data = {} + + with mock.patch('osf.external.spam.tasks.AkismetClient.check_content') as mock_akismet_check_content: + with mock.patch('osf.external.spam.tasks.OOPSpamClient.check_content') as mock_oops_check_content: + mock_akismet_check_content.return_value = (bool(akismet_spam_data), akismet_spam_data) + mock_oops_check_content.return_value = (bool(oops_spam_data), oops_spam_data) + with capture_notifications(allow_none=True): + spam_tasks.check_resource_for_spam_postcommit( + guid=spam_object._id, + content=content, + author=author, + author_email=author_email, + request_headers=request_headers + ) + user.reload() + project.reload() + project2.reload() + preprint.reload() + + for obj in [user, project, project2, preprint]: + if akismet_spam_data or oops_spam_data: + if obj in objects_to_be_spammed: + assert obj.spam_status == SpamStatus.SPAM + else: + assert obj.spam_status == SpamStatus.FLAGGED + + assert obj.spam_data == expected_spam_data + else: + assert obj.spam_status is None + assert obj.spam_data == {} + assert obj.spam_pro_tip is None + + if mock_akismet_check_content.return_value[0] and mock_oops_check_content.return_value[0]: + assert obj.spam_pro_tip == akismet_spam_data + assert obj.spam_data.get('oopspam_data', {}) == oops_spam_data + elif mock_akismet_check_content.return_value[0]: + assert obj.spam_pro_tip == akismet_spam_data + assert 'oopspam_data' not in obj.spam_data + elif mock_oops_check_content.return_value[0]: + assert obj.spam_data.get('oopspam_data', {}) == oops_spam_data + assert obj.spam_pro_tip is None + + # private node shouldn't be spammed + assert project3.spam_status is None + assert project3.spam_pro_tip is None + assert project3.spam_data == {} + + assert user.spam_data == project.spam_data == project2.spam_data == preprint.spam_data + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) @mock.patch('osf.external.spam.tasks._check_resource_for_domains') def test_check_resource_for_spam_postcommit_with_spammy_domains(self, mock_check_domains, project, user): @@ -2489,7 +2604,850 @@ def test_check_resource_for_spam_postcommit_checks_user(self, mock_check_domains author_email=user.username, request_headers=request_headers ) - mock_check_user.assert_called_once_with(user) + mock_check_user.assert_called_once_with(user, domains=[]) + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_ham_user_is_not_spammed_because_of_spammy_domains(self, mock_check_domains, user, project, preprint): + user.date_confirmed = timezone.now() + user.save() + + user.spam_status = SpamStatus.HAM + user.save() + + mock_check_domains.return_value = ['spam_domain.com'] + + project.set_privacy('public') + + spam_tasks.check_resource_for_spam_postcommit( + guid=user._id, + content='Check me for spam at spam_domain.com', + author=user.fullname, + author_email=user.username, + request_headers={} + ) + user.reload() + project.reload() + preprint.reload() + + assert user.spam_status == SpamStatus.HAM + assert user.spam_data == {} + + assert preprint.spam_status == SpamStatus.UNKNOWN + assert preprint.spam_data == {} + + assert project.spam_status == SpamStatus.UNKNOWN + assert project.spam_data == {} + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_ham_creator_is_not_spammed_because_of_spammy_domains_in_node(self, mock_check_domains, user, project, preprint): + user.date_confirmed = timezone.now() + user.save() + + user.spam_status = SpamStatus.HAM + user.save() + + mock_check_domains.return_value = ['spam_domain.com'] + + project.set_privacy('public') + + spam_tasks.check_resource_for_spam_postcommit( + guid=project._id, + content='Check me for spam at spam_domain.com', + author=user.fullname, + author_email=user.username, + request_headers={} + ) + user.reload() + project.reload() + preprint.reload() + + assert user.spam_status == SpamStatus.HAM + assert user.spam_data == {} + + assert preprint.spam_status == SpamStatus.UNKNOWN + assert preprint.spam_data == {} + + assert project.spam_status == SpamStatus.SPAM + assert project.spam_data['domains'] == ['spam_domain.com'] + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_ham_creator_is_not_spammed_because_of_spammy_domains_in_preprint(self, mock_check_domains, user, project, preprint): + user.date_confirmed = timezone.now() + user.save() + + user.spam_status = SpamStatus.HAM + user.save() + + mock_check_domains.return_value = ['spam_domain.com'] + + project.set_privacy('public') + + spam_tasks.check_resource_for_spam_postcommit( + guid=preprint._id, + content='Check me for spam at spam_domain.com', + author=user.fullname, + author_email=user.username, + request_headers={} + ) + user.reload() + project.reload() + preprint.reload() + + assert user.spam_status == SpamStatus.HAM + assert user.spam_data == {} + + assert preprint.spam_status == SpamStatus.SPAM + assert preprint.spam_data['domains'] == ['spam_domain.com'] + + assert project.spam_status == SpamStatus.UNKNOWN + assert project.spam_data == {} + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_spammed_user_shares_spam_data_with_nodes_and_preprints(self, mock_check_domains, user, project, preprint): + user.date_confirmed = timezone.now() + user.save() + + mock_check_domains.return_value = ['spam_domain.com'] + + project.set_privacy('public') + + spam_tasks.check_resource_for_spam_postcommit( + guid=user._id, + content='Check me for spam at spam_domain.com', + author=user.fullname, + author_email=user.username, + request_headers={} + ) + user.reload() + project.reload() + preprint.reload() + + assert user.spam_status == SpamStatus.SPAM + assert user.spam_data['domains'] == ['spam_domain.com'] + + assert preprint.spam_status == SpamStatus.SPAM + assert preprint.spam_data['domains'] == ['spam_domain.com'] + + assert project.spam_status == SpamStatus.SPAM + assert project.spam_data['domains'] == ['spam_domain.com'] + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_spammed_project_shares_spam_data_with_creator_and_other_nodes_and_preprints(self, mock_check_domains, user, project, preprint): + user.date_confirmed = timezone.now() + user.save() + + project2 = ProjectFactory(creator=user) + project2.set_privacy('public') + + mock_check_domains.return_value = ['again_spam.com'] + + with capture_notifications(): + spam_tasks.check_resource_for_spam_postcommit( + guid=project._id, + content='Check me for spam at again_spam.com', + author=user.fullname, + author_email=user.username, + request_headers={} + ) + user.reload() + project.reload() + project2.reload() + preprint.reload() + + assert project.spam_status == SpamStatus.SPAM + assert project.spam_data['domains'] == ['again_spam.com'] + + assert project2.spam_status == SpamStatus.SPAM + assert project2.spam_data['domains'] == ['again_spam.com'] + + assert preprint.spam_status == SpamStatus.SPAM + assert preprint.spam_data['domains'] == ['again_spam.com'] + + assert user.spam_status == SpamStatus.SPAM + assert user.spam_data['domains'] == ['again_spam.com'] + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_spammed_preprint_shares_spam_data_with_creator_and_other_nodes_and_preprints(self, mock_check_domains, user, project, preprint): + user.date_confirmed = timezone.now() + user.save() + + project2 = ProjectFactory(creator=user) + project2.set_privacy('public') + + preprint2 = PreprintFactory(creator=user) + + mock_check_domains.return_value = ['again_spam.com'] + + with capture_notifications(): + spam_tasks.check_resource_for_spam_postcommit( + guid=preprint._id, + content='Check me for spam at again_spam.com', + author=user.fullname, + author_email=user.username, + request_headers={} + ) + user.reload() + project.reload() + project2.reload() + preprint.reload() + preprint2.reload() + + # project is private + assert project.spam_status != SpamStatus.SPAM + assert 'domains' not in project.spam_data + + assert project2.spam_status == SpamStatus.SPAM + assert project2.spam_data['domains'] == ['again_spam.com'] + + assert preprint.spam_status == SpamStatus.SPAM + assert preprint.spam_data['domains'] == ['again_spam.com'] + + assert preprint2.spam_status == SpamStatus.SPAM + assert preprint2.spam_data['domains'] == ['again_spam.com'] + + assert user.spam_status == SpamStatus.SPAM + assert user.spam_data['domains'] == ['again_spam.com'] + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_ham_user_is_not_spammed_when_akismet_detected_spam( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + user.spam_status = SpamStatus.HAM + user.save() + + mock_check_domains.return_value = [] + + project.set_privacy('public') + project2.set_privacy('public') + + with mock.patch('osf.external.spam.tasks.AkismetClient.check_content') as mock_akismet_check_content: + with mock.patch('osf.external.spam.tasks.OOPSpamClient.check_content') as mock_oops_check_content: + mock_akismet_check_content.return_value = (True, 'spam_data') + mock_oops_check_content.return_value = (False, {}) + spam_tasks.check_resource_for_spam_postcommit( + guid=user._id, + content='Check me for spam at again_spam.com', + author=user.fullname, + author_email=user.username, + request_headers={} + ) + user.reload() + project.reload() + project2.reload() + preprint.reload() + + assert user.spam_status == SpamStatus.HAM + assert user.spam_data == {} + + assert preprint.spam_status == SpamStatus.UNKNOWN + assert preprint.spam_pro_tip is None + assert preprint.spam_data == {} + + assert project.spam_status == SpamStatus.UNKNOWN + assert project.spam_pro_tip is None + assert project.spam_data == {} + + assert project2.spam_status == SpamStatus.UNKNOWN + assert project2.spam_pro_tip is None + assert project2.spam_data == {} + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_ham_user_is_not_spammed_when_akismet_detected_spam_in_node( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + user.spam_status = SpamStatus.HAM + user.save() + + mock_check_domains.return_value = [] + + project.set_privacy('public') + project2.set_privacy('public') + + with mock.patch('osf.external.spam.tasks.AkismetClient.check_content') as mock_akismet_check_content: + with mock.patch('osf.external.spam.tasks.OOPSpamClient.check_content') as mock_oops_check_content: + mock_akismet_check_content.return_value = (True, 'spam_data') + mock_oops_check_content.return_value = (False, {}) + spam_tasks.check_resource_for_spam_postcommit( + guid=project._id, + content='Check me for spam at again_spam.com', + author=user.fullname, + author_email=user.username, + request_headers={} + ) + user.reload() + project.reload() + project2.reload() + preprint.reload() + + assert user.spam_status == SpamStatus.HAM + assert user.spam_pro_tip is None + assert user.spam_data == {} + + assert preprint.spam_status == SpamStatus.FLAGGED + assert preprint.spam_pro_tip == 'spam_data' + + assert project.spam_status == SpamStatus.FLAGGED + assert project.spam_pro_tip == 'spam_data' + + assert project2.spam_status == SpamStatus.FLAGGED + assert project2.spam_pro_tip == 'spam_data' + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_ham_user_is_not_spammed_when_akismet_detected_spam_in_preprint( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + user.spam_status = SpamStatus.HAM + user.save() + + mock_check_domains.return_value = [] + + project.set_privacy('public') + project2.set_privacy('public') + + with mock.patch('osf.external.spam.tasks.AkismetClient.check_content') as mock_akismet_check_content: + with mock.patch('osf.external.spam.tasks.OOPSpamClient.check_content') as mock_oops_check_content: + mock_akismet_check_content.return_value = (True, 'spam_data') + mock_oops_check_content.return_value = (False, {}) + spam_tasks.check_resource_for_spam_postcommit( + guid=preprint._id, + content='Check me for spam at again_spam.com', + author=user.fullname, + author_email=user.username, + request_headers={} + ) + user.reload() + project.reload() + project2.reload() + preprint.reload() + + assert user.spam_status == SpamStatus.HAM + assert user.spam_pro_tip is None + assert user.spam_data == {} + + assert preprint.spam_status == SpamStatus.FLAGGED + assert preprint.spam_pro_tip == 'spam_data' + + assert project.spam_status == SpamStatus.FLAGGED + assert project.spam_pro_tip == 'spam_data' + + assert project2.spam_status == SpamStatus.FLAGGED + assert project2.spam_pro_tip == 'spam_data' + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_ham_user_is_not_spammed_when_oops_detected_spam( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + user.spam_status = SpamStatus.HAM + user.save() + + mock_check_domains.return_value = [] + + project.set_privacy('public') + project2.set_privacy('public') + + with mock.patch('osf.external.spam.tasks.AkismetClient.check_content') as mock_akismet_check_content: + with mock.patch('osf.external.spam.tasks.OOPSpamClient.check_content') as mock_oops_check_content: + mock_akismet_check_content.return_value = (False, '') + mock_oops_check_content.return_value = (True, {'reason': 'spam'}) + spam_tasks.check_resource_for_spam_postcommit( + guid=user._id, + content='Check me for spam at again_spam.com', + author=user.fullname, + author_email=user.username, + request_headers={} + ) + user.reload() + project.reload() + project2.reload() + preprint.reload() + + assert user.spam_status == SpamStatus.HAM + assert user.spam_data == {} + + assert preprint.spam_status == SpamStatus.UNKNOWN + assert preprint.spam_data == {} + + assert project.spam_status == SpamStatus.UNKNOWN + assert project.spam_data == {} + + assert project2.spam_status == SpamStatus.UNKNOWN + assert project2.spam_data == {} + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_ham_user_is_not_spammed_when_oops_detected_spam_in_node( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + user.spam_status = SpamStatus.HAM + user.save() + + mock_check_domains.return_value = [] + + project.set_privacy('public') + project2.set_privacy('public') + + with mock.patch('osf.external.spam.tasks.AkismetClient.check_content') as mock_akismet_check_content: + with mock.patch('osf.external.spam.tasks.OOPSpamClient.check_content') as mock_oops_check_content: + mock_akismet_check_content.return_value = (False, '') + mock_oops_check_content.return_value = (True, {'reason': 'spam'}) + spam_tasks.check_resource_for_spam_postcommit( + guid=project._id, + content='Check me for spam at again_spam.com', + author=user.fullname, + author_email=user.username, + request_headers={} + ) + user.reload() + project.reload() + project2.reload() + preprint.reload() + + assert user.spam_status == SpamStatus.HAM + assert user.spam_data == {} + + assert preprint.spam_status == SpamStatus.FLAGGED + assert preprint.spam_data['oopspam_data'] == {'reason': 'spam'} + + assert project.spam_status == SpamStatus.FLAGGED + assert project.spam_data['oopspam_data'] == {'reason': 'spam'} + + assert project2.spam_status == SpamStatus.FLAGGED + assert project2.spam_data['oopspam_data'] == {'reason': 'spam'} + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_ham_user_is_not_spammed_when_oops_detected_spam_in_preprint( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + user.spam_status = SpamStatus.HAM + user.save() + + mock_check_domains.return_value = [] + + project.set_privacy('public') + project2.set_privacy('public') + + with mock.patch('osf.external.spam.tasks.AkismetClient.check_content') as mock_akismet_check_content: + with mock.patch('osf.external.spam.tasks.OOPSpamClient.check_content') as mock_oops_check_content: + mock_akismet_check_content.return_value = (False, '') + mock_oops_check_content.return_value = (True, {'reason': 'spam'}) + spam_tasks.check_resource_for_spam_postcommit( + guid=preprint._id, + content='Check me for spam at again_spam.com', + author=user.fullname, + author_email=user.username, + request_headers={} + ) + user.reload() + project.reload() + project2.reload() + preprint.reload() + + assert user.spam_status == SpamStatus.HAM + assert user.spam_data == {} + + assert preprint.spam_status == SpamStatus.FLAGGED + assert preprint.spam_data['oopspam_data'] == {'reason': 'spam'} + + assert project.spam_status == SpamStatus.FLAGGED + assert project.spam_data['oopspam_data'] == {'reason': 'spam'} + + assert project2.spam_status == SpamStatus.FLAGGED + assert project2.spam_data['oopspam_data'] == {'reason': 'spam'} + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_ham_user_is_not_spammed_when_akismet_and_oops_detected_spam( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + user.spam_status = SpamStatus.HAM + user.save() + + mock_check_domains.return_value = [] + + project.set_privacy('public') + project2.set_privacy('public') + + with mock.patch('osf.external.spam.tasks.AkismetClient.check_content') as mock_akismet_check_content: + with mock.patch('osf.external.spam.tasks.OOPSpamClient.check_content') as mock_oops_check_content: + mock_akismet_check_content.return_value = (True, 'akismet spam data') + mock_oops_check_content.return_value = (True, {'reason': 'spam'}) + spam_tasks.check_resource_for_spam_postcommit( + guid=user._id, + content='Check me for spam at again_spam.com', + author=user.fullname, + author_email=user.username, + request_headers={} + ) + user.reload() + project.reload() + project2.reload() + preprint.reload() + + assert user.spam_status == SpamStatus.HAM + assert user.spam_pro_tip is None + assert user.spam_data == {} + + assert preprint.spam_status == SpamStatus.UNKNOWN + assert preprint.spam_pro_tip is None + assert preprint.spam_data == {} + + assert project.spam_status == SpamStatus.UNKNOWN + assert project.spam_pro_tip is None + assert project.spam_data == {} + + assert project2.spam_status == SpamStatus.UNKNOWN + assert project2.spam_pro_tip is None + assert project2.spam_data == {} + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_ham_user_is_not_spammed_when_akismet_and_oops_detected_spam_in_node( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + user.spam_status = SpamStatus.HAM + user.save() + + mock_check_domains.return_value = [] + + project.set_privacy('public') + project2.set_privacy('public') + + with mock.patch('osf.external.spam.tasks.AkismetClient.check_content') as mock_akismet_check_content: + with mock.patch('osf.external.spam.tasks.OOPSpamClient.check_content') as mock_oops_check_content: + mock_akismet_check_content.return_value = (True, 'akismet spam data') + mock_oops_check_content.return_value = (True, {'reason': 'spam'}) + spam_tasks.check_resource_for_spam_postcommit( + guid=project._id, + content='Check me for spam at again_spam.com', + author=user.fullname, + author_email=user.username, + request_headers={} + ) + user.reload() + project.reload() + project2.reload() + preprint.reload() + + assert user.spam_status == SpamStatus.HAM + assert user.spam_pro_tip is None + assert user.spam_data == {} + + assert preprint.spam_status == SpamStatus.FLAGGED + assert preprint.spam_pro_tip == 'akismet spam data' + assert preprint.spam_data['oopspam_data'] == {'reason': 'spam'} + + assert project.spam_status == SpamStatus.FLAGGED + assert project.spam_pro_tip == 'akismet spam data' + assert project.spam_data['oopspam_data'] == {'reason': 'spam'} + + assert project2.spam_status == SpamStatus.FLAGGED + assert project2.spam_pro_tip == 'akismet spam data' + assert project2.spam_data['oopspam_data'] == {'reason': 'spam'} + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_ham_user_is_not_spammed_when_akismet_and_oops_detected_spam_in_preprint( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + user.spam_status = SpamStatus.HAM + user.save() + + mock_check_domains.return_value = [] + + project.set_privacy('public') + project2.set_privacy('public') + + with mock.patch('osf.external.spam.tasks.AkismetClient.check_content') as mock_akismet_check_content: + with mock.patch('osf.external.spam.tasks.OOPSpamClient.check_content') as mock_oops_check_content: + mock_akismet_check_content.return_value = (True, 'akismet spam data') + mock_oops_check_content.return_value = (True, {'reason': 'spam'}) + spam_tasks.check_resource_for_spam_postcommit( + guid=preprint._id, + content='Check me for spam at again_spam.com', + author=user.fullname, + author_email=user.username, + request_headers={} + ) + user.reload() + project.reload() + project2.reload() + preprint.reload() + + assert user.spam_status == SpamStatus.HAM + assert user.spam_pro_tip is None + assert user.spam_data == {} + + assert preprint.spam_status == SpamStatus.FLAGGED + assert preprint.spam_pro_tip == 'akismet spam data' + assert preprint.spam_data['oopspam_data'] == {'reason': 'spam'} + + assert project.spam_status == SpamStatus.FLAGGED + assert project.spam_pro_tip == 'akismet spam data' + assert project.spam_data['oopspam_data'] == {'reason': 'spam'} + + assert project2.spam_status == SpamStatus.FLAGGED + assert project2.spam_pro_tip == 'akismet spam data' + assert project2.spam_data['oopspam_data'] == {'reason': 'spam'} + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_no_spam_found_by_akismet_and_oopspam_for_user( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + spam_object = user + akismet_spam_data = '' + oops_spam_data = {} + self.run_akismet_and_oops_tests( + mock_check_domains, user, project, project2, project3, preprint, request_headers, + spam_object, akismet_spam_data, oops_spam_data + ) + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_no_spam_found_by_akismet_and_oopspam_for_node( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + spam_object = project + akismet_spam_data = '' + oops_spam_data = {} + self.run_akismet_and_oops_tests( + mock_check_domains, user, project, project2, project3, preprint, request_headers, + spam_object, akismet_spam_data, oops_spam_data + ) + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_no_spam_found_by_akismet_and_oopspam_for_preprint( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + spam_object = preprint + akismet_spam_data = '' + oops_spam_data = {} + self.run_akismet_and_oops_tests( + mock_check_domains, user, project, project2, project3, preprint, request_headers, + spam_object, akismet_spam_data, oops_spam_data + ) + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_akismet_spammed_user_shares_spam_data_with_nodes_and_preprints( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + spam_object = user + akismet_spam_data = 'It is a spammy content, spam it!' + oops_spam_data = {} + self.run_akismet_and_oops_tests( + mock_check_domains, user, project, project2, project3, preprint, request_headers, + spam_object, akismet_spam_data, oops_spam_data + ) + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_oops_spammed_user_shares_spam_data_with_nodes_and_preprints( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + spam_object = user + akismet_spam_data = '' + oops_spam_data = {'reason': 'spam'} + self.run_akismet_and_oops_tests( + mock_check_domains, user, project, project2, project3, preprint, request_headers, + spam_object, akismet_spam_data, oops_spam_data + ) + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_akismet_and_oops_spammed_user_shares_spam_data_with_nodes_and_preprints( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + spam_object = user + akismet_spam_data = 'some spam found' + oops_spam_data = {'reason': 'spam'} + self.run_akismet_and_oops_tests( + mock_check_domains, user, project, project2, project3, preprint, request_headers, + spam_object, akismet_spam_data, oops_spam_data + ) + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_akismet_spammed_node_shares_spam_data_with_creator_and_other_nodes_and_preprints( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + user.date_confirmed = timezone.now() + user.save() + + spam_object = project + akismet_spam_data = 'some spam found' + oops_spam_data = {} + objects_to_be_spammed = [user, project2, preprint] + self.run_akismet_and_oops_tests( + mock_check_domains, user, project, project2, project3, preprint, request_headers, + spam_object, akismet_spam_data, oops_spam_data, objects_to_be_spammed + ) + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_oops_spammed_node_shares_spam_data_with_creator_and_other_nodes_and_preprints( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + user.date_confirmed = timezone.now() + user.save() + + spam_object = project + akismet_spam_data = '' + oops_spam_data = {'reason': 'some spam info'} + objects_to_be_spammed = [user, project2, preprint] + self.run_akismet_and_oops_tests( + mock_check_domains, user, project, project2, project3, preprint, request_headers, + spam_object, akismet_spam_data, oops_spam_data, objects_to_be_spammed + ) + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_akismet_and_oops_spammed_node_shares_spam_data_with_creator_and_other_nodes_and_preprints( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + user.date_confirmed = timezone.now() + user.save() + + spam_object = project + akismet_spam_data = 'it is a real spam!!!' + oops_spam_data = {'reason': 'some spam info'} + objects_to_be_spammed = [user, project2, preprint] + self.run_akismet_and_oops_tests( + mock_check_domains, user, project, project2, project3, preprint, request_headers, + spam_object, akismet_spam_data, oops_spam_data, objects_to_be_spammed + ) + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_akismet_spammed_preprint_shares_spam_data_with_creator_and_other_nodes_and_preprints( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + user.date_confirmed = timezone.now() + user.save() + + spam_object = preprint + akismet_spam_data = 'some spam found' + oops_spam_data = {} + objects_to_be_spammed = [user, project2, project] + self.run_akismet_and_oops_tests( + mock_check_domains, user, project, project2, project3, preprint, request_headers, + spam_object, akismet_spam_data, oops_spam_data, objects_to_be_spammed + ) + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_oops_spammed_preprint_shares_spam_data_with_creator_and_other_nodes_and_preprints( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + user.date_confirmed = timezone.now() + user.save() + + spam_object = preprint + akismet_spam_data = '' + oops_spam_data = {'reason': 'some spam info'} + objects_to_be_spammed = [user, project2, project] + self.run_akismet_and_oops_tests( + mock_check_domains, user, project, project2, project3, preprint, request_headers, + spam_object, akismet_spam_data, oops_spam_data, objects_to_be_spammed + ) + + @mock.patch.object(settings, 'SPAM_ACCOUNT_SUSPENSION_ENABLED', True) + @mock.patch.object(settings, 'SPAM_SERVICES_ENABLED', True) + @mock.patch.object(settings, 'AKISMET_ENABLED', True) + @mock.patch.object(settings, 'OOPSPAM_ENABLED', True) + @mock.patch('osf.external.spam.tasks._check_resource_for_domains') + def test_akismet_and_oops_spammed_preprint_shares_spam_data_with_creator_and_other_nodes_and_preprints( + self, mock_check_domains, user, project, project2, project3, preprint, request_headers + ): + user.date_confirmed = timezone.now() + user.save() + + spam_object = preprint + akismet_spam_data = 'it is a real spam!!!' + oops_spam_data = {'reason': 'some spam info'} + objects_to_be_spammed = [user, project2, project] + self.run_akismet_and_oops_tests( + mock_check_domains, user, project, project2, project3, preprint, request_headers, + spam_object, akismet_spam_data, oops_spam_data, objects_to_be_spammed + ) # copied from tests/test_models.py diff --git a/scripts/find_spammy_content.py b/scripts/find_spammy_content.py index 2e05328b7d6..eec8c5a3b11 100644 --- a/scripts/find_spammy_content.py +++ b/scripts/find_spammy_content.py @@ -70,7 +70,7 @@ def find_spammy_content(regex, days, model, ban): item_data['fullname'] = item.creator.fullname data.append(item_data) if ban: - item.suspend_spam_user(item.creator) + item.suspend_spam_user(item.creator, self_spam=True) return data def find_spammy_content_fast(regex, days, model, ban): @@ -92,5 +92,5 @@ def find_spammy_content_fast(regex, days, model, ban): item_data['fullname'] = item['creator__fullname'] data.append(item_data) if ban: - model.load(item['guids___id']).suspend_spam_user(item['creator__guids___id']) + model.load(item['guids___id']).suspend_spam_user(item['creator__guids___id'], self_spam=True) return data diff --git a/scripts/tests/test_find_spammy_content.py b/scripts/tests/test_find_spammy_content.py index 78056f9cc6b..126161334a0 100644 --- a/scripts/tests/test_find_spammy_content.py +++ b/scripts/tests/test_find_spammy_content.py @@ -32,7 +32,7 @@ def user_two(self): @pytest.fixture def kombat_node(self, user): - return NodeFactory(title='Mortal Kombat Spam', creator=user) + return NodeFactory(title='Mortal Kombat Spam', creator=user, is_public=True) @pytest.fixture def node_two(self, user_two): @@ -47,7 +47,7 @@ def spam_node_but_old(self, user_two): @pytest.fixture def kombat_registration(self, user): - return RegistrationFactory(title='Mortal Kombat Spam', creator=user) + return RegistrationFactory(title='Mortal Kombat Spam', creator=user, is_public=True) @pytest.fixture def registration_two(self, user_two): @@ -55,7 +55,7 @@ def registration_two(self, user_two): @pytest.fixture def kombat_preprint(self, user): - return PreprintFactory(title='Mortal Kombat Spam', creator=user) + return PreprintFactory(title='Mortal Kombat Spam', creator=user, is_public=True) @pytest.fixture def preprint_two(self, user_two): From a9ab9d38665c57df146dd11f299be714af1f5f81 Mon Sep 17 00:00:00 2001 From: mkovalua Date: Mon, 9 Mar 2026 16:56:05 +0200 Subject: [PATCH 23/31] [ENG-10405] change /myprojects to /my-projects to work good with angular (#11624) --- framework/auth/views.py | 10 +++++----- osf/management/commands/metrics_backfill_pageviews.py | 6 +++--- tests/test_auth.py | 2 +- tests/test_project_contributor_views.py | 2 +- tests/test_webtests.py | 10 +++++----- website/routes.py | 2 +- website/static/js/myProjects.js | 6 +++--- .../templates/collection_submission_cancel.html.mako | 4 ++-- .../collection_submission_removed_private.html.mako | 4 ++-- website/views.py | 4 ++-- 10 files changed, 25 insertions(+), 25 deletions(-) diff --git a/framework/auth/views.py b/framework/auth/views.py index c8a41b795f6..3b5a4f20dea 100644 --- a/framework/auth/views.py +++ b/framework/auth/views.py @@ -83,7 +83,7 @@ def _reset_password_get(auth, uid=None, token=None, institutional=False): } raise HTTPError(http_status.HTTP_400_BAD_REQUEST, data=error_data) - # override routes.py login_url to redirect to myprojects + # override routes.py login_url to redirect to my-projects service_url = web_url_for('my_projects', _absolute=True) return { @@ -174,7 +174,7 @@ def forgot_password_get(auth): if auth.logged_in: return auth_logout(redirect_url=request.url) - #overriding the routes.py sign in url to redirect to the myprojects after login + #overriding the routes.py sign in url to redirect to the my-projects after login context = {} context['login_url'] = web_url_for('my_projects', _absolute=True) @@ -410,7 +410,7 @@ def auth_login(auth): if campaign and logged out, go to campaign register page (with next_url if presents) if next_url and logged in, go to next url if next_url and logged out, go to cas login page with current request url as service parameter - if none, go to `/myprojects` which is decorated by `@must_be_logged_in` + if none, go to `/my-projects` which is decorated by `@must_be_logged_in` :param auth: the auth context :return: redirects @@ -437,7 +437,7 @@ def auth_register(auth): if next_url and logged in, go to next url if next_url and logged out, go to cas login page with current request url as service parameter if next_url and logout flag, log user out first and then go to the next_url - if none, go to `/myprojects` which is decorated by `@must_be_logged_in` + if none, go to `/my-projects` which is decorated by `@must_be_logged_in` :param auth: the auth context :return: land, redirect or `auth_logout` @@ -999,7 +999,7 @@ def resend_confirmation_post(auth): try: send_confirm_email(user, clean_email, renew=True) except KeyError: - # already confirmed, redirect to myprojects + # already confirmed, redirect to my-projects status_message = f'This email {clean_email} has already been confirmed.' kind = 'warning' user.email_last_sent = timezone.now() diff --git a/osf/management/commands/metrics_backfill_pageviews.py b/osf/management/commands/metrics_backfill_pageviews.py index 4a3cc729d0d..13898037923 100644 --- a/osf/management/commands/metrics_backfill_pageviews.py +++ b/osf/management/commands/metrics_backfill_pageviews.py @@ -27,12 +27,12 @@ def main(source, dry_run=False, resume_from=None): # page.info.protocol + page.info.domain => _source.platform_iri # "http://localhost:5000/", # visitor.session => _source.session_id # "fcae918a3b6a19641bd0087f84083f0d57982d8c93ab821c405561d1b5c7b305", # user.id => _source.user_is_authenticated # true, - # page.url => _source.pageview_info.page_url # "http://localhost:5000/myprojects/", + # page.url => _source.pageview_info.page_url # "http://localhost:5000/my-projects/", # page.title => _source.pageview_info.page_title # "OSF | My Projects", # referrer.url => _source.pageview_info.referer_url # "http://localhost:5000/csab4/analytics", # page.meta.routeName => _source.pageview_info.route_name # "OsfWebRenderer.my_projects", # time.utc.hour_of_day => _source.pageview_info.hour_of_day # 4, - # page.info.path => _source.pageview_info.page_path # "/myprojects", + # page.info.path => _source.pageview_info.page_path # "/my-projects", # referrer.info.domain => _source.pageview_info.referer_domain # "localhost:5000" # page.meta.public => _source.item_public # true, # node.id => _source.item_guid # "ry7dn", @@ -85,7 +85,7 @@ def populate_action_labels(something_wonderful, row): if row['page.info.path']: path_parts = row['page.info.path'].split('/') - if len(path_parts) == 1 and path_parts[0] not in ('myprojects', 'goodbye', 'login'): + if len(path_parts) == 1 and path_parts[0] not in ('my-projects', 'goodbye', 'login'): labels.append('view') elif path_parts[1] in ('wiki'): labels.append('view') diff --git a/tests/test_auth.py b/tests/test_auth.py index ad5fa602a22..63f0684699f 100644 --- a/tests/test_auth.py +++ b/tests/test_auth.py @@ -96,7 +96,7 @@ def test_confirm_email(self): res = self.app.resolve_redirect(res) assert res.status_code == 302 - assert '/myprojects/' == urlparse(res.location).path + assert '/my-projects/' == urlparse(res.location).path # assert len(get_session()['status']) == 1 def test_get_user_by_id(self): diff --git a/tests/test_project_contributor_views.py b/tests/test_project_contributor_views.py index 7fa97ca5aac..c03cf9365b3 100644 --- a/tests/test_project_contributor_views.py +++ b/tests/test_project_contributor_views.py @@ -453,7 +453,7 @@ def test_private_project_remove_self_not_admin(self): ) self.project.reload() assert res.status_code == 200 - assert res.json['redirectUrl'] == '/myprojects/' + assert res.json['redirectUrl'] == '/my-projects/' assert self.user2._id not in self.project.contributors def test_public_project_remove_self_not_admin(self): diff --git a/tests/test_webtests.py b/tests/test_webtests.py index 66f5995d208..cd840105fe7 100644 --- a/tests/test_webtests.py +++ b/tests/test_webtests.py @@ -79,7 +79,7 @@ def test_can_see_profile_url(self): res = self.app.get(self.user.url, follow_redirects=True) assert self.user.url in res.text - # `GET /login/` without parameters is redirected to `/myprojects/` page which has `@must_be_logged_in` decorator + # `GET /login/` without parameters is redirected to `/my-projects/` page which has `@must_be_logged_in` decorator # if user is not logged in, she/he is further redirected to CAS login page def test_is_redirected_to_cas_if_not_logged_in_at_login_page(self): res = self.app.resolve_redirect(self.app.get('/login/')) @@ -90,7 +90,7 @@ def test_is_redirected_to_cas_if_not_logged_in_at_login_page(self): def test_is_redirected_to_myprojects_if_already_logged_in_at_login_page(self): res = self.app.get('/login/', auth=self.user.auth) assert res.status_code == 302 - assert 'myprojects' in res.headers.get('Location') + assert 'my-projects' in res.headers.get('Location') def test_register_page(self): res = self.app.get('/register/') @@ -99,14 +99,14 @@ def test_register_page(self): def test_is_redirected_to_myprojects_if_already_logged_in_at_register_page(self): res = self.app.get('/register/', auth=self.user.auth) assert res.status_code == 302 - assert 'myprojects' in res.headers.get('Location') + assert 'my-projects' in res.headers.get('Location') def test_sees_projects_in_her_dashboard(self): # the user already has a project project = ProjectFactory(creator=self.user) project.add_contributor(self.user) project.save() - res = self.app.get('/myprojects/', auth=self.user.auth) + res = self.app.get('/my-projects/', auth=self.user.auth) assert 'Projects' in res.text # Projects heading def test_does_not_see_osffiles_in_user_addon_settings(self): @@ -124,7 +124,7 @@ def test_sees_osffiles_in_project_addon_settings(self): def test_sees_correct_title_on_dashboard(self): # User goes to dashboard - res = self.app.get('/myprojects/', auth=self.auth, follow_redirects=True) + res = self.app.get('/my-projects/', auth=self.auth, follow_redirects=True) title = res.html.title.string assert 'OSF | My Projects' == title diff --git a/website/routes.py b/website/routes.py index e5af9991281..df2984562bf 100644 --- a/website/routes.py +++ b/website/routes.py @@ -309,7 +309,7 @@ def make_url_map(app): notemplate ), Rule( - '/myprojects/', + '/my-projects/', 'get', website_views.my_projects, OsfWebRenderer('my_projects.mako', trust=False) diff --git a/website/static/js/myProjects.js b/website/static/js/myProjects.js index 830df968276..148f71d5865 100644 --- a/website/static/js/myProjects.js +++ b/website/static/js/myProjects.js @@ -574,7 +574,7 @@ var MyProjects = { */ self.setFilterHistory = function(index) { // if not on the myprojects version of this page, don't change state (e.g., institutions) - if (window.location.href.indexOf('/myprojects') === -1 ) { + if (window.location.href.indexOf('/my-projects') === -1 ) { return; } var filter; @@ -585,7 +585,7 @@ var MyProjects = { } // Uses replaceState instead of pushState because back buttons will not reset the filter on back without forcing a page refresh // A bug in history causes titles not to change despite setting them here. - window.history.replaceState({setFilter: index}, 'OSF | ' + filter.title, '/myprojects/' + filter.name); + window.history.replaceState({setFilter: index}, 'OSF | ' + filter.title, '/my-projects/' + filter.name); }; /** @@ -593,7 +593,7 @@ var MyProjects = { */ self.getFilterIndex = function() { // if not on the myprojects version of this page, don't change state (e.g., institutions) - if (window.location.href.indexOf('/myprojects') === -1 ) { + if (window.location.href.indexOf('/my-projects') === -1 ) { return 0; } // Cast to string undefined => "undefined" to handle upper/lower case anchors diff --git a/website/templates/collection_submission_cancel.html.mako b/website/templates/collection_submission_cancel.html.mako index 6ee11c1af7c..007d1846da9 100644 --- a/website/templates/collection_submission_cancel.html.mako +++ b/website/templates/collection_submission_cancel.html.mako @@ -10,7 +10,7 @@ % if collection_provider: ${collection_provider_name} % else: - ${collection_provider_name} + ${collection_provider_name} % endif was canceled. If you wish to be associated with the collection, you will need to request to be added again. @@ -20,7 +20,7 @@ % if collection_provider: ${collection_provider_name} % else: - ${collection_provider_name} + ${collection_provider_name} % endif If you wish to be associated with the collection, an admin will need to request addition again. % endif diff --git a/website/templates/collection_submission_removed_private.html.mako b/website/templates/collection_submission_removed_private.html.mako index 726de7f2077..6d97ce0fedb 100644 --- a/website/templates/collection_submission_removed_private.html.mako +++ b/website/templates/collection_submission_removed_private.html.mako @@ -11,7 +11,7 @@ % if collection_provider: ${collection_provider_name} % else: - ${collection_provider_name} + ${collection_provider_name} % endif . If you wish to be associated with the collection, you will need to request addition to the collection again. % else: @@ -20,7 +20,7 @@ % if collection_provider: ${collection_provider_name} % else: - ${collection_provider_name} + ${collection_provider_name} % endif It will need to be re-submitted to be included in the collection again. % endif diff --git a/website/views.py b/website/views.py index 2d8784618d3..db89d258959 100644 --- a/website/views.py +++ b/website/views.py @@ -165,11 +165,11 @@ def paginate(items, total, page, size): def index(): - return redirect('/myprojects/') + return redirect('/my-projects/') def dashboard(): - return redirect('/myprojects/') + return redirect('/my-projects/') def reproducibility(): From 595ce8520e304e78f9a9c822e996a97e5649cc91 Mon Sep 17 00:00:00 2001 From: antkryt Date: Wed, 11 Mar 2026 15:38:12 +0200 Subject: [PATCH 24/31] [ENG-10464] Critical issues in yarn.lock (#11627) * remove vulnarable packages and some web ui content * add missing changes * return project template * fix tests * remove unused packages --- addons/wiki/routes.py | 74 +- addons/wiki/static/wikiPage.js | 327 ---- addons/wiki/templates/edit.mako | 417 ----- addons/wiki/tests/test_wiki.py | 160 +- admin/webpack.admin.config.js | 12 +- package.json | 17 - tests/test_project_views.py | 2 +- tests/test_webtests.py | 31 - webpack.common.config.js | 5 +- website/routes.py | 11 - website/static/js/comment.js | 7 +- website/static/js/markdown.js | 119 -- .../static/js/pages/project-dashboard-page.js | 470 ----- website/static/js/pages/wiki-edit-page.js | 222 --- website/templates/project/project.mako | 2 +- yarn.lock | 1548 +---------------- 16 files changed, 80 insertions(+), 3344 deletions(-) delete mode 100644 addons/wiki/static/wikiPage.js delete mode 100644 addons/wiki/templates/edit.mako delete mode 100644 website/static/js/markdown.js delete mode 100644 website/static/js/pages/project-dashboard-page.js delete mode 100644 website/static/js/pages/wiki-edit-page.js diff --git a/addons/wiki/routes.py b/addons/wiki/routes.py index ed6b1b3a517..1a257d6a07a 100644 --- a/addons/wiki/routes.py +++ b/addons/wiki/routes.py @@ -3,88 +3,18 @@ """ from framework.routing import Rule, json_renderer -from website.routes import OsfWebRenderer from . import views -TEMPLATE_DIR = './addons/wiki/templates/' - settings_routes = { 'rules': [], 'prefix': '/api/v1', } # NOTE: refers to a wiki page's key, e.g. 'Home' +# All HTML-rendered wiki routes have been removed; only API routes remain. page_routes = { - - 'rules': [ - - # Home (Base) | GET - Rule( - [ - '/project//wiki/', - '/project//node//wiki/', - ], - 'get', - views.project_wiki_home, - OsfWebRenderer('edit.mako', trust=False, template_dir=TEMPLATE_DIR) - ), - - # View (ID) | GET - Rule( - [ - '/project//wiki/id//', - '/project//node//wiki/id//', - ], - 'get', - views.project_wiki_id_page, - OsfWebRenderer('edit.mako', trust=False, template_dir=TEMPLATE_DIR) - ), - - # Wiki | GET - Rule( - [ - '/project//wiki//', - '/project//node//wiki//', - ], - 'get', - views.project_wiki_view, - OsfWebRenderer('edit.mako', trust=False, template_dir=TEMPLATE_DIR) - ), - - # Edit | GET (legacy url, trigger redirect) - Rule( - [ - '/project//wiki//edit/', - '/project//node//wiki//edit/', - ], - 'get', - views.project_wiki_edit, - OsfWebRenderer('edit.mako', trust=False, template_dir=TEMPLATE_DIR) - ), - - # Compare | GET (legacy url, trigger redirect) - Rule( - [ - '/project//wiki//compare//', - '/project//node//wiki//compare//', - ], - 'get', - views.project_wiki_compare, - OsfWebRenderer('edit.mako', trust=False, template_dir=TEMPLATE_DIR) - ), - - # Edit | POST - Rule( - [ - '/project//wiki//', - '/project//node//wiki//', - ], - 'post', - views.project_wiki_edit_post, - OsfWebRenderer('edit.mako', trust=False, template_dir=TEMPLATE_DIR) - ), - ] + 'rules': [], } api_routes = { diff --git a/addons/wiki/static/wikiPage.js b/addons/wiki/static/wikiPage.js deleted file mode 100644 index 7ca035b9593..00000000000 --- a/addons/wiki/static/wikiPage.js +++ /dev/null @@ -1,327 +0,0 @@ -'use strict'; -var ko = require('knockout'); -var $ = require('jquery'); - -var $osf = require('js/osfHelpers'); -var mathrender = require('js/mathrender'); -var md = require('js/markdown').full; -var mdQuick = require('js/markdown').quick; -var mdOld = require('js/markdown').old; -var diffTool = require('js/diffTool'); - -var THROTTLE = 500; - -//
-ko.bindingHandlers.mathjaxify = { - update: function(element, valueAccessor, allBindingsAccessor, data, context) { - var vm = context.$data; - //Need to unwrap the data in order for KO to know it's changed. - ko.unwrap(valueAccessor()); - - if(vm.allowMathjaxification() && vm.allowFullRender()) { - mathrender.mathjaxify('#' + element.id); - } - } -}; - - -function ViewWidget(visible, version, viewText, rendered, contentURL, allowMathjaxification, allowFullRender, editor) { - var self = this; - self.version = version; - self.viewText = viewText; // comes from EditWidget.viewText - self.rendered = rendered; - self.visible = visible; - self.allowMathjaxification = allowMathjaxification; - self.editor = editor; - self.allowFullRender = allowFullRender; - self.renderTimeout = null; - self.displaySource = ko.observable(''); - self.debouncedAllowFullRender = $osf.debounce(function() { - self.allowFullRender(true); - }, THROTTLE); - - self.renderMarkdown = function(rawContent){ - if(self.visible()) { - if (self.allowFullRender()) { - return md.render(rawContent); - } else { - return mdQuick.render(rawContent); - } - } else { - return ''; - } - }; - - if (typeof self.editor !== 'undefined') { - self.editor.on('change', function () { - if(self.version() === 'preview') { - // Quick render - self.allowFullRender(false); - - // Full render - self.debouncedAllowFullRender(); - } - }); - } else { - self.allowFullRender(true); - } - - self.displayText = ko.computed(function() { - self.allowFullRender(); - var requestURL; - if (typeof self.version() !== 'undefined') { - if (self.version() === 'preview') { - self.rendered(self.renderMarkdown(self.viewText())); - self.displaySource(self.viewText()); - } else { - if (self.version() === 'current') { - requestURL = contentURL; - } else { - requestURL= contentURL + self.version(); - } - var request = $.ajax({ - url: requestURL - }); - - request.done(function (resp) { - if(self.visible()) { - var $markdownElement = $('#wikiViewRender'); - if (resp.wiki_content){ - var rawContent = resp.wiki_content - } else if(window.contextVars.currentUser.canEdit) { - var rawContent = '*Add important information, links, or images here to describe your project.*'; - } else { - var rawContent = '*No wiki content.*'; - } - if (resp.rendered_before_update) { - // Use old md renderer. Don't mathjaxify - self.allowMathjaxification(false); - self.rendered(mdOld.render(rawContent)); - $markdownElement.css('display', 'inherit'); - - } else { - // Render raw markdown - self.allowMathjaxification(true); - self.rendered(self.renderMarkdown(rawContent)); - $markdownElement.css('display', 'inherit'); - } - self.displaySource(rawContent); - } - }); - } - } else { - self.displaySource(''); - } - }); -} - - // currentText comes from ViewWidget.displayText -function CompareWidget(visible, compareVersion, currentText, rendered, contentURL) { - var self = this; - - self.compareVersion = compareVersion; - self.currentText = currentText; - self.rendered = rendered; - self.visible = visible; - self.contentURL = contentURL; - self.compareSource = ko.observable(''); - - self.compareText = ko.computed(function() { - var requestURL; - if (self.compareVersion() === 'current') { - requestURL = self.contentURL; - } else { - requestURL= self.contentURL + self.compareVersion(); - } - var request = $.ajax({ - url: requestURL - }); - request.done(function (resp) { - var rawText = resp.wiki_content; - self.compareSource(rawText); - }); - - }); - - self.compareOutput = ko.computed(function() { - var output = diffTool.diff(self.compareSource(), self.currentText()); - self.rendered(output); - return output; - }).extend({ notify: 'always' }); - -} - - -var defaultOptions = { - editVisible: false, - viewVisible: true, - compareVisible: false, - menuVisible: true, - canEdit: true, - viewVersion: 'current', - compareVersion: 'previous', - urls: { - content: '', - draft: '', - page: '' - }, - metadata: {} -}; - -function ViewModel(options){ - var self = this; - // enabled? - self.editVis = ko.observable(options.editVisible); - self.viewVis = ko.observable(options.viewVisible); - self.compareVis = ko.observable(options.compareVisible); - self.menuVis = ko.observable(options.menuVisible); - // singleVis : checks if the item visible is the only visible column - self.singleVis = ko.pureComputed(function(){ - var visible = 0; - var single; - if(self.editVis()){ - visible++; - single = 'edit'; - } - if(self.viewVis()){ - visible++; - single = 'view'; - } - if(self.compareVis()){ - visible++; - single = 'compare'; - } - if(visible === 1){ - return single; - } - return false; - }); - - self.pageTitle = $(document).find('title').text(); - - self.compareVersion = ko.observable(options.compareVersion); - self.viewVersion = ko.observable(options.viewVersion); - self.draftURL = options.urls.draft; - self.contentURL = options.urls.content; - self.pageURL = options.urls.page; - self.editorMetadata = options.metadata; - self.canEdit = options.canEdit; - - self.viewText = ko.observable(''); - self.renderedView = ko.observable(''); - self.renderedCompare = ko.observable(''); - self.allowMathjaxification = ko.observable(true); - self.allowFullRender = ko.observable(true); - self.viewVersionDisplay = ko.computed(function() { - var versionString = ''; - if (self.viewVersion() === 'preview') { - versionString = 'Live preview'; - } else if (self.viewVersion() === 'current'){ - versionString = 'Current version'; - } else if (self.viewVersion() === 'previous'){ - versionString = 'Previous version'; - } else { - versionString = 'Version ' + self.viewVersion(); - } - return versionString; - }); - // Save initial query params (except for the "mode" query params, which are handled - // by self.currentURL), so that we can preserve them when we mutate window.history.state - var initialParams = $osf.urlParams(); - delete initialParams.view; - delete initialParams.edit; - delete initialParams.compare; - delete initialParams.menu; - self.initialQueryParams = $.param(initialParams); - - self.currentURL = ko.computed(function() { - // Do not change URL for incompatible browsers - if (typeof window.history.replaceState === 'undefined') { - return; - } - - var paramPrefix = '?'; - var url = self.pageURL; - // Preserve initial query params - if (self.initialQueryParams) { - url += paramPrefix + self.initialQueryParams; - paramPrefix = '&'; - } - // Default view is special cased - if (!self.editVis() && self.viewVis() && self.viewVersion() === 'current' && !self.compareVis() && self.menuVis()) { - window.history.replaceState({}, '', url); - return; - } - - if (self.editVis()) { - url += paramPrefix + 'edit'; - paramPrefix = '&'; - } - if (self.viewVis()) { - url += paramPrefix + 'view'; - paramPrefix = '&'; - if ((!self.editVis() && self.viewVersion() !== 'current' ) || - (self.editVis() && self.viewVersion() !== 'preview')) { - url += '=' + self.viewVersion(); - } - } - if (self.compareVis()) { - url += paramPrefix + 'compare'; - paramPrefix = '&'; - if (self.compareVersion() !== 'previous'){ - url += '=' + self.compareVersion(); - } - } - if (self.menuVis()) { - url += paramPrefix + 'menu'; - } - - window.history.replaceState({}, self.pageTitle, url); - }); - - - if(self.canEdit) { - self.editor = ace.edit('editor'); // jshint ignore: line - - var ShareJSDoc = require('addons/wiki/static/ShareJSDoc.js'); - self.editVM = new ShareJSDoc(self.draftURL, self.editorMetadata, self.viewText, self.editor); - } - self.viewVM = new ViewWidget(self.viewVis, self.viewVersion, self.viewText, self.renderedView, self.contentURL, self.allowMathjaxification, self.allowFullRender, self.editor); - self.compareVM = new CompareWidget(self.compareVis, self.compareVersion, self.viewVM.displaySource, self.renderedCompare, self.contentURL); - - var bodyElement = $('body'); - bodyElement.on('togglePanel', function (event, panel, display) { - // Update self.editVis, self.viewVis, or self.compareVis in viewmodel - self[panel + 'Vis'](display); - //URL needs to be a computed observable, and this should just update the panel states, which will feed URL - // Switch view to correct version - if (panel === 'edit') { - if (display) { - self.viewVersion('preview'); - } else if (self.viewVersion() === 'preview') { - self.viewVersion('current'); - } - } else if (panel === 'view') { - if(!display && self.compareVis() && self.editVis()){ - self.viewVersion('preview'); - } - } - }); - - bodyElement.on('toggleMenu', function(event, menuVisible) { - self.menuVis(menuVisible); - }); -} - - - -var WikiPage = function(selector, options) { - var self = this; - self.options = $.extend({}, defaultOptions, options); - - this.viewModel = new ViewModel(self.options); - $osf.applyBindings(self.viewModel, selector); -}; - -module.exports = WikiPage; - diff --git a/addons/wiki/templates/edit.mako b/addons/wiki/templates/edit.mako deleted file mode 100644 index f9821c3d215..00000000000 --- a/addons/wiki/templates/edit.mako +++ /dev/null @@ -1,417 +0,0 @@ -<%inherit file="project/project_base.mako"/> -<%def name="title()">${node['title']} Wiki - -<%def name="stylesheets()"> - ${parent.stylesheets()} - - -## Use full page width -<%def name="container_class()">container-xxl - -% if (user['can_comment'] or node['has_comments']) and not node['anonymous']: - <%include file="include/comment_pane_template.mako"/> -% endif - -
-
- <%include file="wiki/templates/status.mako"/> -
-
-
-
-
-
-
- -
-
- - -
-
- % if user['can_edit']: -
- New -
- % if wiki_id and wiki_name != 'home': -
- Delete -
- % endif - % else: -

Menu

- % endif - -
-
-
-
-
-
-

Loading wiki pages...

-
-
- -
- - - -
- -
-
-
- -
-
-
-
-
-
View
-
-
- -
- - Wiki Version: -
- -
-
- -
-
-
- -
-
- % if wiki_content: - ${wiki_content} - % else: -

Add important information, links, or images here to describe your project.

- % endif -
-
-
-
- - % if user['can_edit_wiki_body']: -
-
-
-
-
-
-

Edit

-
-
-
-
-
- - - - - - -
-
-
-
- -
-
- - -
-
- -
- % endif - - -
-
-
-
-
- Compare -
- - to - - -
- -
-
-
-
-
-
-
-
-
- -
-
- - - <%include file="wiki/templates/add_wiki_page.mako"/> - <%include file="wiki/templates/wiki-bar-modal-help.mako"/> -% if wiki_id and wiki_name != 'home': - <%include file="wiki/templates/delete_wiki_page.mako"/> -% endif - - - - - - - - - - - - - - - - -<%def name="javascript_bottom()"> -${parent.javascript_bottom()} - - - - - - - diff --git a/addons/wiki/tests/test_wiki.py b/addons/wiki/tests/test_wiki.py index df24ee0690c..f169646e303 100644 --- a/addons/wiki/tests/test_wiki.py +++ b/addons/wiki/tests/test_wiki.py @@ -35,6 +35,10 @@ pytestmark = pytest.mark.django_db + +# TODO: remove all WIKI_WEB_SKIP tests if safe +WIKI_WEB_SKIP = pytest.mark.skip(reason='Wiki web UI removed; served by angular-osf') + # forward slashes are not allowed, typically they would be replaced with spaces SPECIAL_CHARACTERS_ALL = r'`~!@#$%^*()-=_+ []{}\|/?.df,;:''"' SPECIAL_CHARACTERS_ALLOWED = r'`~!@#$%^*()-=_+ []{}\|?.df,;:''"' @@ -54,11 +58,13 @@ def setUp(self): self.second_project = ProjectFactory(is_public=True, creator=self.user) self.sec_wiki = WikiPage.objects.create_for_node(self.second_project, 'home', '', Auth(self.user)) + @WIKI_WEB_SKIP def test_wiki_url_get_returns_200(self): url = self.project.web_url_for('project_wiki_view', wname='home') res = self.app.get(url) assert res.status_code == 200 + @WIKI_WEB_SKIP def test_wiki_url_404_with_no_write_permission(self): # and not public url = self.project.web_url_for('project_wiki_view', wname='somerandomid') res = self.app.get(url, auth=self.user.auth) @@ -66,6 +72,7 @@ def test_wiki_url_404_with_no_write_permission(self): # and not public res = self.app.get(url) assert res.status_code == 404 + @WIKI_WEB_SKIP @mock.patch('addons.wiki.utils.broadcast_to_sharejs') def test_wiki_deleted_404_with_no_write_permission(self, mock_sharejs): url = self.project.web_url_for('project_wiki_view', wname='funpage') @@ -76,6 +83,7 @@ def test_wiki_deleted_404_with_no_write_permission(self, mock_sharejs): res = self.app.get(url) assert res.status_code == 404 + @WIKI_WEB_SKIP def test_wiki_url_with_path_get_returns_200(self): self.funpage_wiki.update(self.user, 'Version 2') @@ -86,6 +94,7 @@ def test_wiki_url_with_path_get_returns_200(self): res = self.app.get(url, auth=self.user.auth) assert res.status_code == 200 + @WIKI_WEB_SKIP def test_wiki_url_with_edit_get_redirects_to_no_edit_params_with_no_write_permission(self): self.funpage_wiki.update(self.user, 'Version 2') @@ -115,6 +124,7 @@ def test_wiki_url_with_edit_get_redirects_to_no_edit_params_with_no_write_permis res = self.app.get(url) assert res.status_code == 401 + @WIKI_WEB_SKIP def test_wiki_url_for_pointer_returns_200(self): # TODO: explain how this tests a pointer project = ProjectFactory(is_public=True) @@ -148,12 +158,14 @@ def test_wiki_content_rendered_before_update(self, mock_rendered_before_update): res = self.app.get(url, auth=self.user.auth) assert not res.json['rendered_before_update'] + @WIKI_WEB_SKIP def test_wiki_url_for_component_returns_200(self): component = NodeFactory(parent=self.project, is_public=True) url = component.web_url_for('project_wiki_view', wname='home') res = self.app.get(url) assert res.status_code == 200 + @WIKI_WEB_SKIP def test_project_wiki_edit_post(self): url = self.project.web_url_for('project_wiki_edit_post', wname='home') res = self.app.post(url, data={'content': 'new content'}, auth=self.user.auth, follow_redirects=True) @@ -163,6 +175,7 @@ def test_project_wiki_edit_post(self): new_wiki = WikiVersion.objects.get_for_node(self.project, 'home') assert new_wiki.content == 'new content' + @WIKI_WEB_SKIP def test_project_wiki_edit_post_with_new_wname_and_no_content(self): # note: forward slashes not allowed in page_name page_name = fake.catch_phrase().replace('/', ' ') @@ -181,6 +194,7 @@ def test_project_wiki_edit_post_with_new_wname_and_no_content(self): new_page = WikiVersion.objects.get_for_node(self.project, page_name) assert new_page is not None + @WIKI_WEB_SKIP def test_project_wiki_edit_post_with_new_wname_and_content(self): # note: forward slashes not allowed in page_name page_name = fake.catch_phrase().replace('/', ' ') @@ -203,6 +217,7 @@ def test_project_wiki_edit_post_with_new_wname_and_content(self): # content was set assert new_page.content == page_content + @WIKI_WEB_SKIP def test_project_wiki_edit_post_with_non_ascii_title(self): # regression test for https://github.com/CenterForOpenScience/openscienceframework.org/issues/1040 # wname doesn't exist in the db, so it will be created @@ -218,6 +233,7 @@ def test_project_wiki_edit_post_with_non_ascii_title(self): res = self.app.post(url, data={'content': 'updated content'}, auth=self.user.auth, follow_redirects=True) assert res.status_code == 200 + @WIKI_WEB_SKIP def test_project_wiki_edit_post_with_special_characters(self): new_wname = 'title: ' + SPECIAL_CHARACTERS_ALLOWED new_wiki_content = 'content: ' + SPECIAL_CHARACTERS_ALL @@ -230,11 +246,13 @@ def test_project_wiki_edit_post_with_special_characters(self): assert wiki.content == new_wiki_content assert res.status_code == 200 + @WIKI_WEB_SKIP def test_wiki_edit_get_home(self): url = self.project.web_url_for('project_wiki_view', wname='home') res = self.app.get(url, auth=self.user.auth) assert res.status_code == 200 + @WIKI_WEB_SKIP def test_project_wiki_view_scope(self): url = self.project.web_url_for('project_wiki_view', wname='home', view=2) res = self.app.get(url, auth=self.user.auth) @@ -246,11 +264,13 @@ def test_project_wiki_view_scope(self): res = self.app.get(url, auth=self.user.auth) assert res.status_code == 400 + @WIKI_WEB_SKIP def test_project_wiki_compare_returns_200(self): url = self.project.web_url_for('project_wiki_view', wname='home') + '?compare' res = self.app.get(url, auth=self.user.auth) assert res.status_code == 200 + @WIKI_WEB_SKIP def test_project_wiki_compare_scope(self): url = self.project.web_url_for('project_wiki_view', wname='home', compare=2) res = self.app.get(url, auth=self.user.auth) @@ -262,6 +282,7 @@ def test_project_wiki_compare_scope(self): res = self.app.get(url, auth=self.user.auth) assert res.status_code == 400 + @WIKI_WEB_SKIP def test_wiki_page_creation_strips_whitespace(self): # Regression test for: # https://github.com/CenterForOpenScience/openscienceframework.org/issues/1080 @@ -321,6 +342,7 @@ def test_project_wiki_validate_name_conflict_different_casing(self): res = self.app.get(url, auth=self.user.auth) assert res.status_code == 409 + @WIKI_WEB_SKIP def test_project_dashboard_shows_no_wiki_content_text(self): # Regression test for: # https://github.com/CenterForOpenScience/openscienceframework.org/issues/1104 @@ -341,6 +363,7 @@ def test_project_dashboard_wiki_wname_get_shows_non_ascii_characters(self): res = self.app.get(url, auth=self.user.auth) assert text in res + @WIKI_WEB_SKIP def test_project_wiki_home_api_route(self): url = self.project.api_url_for('project_wiki_home') res = self.app.get(url, auth=self.user.auth) @@ -349,6 +372,7 @@ def test_project_wiki_home_api_route(self): # page_url = self.project.api_url_for('project_wiki_view', wname='home') # assert page_url in res.location + @WIKI_WEB_SKIP def test_project_wiki_home_web_route(self): page_url = self.project.web_url_for('project_wiki_view', wname='home', _guid=True) url = self.project.web_url_for('project_wiki_home') @@ -356,6 +380,7 @@ def test_project_wiki_home_web_route(self): assert res.status_code == 302 assert page_url in res.location + @WIKI_WEB_SKIP def test_wiki_id_url_get_returns_302_and_resolves(self): name = 'page by id' page = WikiPage.objects.create_for_node(self.project, name, 'some content', Auth(self.project.creator)) @@ -368,11 +393,13 @@ def test_wiki_id_url_get_returns_302_and_resolves(self): assert res.status_code == 200 assert page_url in res.request.url + @WIKI_WEB_SKIP def test_wiki_id_url_get_returns_404(self): url = self.project.web_url_for('project_wiki_id_page', wid='12345', _guid=True) res = self.app.get(url) assert res.status_code == 404 + @WIKI_WEB_SKIP def test_home_is_capitalized_in_web_view(self): url = self.project.web_url_for('project_wiki_home', wid='home', _guid=True) res = self.app.get(url, auth=self.user.auth, follow_redirects=True) @@ -424,6 +451,7 @@ def test_wiki_widget_rendered_before_update(self, mock_rendered_before_update): res = serialize_wiki_widget(self.project) assert res['rendered_before_update'] + @WIKI_WEB_SKIP def test_read_only_users_cannot_view_edit_pane(self): url = self.project.web_url_for('project_wiki_view', wname='home') # No write permissions @@ -464,13 +492,6 @@ def setUp(self): self.wname = 'New page' wiki = WikiPage.objects.create_for_node(self.project, self.wname, 'some content', Auth(self.project.creator)) - def test_get_wiki_web_urls(self): - urls = views._get_wiki_web_urls(self.project, self.wname) - assert urls['base'] == self.project.web_url_for('project_wiki_home', _guid=True) - assert urls['edit'] == self.project.web_url_for('project_wiki_view', wname=self.wname, _guid=True) - assert urls['home'] == self.project.web_url_for('project_wiki_home', _guid=True) - assert urls['page'] == self.project.web_url_for('project_wiki_view', wname=self.wname, _guid=True) - def test_get_wiki_api_urls(self): urls = views._get_wiki_api_urls(self.project, self.wname) assert urls['base'] == self.project.api_url_for('project_wiki_home') @@ -743,6 +764,7 @@ def setUp(self): self.wname = 'foo.bar' self.wkey = to_mongo_key(self.wname) + @WIKI_WEB_SKIP def test_uuid_generated_once(self): assert self.project.wiki_private_uuids.get(self.wkey) is None url = self.project.web_url_for('project_wiki_view', wname=self.wname) @@ -761,6 +783,7 @@ def test_uuid_generated_once(self): self.project.reload() assert private_uuid == self.project.wiki_private_uuids.get(self.wkey) + @WIKI_WEB_SKIP def test_uuid_not_visible_without_write_permission(self): WikiPage.objects.create_for_node(self.project, self.wname, 'some content', Auth(self.user)) @@ -780,6 +803,7 @@ def test_uuid_not_visible_without_write_permission(self): assert res.status_code == 200 assert get_sharejs_uuid(self.project, self.wname) not in res.text + @WIKI_WEB_SKIP def test_uuid_not_generated_without_write_permission(self): WikiPage.objects.create_for_node(self.project, self.wname, 'some content', Auth(self.user)) @@ -792,6 +816,7 @@ def test_uuid_not_generated_without_write_permission(self): private_uuid = self.project.wiki_private_uuids.get(self.wkey) assert private_uuid is None + @WIKI_WEB_SKIP def test_uuids_differ_between_pages(self): wname1 = 'foo.bar' url1 = self.project.web_url_for('project_wiki_view', wname=wname1) @@ -813,6 +838,7 @@ def test_uuids_differ_between_pages(self): assert uuid1 not in res2.text assert uuid2 not in res1.text + @WIKI_WEB_SKIP def test_uuids_differ_between_forks(self): url = self.project.web_url_for('project_wiki_view', wname=self.wname) project_res = self.app.get(url, auth=self.user.auth) @@ -852,6 +878,7 @@ def test_migration_does_not_affect_forks(self, mock_sharejs): assert original_uuid != self.project.wiki_private_uuids.get(self.wkey) assert fork.wiki_private_uuids.get(self.wkey) is None + @WIKI_WEB_SKIP @mock.patch('addons.wiki.utils.broadcast_to_sharejs') def test_uuid_persists_after_delete(self, mock_sharejs): assert self.project.wiki_private_uuids.get(self.wkey) is None @@ -881,6 +908,7 @@ def test_uuid_persists_after_delete(self, mock_sharejs): assert original_private_uuid == self.project.wiki_private_uuids.get(self.wkey) assert original_sharejs_uuid in res.text + @WIKI_WEB_SKIP @mock.patch('addons.wiki.utils.broadcast_to_sharejs') def test_uuid_persists_after_rename(self, mock_sharejs): new_wname = 'barbaz' @@ -1269,121 +1297,3 @@ def test_serialize_wiki_settings_disabled_wiki(self): }] assert data == expected - -@pytest.mark.enable_bookmark_creation -class TestWikiMenu(OsfTestCase): - - def setUp(self): - super().setUp() - self.user = UserFactory() - self.project = ProjectFactory(creator=self.user, is_public=True) - self.component = NodeFactory(creator=self.user, parent=self.project, is_public=True) - self.consolidate_auth = Auth(user=self.project.creator) - self.non_contributor = UserFactory() - - def test_format_home_wiki_page_no_content(self): - data = views.format_home_wiki_page(self.project) - expected = { - 'page': { - 'url': self.project.web_url_for('project_wiki_home'), - 'name': 'Home', - 'id': 'None', - } - } - assert data == expected - - def test_format_project_wiki_pages_contributor(self): - home_page = WikiPage.objects.create_for_node(self.project, 'home', 'content here', self.consolidate_auth) - zoo_page = WikiPage.objects.create_for_node(self.project, 'zoo', 'koala', self.consolidate_auth) - data = views.format_project_wiki_pages(self.project, self.consolidate_auth) - expected = [ - { - 'page': { - 'url': self.project.web_url_for('project_wiki_view', wname='home', _guid=True), - 'name': 'Home', - 'id': home_page._primary_key, - } - }, - { - 'page': { - 'url': self.project.web_url_for('project_wiki_view', wname='zoo', _guid=True), - 'name': 'zoo', - 'id': zoo_page._primary_key, - } - } - ] - assert data == expected - - def test_format_project_wiki_pages_no_content_non_contributor(self): - home_page = WikiPage.objects.create_for_node(self.project, 'home', 'content here', self.consolidate_auth) - zoo_page = WikiPage.objects.create_for_node(self.project, 'zoo', '', self.consolidate_auth) - home_page = WikiVersion.objects.get_for_node(self.project, 'home') - data = views.format_project_wiki_pages(self.project, auth=Auth(self.non_contributor)) - expected = [ - { - 'page': { - 'url': self.project.web_url_for('project_wiki_view', wname='home', _guid=True), - 'name': 'Home', - 'id': home_page.wiki_page._primary_key, - } - } - ] - assert data == expected - - def test_format_component_wiki_pages_contributor(self): - home_page = WikiPage.objects.create_for_node(self.component, 'home', 'content here', self.consolidate_auth) - zoo_page = WikiPage.objects.create_for_node(self.component, 'zoo', 'koala', self.consolidate_auth) - expected = [ - { - 'page': { - 'name': self.component.title, - 'url': self.component.web_url_for('project_wiki_view', wname='home', _guid=True), - }, - 'children': [ - { - 'page': { - 'url': self.component.web_url_for('project_wiki_view', wname='home', _guid=True), - 'name': 'Home', - 'id': self.component._primary_key, - } - }, - { - 'page': { - 'url': self.component.web_url_for('project_wiki_view', wname='zoo', _guid=True), - 'name': 'zoo', - 'id': zoo_page._primary_key, - }, - } - ], - 'kind': 'component', - 'category': self.component.category, - 'pointer': False, - } - ] - data = views.format_component_wiki_pages(node=self.project, auth=self.consolidate_auth) - assert data == expected - - def test_format_component_wiki_pages_no_content_non_contributor(self): - data = views.format_component_wiki_pages(node=self.project, auth=Auth(self.non_contributor)) - expected = [] - assert data == expected - - def test_project_wiki_grid_data(self): - WikiPage.objects.create_for_node(self.project, 'home', 'project content', self.consolidate_auth) - WikiPage.objects.create_for_node(self.component, 'home', 'component content', self.consolidate_auth) - data = views.project_wiki_grid_data(auth=self.consolidate_auth, wname='home', node=self.project) - expected = [ - { - 'title': 'Project Wiki Pages', - 'kind': 'folder', - 'type': 'heading', - 'children': views.format_project_wiki_pages(node=self.project, auth=self.consolidate_auth), - }, - { - 'title': 'Component Wiki Pages', - 'kind': 'folder', - 'type': 'heading', - 'children': views.format_component_wiki_pages(node=self.project, auth=self.consolidate_auth) - } - ] - assert data == expected diff --git a/admin/webpack.admin.config.js b/admin/webpack.admin.config.js index be4bdb6f53d..b1671f4cb7f 100644 --- a/admin/webpack.admin.config.js +++ b/admin/webpack.admin.config.js @@ -43,5 +43,15 @@ var config = Object.assign({}, common, { plugins: plugins, devtool: 'source-map', }); -config.resolve.modules.push(websiteRoot, adminRoot); +config.resolve = Object.assign({}, config.resolve, { + modules: config.resolve.modules.concat([websiteRoot, adminRoot]), + extensions: ['*', '.es6.js', '.js', '.min.js'], +}); + +config.module = Object.assign({}, config.module, { + rules: (config.module && config.module.rules || []).concat([ + {test: /\.es6\.js$/, exclude: [/node_modules/, /bower_components/, /vendor/], loader: 'babel-loader'}, + ]), +}); + module.exports = config; diff --git a/package.json b/package.json index b4d5e0a60e7..fe7ef44be4c 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,6 @@ "license": "Apache-2.0", "dependencies": { "@centerforopenscience/list-of-licenses": "^1.1.0", - "@centerforopenscience/markdown-it-atrules": "^0.1.1", - "@centerforopenscience/markdown-it-imsize": "2.0.1", - "@centerforopenscience/markdown-it-toc": "~1.1.1", - "@centerforopenscience/markdown-it-video": "1.0.0", "@centerforopenscience/osf-style": "1.9.0", "@fortawesome/fontawesome-free": "^7.0.1", "@fortawesome/fontawesome-svg-core": "^7.0.1", @@ -18,9 +14,6 @@ "@fortawesome/react-fontawesome": "^3.0.2", "URIjs": "^1.14.1", "assets-webpack-plugin": "^2.3.0", - "babel-core": "^6.0.0", - "babel-loader": "^6.4.1", - "body-parser": "~1.19.1", "bootbox": "^5.5.2", "bootstrap": "3.3.7", "bower": "^1.8.8", @@ -29,41 +22,33 @@ "dropzone": "https://github.com/CenterForOpenScience/dropzone.git#aba21eb6b82cc823ac7a7a53d6e035791c082bae", "exports-loader": "0.6.3", "file-loader": "^0.11.2", - "font-awesome-webpack": "0.0.5-beta.2", "gsap": "3.9.1", "highlight.js": "~9.18.2", "imports-loader": "^0.6.3", "js-cookie": "3.0.1", "js-md5": "^0.7.3", "jstimezonedetect": "^1.0.6", - "keen-dataviz": "^1.0.2", "knockout": "~3.4.2", "knockout.validation": "^2.0.2", "less": "^4.1.2", "linkifyjs": "^3.0.5", "loaders.css": "^0.1.2", - "lodash.chunk": "^4.0.6", "lodash.find": "^4.3.0", "lodash.get": "^4.2.1", "lodash.has": "^4.5.2", "lodash.includes": "^4.3.0", "lodash.set": "^4.3.2", - "markdown-it": "~12.3.2", - "markdown-it-ins-del": "^0.1.1", - "markdown-it-sanitizer": "~0.4.3", "mime-types": "~2.1.34", "mithril": "0.2.0", "moment": "^2.14.1", "object-assign": "^3.0.0", "pikaday": "^1.3.2", - "pretty-data": "^0.40.0", "raw-loader": "~0.5.0", "select2": "3.5.1", "style-loader": "^0.23.1", "treebeard": "https://github.com/CenterForOpenScience/treebeard.git#d2bb8f6f8104fcac040402727f431c26722b269e", "typeahead.js": "^0.11.1", "url-loader": "~0.6.2", - "uuid": "^8.3.2", "webpack": "3.12.0", "zxcvbn": "^4.2.0" }, @@ -73,8 +58,6 @@ }, "resolutions": { "bootbox/bootstrap": "^3.3.7", - "font-awesome-webpack/css-loader": "^0.28.11", - "font-awesome-webpack/style-loader": "^0.23.1", "treebeard/mithril": "0.2.0", "treebeard/bootstrap": "3.3.7", "webpack/uglifyjs-webpack-plugin": "1.3.0", diff --git a/tests/test_project_views.py b/tests/test_project_views.py index 9403546e0dd..f4456feb18c 100644 --- a/tests/test_project_views.py +++ b/tests/test_project_views.py @@ -435,7 +435,7 @@ def test_retraction_view(self): assert registration.title in res.text assert res.status_code == 200 - for route in ['files', 'wiki/home', 'contributors', 'settings', 'withdraw', 'register', 'register/fakeid']: + for route in ['files', 'contributors', 'settings', 'withdraw', 'register', 'register/fakeid']: res = self.app.get(f'{url}{route}/', auth=self.auth) assert res.status_code == 302, route res = self.app.get(f'{url}{route}/', auth=self.auth, follow_redirects=True) diff --git a/tests/test_webtests.py b/tests/test_webtests.py index cd840105fe7..64c5669f3e9 100644 --- a/tests/test_webtests.py +++ b/tests/test_webtests.py @@ -179,32 +179,6 @@ def test_sees_logs_on_a_project(self): # Can see log event assert 'created' in res.text - def test_no_wiki_content_message(self): - project = ProjectFactory(creator=self.user) - # Goes to project's wiki, where there is no content - res = self.app.get(f'/{project._primary_key}/wiki/home/', auth=self.auth) - # Sees a message indicating no content - assert 'Add important information, links, or images here to describe your project.' in res.text - # Sees that edit panel is open by default when home wiki has no content - assert 'panelsUsed: ["view", "menu", "edit"]' in res.text - - def test_wiki_content(self): - project = ProjectFactory(creator=self.user) - wiki_page_name = 'home' - wiki_content = 'Kittens' - wiki_page = WikiFactory( - user=self.user, - node=project, - ) - WikiVersionFactory( - wiki_page=wiki_page, - content=wiki_content - ) - res = self.app.get(f'/{project._primary_key}/wiki/{wiki_page_name}/', auth=self.auth) - assert 'Add important information, links, or images here to describe your project.' not in res.text - assert wiki_content in res.text - assert 'panelsUsed: ["view", "menu"]' in res.text - def test_wiki_page_name_non_ascii(self): project = ProjectFactory(creator=self.user) non_ascii = to_mongo_key('WöRlÐé') @@ -221,11 +195,6 @@ def test_noncontributor_cannot_see_wiki_if_no_content(self): # Should not see wiki widget (since non-contributor and no content) assert 'Add important information, links, or images here to describe your project.' not in res.text - def test_wiki_does_not_exist(self): - project = ProjectFactory(creator=self.user) - res = self.app.get(f'/{project._primary_key}/wiki/not a real page yet/', auth=self.auth) - assert 'Add important information, links, or images here to describe your project.' in res.text - def test_sees_own_profile(self): res = self.app.get('/profile/', auth=self.auth) td1 = res.html.find('td', text=re.compile(r'Public(.*?)Profile')) diff --git a/webpack.common.config.js b/webpack.common.config.js index dea1f7abdc9..e76b755dbdf 100644 --- a/webpack.common.config.js +++ b/webpack.common.config.js @@ -26,14 +26,12 @@ var entry = { 'base-page': staticPath('js/pages/base-page.js'), 'dashboard-page': staticPath('js/pages/dashboard-page.js'), 'profile-page': staticPath('js/pages/profile-page.js'), - 'project-dashboard': staticPath('js/pages/project-dashboard-page.js'), 'project-base-page': staticPath('js/pages/project-base-page.js'), 'project-settings-page': staticPath('js/pages/project-settings-page.js'), 'project-addons-page': staticPath('js/pages/project-addons-page.js'), 'registration-retraction-page': staticPath('js/pages/registration-retraction-page.js'), 'registration-edit-page': staticPath('js/pages/registration-edit-page.js'), 'register-page': staticPath('js/pages/register-page.js'), - 'wiki-edit-page': staticPath('js/pages/wiki-edit-page.js'), 'request-access-page': staticPath('js/pages/request-access-page.js'), 'file-page': staticPath('js/pages/file-page.js'), 'files-page': staticPath('js/pages/files-page.js'), @@ -131,7 +129,7 @@ var resolve = { './website/static/vendor/bower_components', 'node_modules', ], - extensions: ['*', '.es6.js', '.js', '.min.js'], + extensions: ['*', '.js', '.min.js'], // Need to alias libraries that aren't managed by bower or npm alias: { 'knockout-sortable': staticPath('vendor/knockout-sortable/knockout-sortable.js'), @@ -206,7 +204,6 @@ module.exports = { output: output, module: { rules: [ - {test: /\.es6\.js$/, exclude: [/node_modules/, /bower_components/, /vendor/], loader: 'babel-loader'}, {test: /\.css$/, use: [{loader: 'style-loader'}, {loader: 'css-loader'}]}, // url-loader uses DataUrls; files-loader emits files {test: /\.png$/, loader: 'url-loader?limit=100000&mimetype=image/png'}, diff --git a/website/routes.py b/website/routes.py index df2984562bf..73ff5ae1c96 100644 --- a/website/routes.py +++ b/website/routes.py @@ -1055,17 +1055,6 @@ def make_url_map(app): OsfWebRenderer('project/settings.mako', trust=False) ), - # Permissions - Rule( # TODO: Where, if anywhere, is this route used? - [ - '/project//permissions//', - '/project//node//permissions//', - ], - 'post', - project_views.node.project_set_privacy, - OsfWebRenderer('project/project.mako', trust=False) - ), - # View forks Rule( [ diff --git a/website/static/js/comment.js b/website/static/js/comment.js index fed0eea6da5..733b0d067c7 100644 --- a/website/static/js/comment.js +++ b/website/static/js/comment.js @@ -12,7 +12,6 @@ require('jquery-autosize'); var osfHelpers = require('js/osfHelpers'); var CommentPane = require('js/commentpane'); -var markdown = require('js/markdown'); var atMention = require('js/atMention'); // Cached contributor and group member data, to prevent multiple fetches for @mentions @@ -461,11 +460,11 @@ var CommentModel = function(data, $parent, $root) { }); var linkifyOpts = { target: function (href, type) { return type === 'url' ? '_top' : null; } }; - self.contentDisplay = ko.observable(linkifyHtml(markdown.full.render(self.content()), linkifyOpts)); + self.contentDisplay = ko.observable(linkifyHtml(self.content(), linkifyOpts)); - // Update contentDisplay with rendered markdown whenever content changes + // Update contentDisplay with linkified text whenever content changes self.content.subscribe(function(newContent) { - self.contentDisplay(linkifyHtml(markdown.full.render(newContent), linkifyOpts)); + self.contentDisplay(linkifyHtml(newContent, linkifyOpts)); }); self.prettyDateCreated = ko.computed(function() { diff --git a/website/static/js/markdown.js b/website/static/js/markdown.js deleted file mode 100644 index b1dc91d9ffe..00000000000 --- a/website/static/js/markdown.js +++ /dev/null @@ -1,119 +0,0 @@ -'use strict'; -var hljs = require('highlight.js'); -require('highlight-css'); -var MarkdownIt = require('markdown-it'); - -var $ = require('jquery'); -var $osf = require('js/osfHelpers'); -var insDel = require('markdown-it-ins-del'); -var pymarkdownList = require('js/markdown-it-pymarkdown-lists'); - -var highlighter = function (str, lang) { - if (lang && hljs.getLanguage(lang)) { - try { - return hljs.highlight(lang, str).value; - } catch (__) {} - } - - try { - return hljs.highlightAuto(str).value; - } catch (__) {} - - return ''; // use external default escaping - }; - -/** - * Apply .table class (from Bootstrap) to all tables - */ -var bootstrapTable = function(md) { - md.renderer.rules.table_open = function() { return ''; }; -}; - -var oldMarkdownList = function(md) { - md.block.ruler.after('hr', 'pyMarkdownList', pymarkdownList); -}; - -var WATERBUTLER_REGEX = new RegExp(window.contextVars.waterbutlerURL + 'v1\/resources\/[a-zA-Z0-9]{1,}\/providers\/[a-z0-9]{1,}\/'); - -var viewOnlyImage = function(md) { - var defaultRenderer = md.renderer.rules.image; - md.renderer.rules.image = function (tokens, idx, options, env, self) { - var token = tokens[idx]; - var imageLink = token.attrs[token.attrIndex('src')][1]; - if (imageLink.match(WATERBUTLER_REGEX) && $osf.urlParams().view_only) { - token = tokens[idx]; - imageLink = token.attrs[token.attrIndex('src')][1]; - token.attrs[token.attrIndex('src')][1] = imageLink + '&view_only=' + $osf.urlParams().view_only; - tokens[idx] = token; - } - return defaultRenderer(tokens, idx, options, env, self); - }; -}; - -var mfrURL = window.contextVars.node.urls.mfr; -var osfURL = window.contextVars.osfURL; - -var getMfrUrl = function (guid) { - var mfrLink = mfrURL + 'render?url='+ osfURL + guid + '/download/?action=download%26mode=render'; - if ($osf.urlParams().view_only) { - mfrLink += '%26view_only=' + $osf.urlParams().view_only; - } - return mfrLink; -}; - -var mfrId = 0; - -// Full markdown renderer for views / wiki pages / pauses between typing -var markdown = new MarkdownIt('commonmark', { - highlight: highlighter, - linkify: true - }).use(require('@centerforopenscience/markdown-it-atrules'), { - type: 'osf', - pattern: /^http(?:s?):\/\/(?:www\.)?[a-zA-Z0-9 .:]{1,}\/render\?url=http(?:s?):\/\/[a-zA-Z0-9 .:]{1,}\/([a-zA-Z0-9]{1,})\/\?action=download|(^[a-zA-Z0-9]{1,}$)/, - format: function(assetID) { - var id = '__markdown-it-atrules-' + mfrId++; - return '
' + - ''; - } - }) - .use(require('@centerforopenscience/markdown-it-video')) - .use(require('@centerforopenscience/markdown-it-toc')) - .use(require('markdown-it-sanitizer')) - .use(viewOnlyImage) - .use(require('@centerforopenscience/markdown-it-imsize')) - .use(insDel) - .enable('table') - .enable('linkify') - .use(bootstrapTable) - .disable('strikethrough'); - - -// Fast markdown renderer for active editing to prevent slow loading/rendering tasks -var markdownQuick = new MarkdownIt('commonmark', { linkify: true }) - .use(require('markdown-it-sanitizer')) - .use(viewOnlyImage) - .use(require('@centerforopenscience/markdown-it-imsize')) - .disable('link') - .disable('image') - .use(insDel) - .enable('table') - .enable('linkify') - .use(bootstrapTable) - .disable('strikethrough'); - -// Markdown renderer for older wikis rendered before switch date -var markdownOld = new MarkdownIt('commonmark', { linkify: true}) - .use(require('markdown-it-sanitizer')) - .use(require('@centerforopenscience/markdown-it-imsize')) - .use(insDel) - .enable('table') - .enable('linkify') - .use(bootstrapTable) - .use(oldMarkdownList) - .disable('strikethrough'); - -module.exports = { - full: markdown, - quick: markdownQuick, - old: markdownOld -}; diff --git a/website/static/js/pages/project-dashboard-page.js b/website/static/js/pages/project-dashboard-page.js deleted file mode 100644 index 04cf9ffe5e2..00000000000 --- a/website/static/js/pages/project-dashboard-page.js +++ /dev/null @@ -1,470 +0,0 @@ -/** Initialization code for the project overview page. */ -'use strict'; - -var $ = require('jquery'); -require('jquery-tagsinput'); -require('bootstrap-editable'); -require('js/osfToggleHeight'); - -var m = require('mithril'); -var Fangorn = require('js/fangorn').Fangorn; -var Raven = require('raven-js'); -require('truncate'); - -var $osf = require('js/osfHelpers'); -var LogFeed = require('js/components/logFeed'); -var pointers = require('js/pointers'); -var Comment = require('js/comment'); //jshint ignore:line -var NodeControl = require('js/nodeControl'); -var CitationList = require('js/citationList'); -var CitationWidget = require('js/citationWidget'); -var mathrender = require('js/mathrender'); -var md = require('js/markdown').full; -var oldMd = require('js/markdown').old; -var AddProject = require('js/addProjectPlugin'); -var SocialShare = require('js/components/socialshare'); - -var ctx = window.contextVars; -var node = window.contextVars.node; -var nodeApiUrl = ctx.node.urls.api; -var nodeCategories = ctx.nodeCategories || []; -var currentUserRequestState = ctx.currentUserRequestState; -const tracker = require('js/components/tracker'); - -// Listen for the nodeLoad event (prevents multiple requests for data) -$('body').on('nodeLoad', function(event, data) { - if (!data.node.is_retracted) { - // Initialize controller for "Add Links" modal - new pointers.PointerManager('#addPointer', window.contextVars.node.title); - } - // Initialize CitationWidget if user isn't viewing through an anonymized VOL - if (!data.node.anonymous && !data.node.is_retracted) { - new CitationList('#citationList'); - new CitationWidget('#citationStyleInput', '#citationText'); - } - - if (data.node.identifiers.doi) { - tracker.trackView(data.node.identifiers.doi); - } - - // Initialize nodeControl - new NodeControl.NodeControl('#projectScope', data, {categories: nodeCategories, currentUserRequestState: currentUserRequestState}); - - // Enable the otherActionsButton once the page is loaded so the menu is properly populated - $('#otherActionsButton').removeClass('disabled'); -}); - -// Initialize comment pane w/ its viewmodel -var $comments = $('.comments'); -if ($comments.length) { - var options = { - nodeId : window.contextVars.node.id, - nodeApiUrl: window.contextVars.node.urls.api, - isRegistration: window.contextVars.node.isRegistration, - page: 'node', - rootId: window.contextVars.node.id, - fileId: null, - canComment: window.contextVars.currentUser.canComment, - currentUser: window.contextVars.currentUser, - pageTitle: window.contextVars.node.title, - inputSelector: '.atwho-input' - }; - Comment.init('#commentsLink', '.comment-pane', options); -} -var institutionLogos = { - controller: function(args){ - var self = this; - self.institutions = args.institutions; - self.nLogos = self.institutions.length; - self.side = self.nLogos > 1 ? (self.nLogos === 2 ? '50px' : '35px') : '75px'; - self.width = self.nLogos > 1 ? (self.nLogos === 2 ? '115px' : '86px') : '75px'; - self.makeLogo = function(institution){ - return m('a', {href: '/institutions/' + institution.id}, - m('img', { - height: self.side, width: self.side, - style: {margin: '3px'}, - title: institution.name, - src: institution.logo_path - }) - ); - }; - }, - view: function(ctrl, args){ - var tooltips = function(){ - $('[data-toggle="tooltip"]').tooltip(); - }; - var instCircles = $.map(ctrl.institutions, ctrl.makeLogo); - if (instCircles.length > 4){ - instCircles[3] = m('.fa.fa-plus-square-o', { - style: {margin: '6px', fontSize: '250%', verticalAlign: 'middle'}, - }); - instCircles.splice(4); - } - - return m('', {style: {float: 'left', width: ctrl.width, textAlign: 'center', marginRight: '10px'}, config: tooltips}, instCircles); - } -}; - - -$(document).ready(function () { - // activate bootstrap popovers - $('[data-toggle="popover"]').popover(); - // Allows dropdown elements to persist after being clicked - // Used for the "Share" button in the more actions menu - $('.dropdown').on('click', 'li', function (evt) { - var target = $(evt.target); - // If the clicked element has .keep-open, don't allow the event to propagate - return !(target.hasClass('keep-open') || target.parents('.keep-open').length); - }); - var collectionsActionsURL = $osf.apiV2Url('collection_submission_actions/'); - - $('.collections-retry-icon').on('click', function (evt) { - var target = $(evt.target); - var payload = { - data: { - type: 'collection-submission-actions', - attributes: { - comment: 'Resubmitted via project overview page', - trigger: 'resubmit', - }, - relationships: { - target: { - data: { - id: evt.target.getAttribute('node_id') + '-' + evt.target.getAttribute('collection_id'), - type: 'collection-submission', - } - } - } - } - }; - - var request = $osf.ajaxJSON( - 'POST', - collectionsActionsURL, - { - data: payload, - isCors: true - } - ); - request.done(function(resp) { - location.reload(); - }); - }); - $('.collections-cancel-icon').on('click', function (evt) { - var target = $(evt.target); - var payload = { - data: { - type: 'collection-submission-actions', - attributes: { - comment: 'Canceled via project overview page', - trigger: 'cancel', - }, - relationships: { - target: { - data: { - id: evt.target.getAttribute('node_id') + '-' + evt.target.getAttribute('collection_id'), - type: 'collection-submission', - } - } - } - } - }; - - var request = $osf.ajaxJSON( - 'POST', - collectionsActionsURL, - { - data: payload, - isCors: true - } - ); - request.done(function(resp) { - location.reload(); - }); - }); - - $('#collections-header').on('click', function (evt) { - if ($('#collections-header>.pull-left').css('display') === 'block') { - $('.collection-pencil').css('display', 'inherit'); - $('#collections-header>.pull-left').css('display', 'none'); - $('#collections-header').css('height', '0px'); - $('#collections-header').css('margin', '0px'); - $('#collections-caret-down').css('padding', '20px'); - $('#collections-caret-down>.fa').toggleClass('fa-angle-down'); - $('#collections-caret-down>.fa').toggleClass(' fa-angle-up'); - } else { - $('.collection-pencil').css('display', 'none'); - $('#collections-header>.pull-left').css('display', 'block'); - $('#collections-header').css('height', 'inherit'); - $('#collections-header').css('margin', '10px'); - $('#collections-caret-down').css('padding', '10px'); - $('#collections-caret-down>.fa').toggleClass('fa-angle-down'); - $('#collections-caret-down>.fa').toggleClass(' fa-angle-up'); - - } - }); - - var AddComponentButton = m.component(AddProject, { - buttonTemplate: m('.btn.btn-sm.btn-default[data-toggle="modal"][data-target="#addSubComponent"]', {onclick: function() { - $osf.trackClick('project-dashboard', 'add-component', 'open-add-project-modal'); - }}, 'Add Component'), - modalID: 'addSubComponent', - title: 'Create new component', - parentID: window.contextVars.node.id, - parentTitle: window.contextVars.node.title, - categoryList: nodeCategories, - stayCallback: function() { - // We need to reload because the components list needs to be re-rendered serverside - window.location.reload(); - }, - trackingCategory: 'project-dashboard', - trackingAction: 'add-component', - contributors: window.contextVars.node.contributors, - currentUserCanEdit: window.contextVars.currentUser.canEdit - }); - - if (!ctx.node.isRetracted) { - if (ctx.node.institutions.length && !ctx.node.anonymous) { - m.mount(document.getElementById('instLogo'), m.component(institutionLogos, {institutions: window.contextVars.node.institutions})); - } - $('#contributorsList').osfToggleHeight(); - - // Recent Activity widget - m.mount(document.getElementById('logFeed'), m.component(LogFeed.LogFeed, {node: node})); - - // Treebeard Files view - var urlFilesGrid = nodeApiUrl + 'files/grid/'; - var promise = m.request({ method: 'GET', config: $osf.setXHRAuthorization, url: urlFilesGrid}); - promise.then(function (data) { - var newComponentElem = document.getElementById('newComponent'); - if (window.contextVars.node.isPublic) { - m.mount( - document.getElementById('shareButtonsPopover'), - m.component( - SocialShare.ShareButtonsPopover, - {title: window.contextVars.node.title, url: window.location.href, type: 'link'} - ) - ); - } - if (newComponentElem) { - m.mount(newComponentElem, AddComponentButton); - } - var fangornOpts = { - divID: 'treeGrid', - filesData: data.data, - allowMove: !node.isRegistration, - uploads : true, - showFilter : true, - placement: 'dashboard', - title : undefined, - filterFullWidth : true, // Make the filter span the entire row for this view - xhrconfig: $osf.setXHRAuthorization, - columnTitles : function () { - return [ - { - title: 'Name', - width : '70%', - sort : true, - sortType : 'text' - }, - { - title: 'Modified', - width : '30%', - sort : true, - sortType : 'text' - } - ]; - }, - resolveRows : function (item) { - var tb = this; - item.css = ''; - if(tb.isMultiselected(item.id)){ - item.css = 'fangorn-selected'; - } - if(item.data.permissions && !item.data.permissions.view){ - item.css += ' tb-private-row'; - } - var defaultColumns = [ - { - data: 'name', - folderIcons: true, - filter: true, - custom: Fangorn.DefaultColumns._fangornTitleColumn}, - { - data: 'modified', - folderIcons: false, - filter: false, - custom: Fangorn.DefaultColumns._fangornModifiedColumn - }]; - if (item.parentID) { - item.data.permissions = item.data.permissions || item.parent().data.permissions; - if (item.data.kind === 'folder') { - item.data.accept = item.data.accept || item.parent().data.accept; - } - } - if(item.data.uploadState && (item.data.uploadState() === 'pending' || item.data.uploadState() === 'uploading')){ - return Fangorn.Utils.uploadRowTemplate.call(tb, item); - } - - var configOption = Fangorn.Utils.resolveconfigOption.call(this, item, 'resolveRows', [item]); - return configOption || defaultColumns; - } - }; - var filebrowser = new Fangorn(fangornOpts); - window.contextVars.node.activeAddons = data.data[0].activeAddons; - return promise; - }, function(xhr, textStatus, error) { - Raven.captureMessage('Error retrieving filebrowser', {extra: {url: urlFilesGrid, textStatus: textStatus, error: error}}); - } - - ); - - } - - // Tooltips - $('[data-toggle="tooltip"]').tooltip({container: 'body'}); - - // Tag input - var nodeType = window.contextVars.node.isRegistration ? 'registrations':'nodes'; - var tagsApiUrl = $osf.apiV2Url(nodeType + '/' + window.contextVars.node.id + '/'); - $('#node-tags').tagsInput({ - width: '100%', - interactive: window.contextVars.currentUser.canEditTags, - maxChars: 128, - defaultText: 'Add a tag to enhance discoverability', - onAddTag: function(tag) { - $('#node-tags_tag').attr('data-default', 'Add a tag'); - window.contextVars.node.tags.push(tag); - var payload = { - data: { - type: nodeType, - id: window.contextVars.node.id, - attributes: { - tags: window.contextVars.node.tags - } - } - }; - - var request = $osf.ajaxJSON( - 'PATCH', - tagsApiUrl, - { - data: payload, - isCors: true - } - ); - - request.fail(function(xhr, textStatus, error) { - window.contextVars.node.tags.splice(window.contextVars.node.tags.indexOf(tag),1); - Raven.captureMessage('Failed to add tag', { - extra: { - tag: tag, url: tagsApiUrl, textStatus: textStatus, error: error - } - }); - }); - }, - onRemoveTag: function(tag) { - if (!tag) { - return false; - } - window.contextVars.node.tags.splice(window.contextVars.node.tags.indexOf(tag),1); - var payload = { - data: { - type: nodeType, - id: window.contextVars.node.id, - attributes: { - tags: window.contextVars.node.tags - } - } - }; - - var request = $osf.ajaxJSON( - 'PATCH', - tagsApiUrl, - { - data: payload, - isCors: true - } - ); - - request.fail(function(xhr, textStatus, error) { - window.contextVars.node.tags.push(tag); - // Suppress "tag not found" errors, as the end result is what the user wanted (tag is gone)- eg could be because two people were working at same time - if (xhr.status !== 409) { - $osf.growl('Error', 'Could not remove tag'); - Raven.captureMessage('Failed to remove tag', { - extra: { - tag: tag, url: tagsApiUrl, textStatus: textStatus, error: error - } - }); - } - }); - } - }); - $('#node-tags_tag').attr('aria-label', 'Tags Input'); - - // allows inital default message to fit on empty tag - if(!$('.tag').length){ - $('#node-tags_tag').css('width', '250px'); - } - - $('#addPointer').on('shown.bs.modal', function(){ - if(!$osf.isIE()){ - $('#addPointer input').focus(); - } - }); - - // Limit the maximum length that you can type when adding a tag - $('#node-tags_tag').attr('maxlength', '128'); - - // Wiki widget markdown rendering - if (ctx.wikiWidget) { - // Render math in the wiki widget - var markdownElement = $('#markdownRender'); - mathrender.mathjaxify(markdownElement); - - // Render the raw markdown of the wiki - var request = $.ajax({ - url: ctx.urls.wikiContent - }); - request.done(function(resp) { - var rawText; - if(resp.wiki_content){ - rawText = resp.wiki_content; - } else if(window.contextVars.currentUser.canEdit) { - rawText = '*Add important information, links, or images here to describe your project.*'; - } else { - rawText = '*No wiki content.*'; - } - - var renderedText = ctx.renderedBeforeUpdate ? oldMd.render(rawText) : md.render(rawText); - // don't truncate the text when length = 400 - var truncatedText = $.truncate(renderedText, {length: 401}); - markdownElement.html(truncatedText); - mathrender.mathjaxify(markdownElement); - markdownElement.show(); - }); - } - - // Remove delete UI if not contributor - if (!window.contextVars.currentUser.canEditTags) { - $('a[title="Removing tag"]').remove(); - $('span.tag span').each(function(idx, elm) { - $(elm).text($(elm).text().replace(/\s*$/, '')); - }); - } - - // Show or hide collection details - if ($('.collection-details').length) { - $('.collection-details').each( function() { - var caret = '#' + $(this).attr('id') + '-toggle'; - $(this).on('hidden.bs.collapse', function(e) { - $(caret).removeClass('fa-angle-up') - .addClass('fa-angle-down'); - }).on('shown.bs.collapse', function(e) { - $(caret).removeClass('fa-angle-down') - .addClass('fa-angle-up'); - }); - }); - } -}); diff --git a/website/static/js/pages/wiki-edit-page.js b/website/static/js/pages/wiki-edit-page.js deleted file mode 100644 index f9f40ff918d..00000000000 --- a/website/static/js/pages/wiki-edit-page.js +++ /dev/null @@ -1,222 +0,0 @@ -'use strict'; - -var $ = require('jquery'); -var Raven = require('raven-js'); -require('bootstrap-editable'); -require('osf-panel'); - -var WikiPage = require('wikiPage'); - -require('ace-noconflict'); -require('ace-mode-markdown'); -require('ace-ext-language_tools'); -require('addons/wiki/static/ace-markdown-snippets.js'); -require('../../vendor/ace-plugins/spellcheck_ace.js'); - -var WikiMenu = require('../wikiMenu'); -var Comment = require('js/comment'); //jshint ignore:line -var $osf = require('js/osfHelpers'); - -var ctx = window.contextVars.wiki; // mako context variables - -var editable = (ctx.panelsUsed.indexOf('edit') !== -1); -var viewable = (ctx.panelsUsed.indexOf('view') !== -1); -var comparable = (ctx.panelsUsed.indexOf('compare') !== -1); -var menuVisible = (ctx.panelsUsed.indexOf('menu') !== -1); - -var viewVersion = ctx.versionSettings.view || (editable ? 'preview' : 'current'); -var compareVersion = ctx.versionSettings.compare || 'previous'; - -var wikiPageOptions = { - editVisible: editable, - viewVisible: viewable, - compareVisible: comparable, - menuVisible: menuVisible, - canEdit: ctx.canEdit, - viewVersion: viewVersion, - compareVersion: compareVersion, - urls: ctx.urls, - metadata: ctx.metadata -}; - -var wikiPage = new WikiPage('#wikiPageContext', wikiPageOptions); - - -// Edit wiki page name -if (ctx.canEditPageName) { - // Initialize editable wiki page name - var $pageName = $('#pageName'); - $.fn.editable.defaults.mode = 'inline'; - $pageName.editable({ - type: 'text', - send: 'always', - url: ctx.urls.rename, - ajaxOptions: { - type: 'put', - contentType: 'application/json', - dataType: 'json' - }, - validate: function(value) { - if($.trim(value) === ''){ - return 'The wiki page name cannot be empty.'; - } else if(value.length > 100){ - return 'The wiki page name cannot be more than 100 characters.'; - } - }, - params: function(params) { - return JSON.stringify(params); - }, - success: function(response, value) { - window.location.href = ctx.urls.base + encodeURIComponent(value) + '/'; - }, - error: function(response) { - var msg = response.responseJSON.message_long; - if (msg) { - return msg; - } else { - // Log unexpected error with Raven - Raven.captureMessage('Error in renaming wiki', { - extra: { - url: ctx.urls.rename, - responseText: response.responseText, - statusText: response.statusText - } - }); - return 'An unexpected error occurred. Please try again.'; - } - } - }); -} - -// Apply panels -$(document).ready(function () { - var errorMsg = $('#wikiErrorMessage'); - var grid = $('#grid'); - // Treebeard Wiki Menu - $.ajax({ - url: ctx.urls.grid - }) - .done(function (data) { - new WikiMenu(data, ctx.wikiID, ctx.canEdit); - }) - .fail(function(xhr, status, error) { - grid.addClass('hidden'); - errorMsg.removeClass('hidden'); - errorMsg.append('

Could not retrieve wiki pages. If this issue persists, ' + - 'please report it to ' + $osf.osfSupportLink()); - Raven.captureMessage('Could not GET wiki menu pages', { - extra: { url: ctx.urls.grid, status: status, error: error } - }); - }); - - var bodyElement = $('body'); - - $('*[data-osf-panel]').osfPanel({ - buttonElement : '.switch', - onSize : 'xs', - 'onclick' : function (event, title, buttonState, thisbtn, col) { - // this = all the column elements; an array - // title = Text of the button - // buttonState = the visibility of column after click, taen from data-osf-toggle attribute, - // thisbtn = $(this); - // col = the $() for the column this button links to - - // Determine if any columns are visible - var visibleColumns = this.filter(function (i, element) { - return $(element).is(':visible'); - }); - - if (visibleColumns.length === 0) { - thisbtn.click(); - return; - } - - bodyElement.trigger('togglePanel', [ - title.toLowerCase(), - buttonState - ]); - if (typeof editor !== 'undefined') { ace.edit(editor).resize(); } // jshint ignore: line - }, - complete : function() { - if (typeof editor !== 'undefined') { ace.edit(editor).resize(); } // jshint ignore: line - } - }); - - var panelToggle = $('.panel-toggle'); - var panelExpand = $('.panel-expand'); - $('.panel-collapse').on('click', function () { - var el = $(this).closest('.panel-toggle'); - el.children('.osf-panel').addClass('hidden'); - el.children('.osf-panel').addClass('visible-xs'); - panelToggle.removeClass('col-sm-3').addClass('col-sm-1'); - panelExpand.removeClass('col-sm-9').addClass('col-sm-11'); - el.children('.panel-collapsed').removeClass('hidden'); - el.children('.panel-collapsed').removeClass('visible-xs'); - $('.wiki-nav').removeClass('hidden'); - - bodyElement.trigger('toggleMenu', [false]); - }); - $('.panel-collapsed .panel-heading').on('click', function () { - var el = $(this).parent(); - var toggle = el.closest('.panel-toggle'); - toggle.children('.osf-panel').removeClass('hidden'); - toggle.children('.osf-panel').removeClass('visible-xs'); - el.addClass('hidden'); - panelToggle.removeClass('col-sm-1').addClass('col-sm-3'); - panelExpand.removeClass('col-sm-11').addClass('col-sm-9'); - $('.wiki-nav').addClass('hidden'); - bodyElement.trigger('toggleMenu', [true]); - }); - - // Tooltip - $('[data-toggle="tooltip"]').tooltip(); -}); - -var $comments = $('.comments'); -if ($comments.length && window.contextVars.wiki.wikiID !== null) { - var options = { - nodeId: window.contextVars.node.id, - nodeApiUrl: window.contextVars.node.urls.api, - isRegistration: window.contextVars.node.isRegistration, - page: 'wiki', - rootId: window.contextVars.wiki.wikiID, - fileId: null, - canComment: window.contextVars.currentUser.canComment, - currentUser: window.contextVars.currentUser, - pageTitle: window.contextVars.wiki.wikiName, - inputSelector: '.atwho-input' - }; - Comment.init('#commentsLink', '.comment-pane', options); -} - -// Disable backspace sending you back a page in firefox. This is just a usability fix because users -// tend to click out of the text box while it loads MFR embeds, then press backspace, believing the -// cursor is still active. -// https://stackoverflow.com/questions/1495219/how-can-i-prevent-the-backspace-key-from-navigating-back -$(document).unbind('keydown').bind('keydown', function (event) { - if (event.keyCode === 8) { - var doPrevent = true; - var types = ['text', 'password', 'file', 'search', 'email', 'number', 'date', 'color', 'datetime', 'datetime-local', 'month', 'range', 'search', 'tel', 'time', 'url', 'week']; - var d = $(event.srcElement || event.target); - var disabled = d.prop('readonly') || d.prop('disabled'); - if (!disabled) { - if (d[0].isContentEditable) { - doPrevent = false; - } else if (d.is('input')) { - var type = d.attr('type'); - if (type) { - type = type.toLowerCase(); - } - if (types.indexOf(type) > -1) { - doPrevent = false; - } - } else if (d.is('textarea')) { - doPrevent = false; - } - } - if (doPrevent) { - event.preventDefault(); - return false; - } - } -}); diff --git a/website/templates/project/project.mako b/website/templates/project/project.mako index edd88d87d65..111b6799ed1 100644 --- a/website/templates/project/project.mako +++ b/website/templates/project/project.mako @@ -842,4 +842,4 @@ ${parent.javascript_bottom()} % endfor - + \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 70f26dd5a2f..ed2280689a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,28 +7,6 @@ resolved "https://registry.yarnpkg.com/@centerforopenscience/list-of-licenses/-/list-of-licenses-1.1.0.tgz#2a4379633409205047e723e21cd818560a29ab45" integrity sha512-EGU7gpRXczqC4TAlfKBiLzRaopxxZkL86kwS8/qdZdmRjTpG872z+bRd5E4ZJivxHBLpVpts5nK/bz4MsbdhTA== -"@centerforopenscience/markdown-it-atrules@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@centerforopenscience/markdown-it-atrules/-/markdown-it-atrules-0.1.1.tgz#16616c0ac54bb29700f99a8aab76dd805b48ce59" - integrity sha512-r3ZTJESVCpdU9tOQe2PVcUkJmrPA/1itvCtHpsJrhXMj/nY7JcESjgMSFEe432DcofXDzRF8kXW1XWQuH1BfMw== - dependencies: - np "^3.0.4" - -"@centerforopenscience/markdown-it-imsize@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@centerforopenscience/markdown-it-imsize/-/markdown-it-imsize-2.0.1.tgz#bdfc7602bfffe9faeed9ee0278185535d8b001ae" - integrity sha512-PV6UGXJobGfJjt+H/A4wIOyrobjflVIrTYvE1RAQU/TTmCEVvnT5Os4TfziEWhKNfaB/IGRTphjQI8jDokPdjw== - -"@centerforopenscience/markdown-it-toc@~1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@centerforopenscience/markdown-it-toc/-/markdown-it-toc-1.1.1.tgz#633c6367cf783a51a080e75a9cd62fd62037e140" - integrity sha512-xzfwi99vziqpE8cEmcAWiSNGA2pCg/F5XO/GsWo89J1qzFt4udlOiqzW8+yjtfEPQhDY3KLB62QVN4yudeBUYA== - -"@centerforopenscience/markdown-it-video@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@centerforopenscience/markdown-it-video/-/markdown-it-video-1.0.0.tgz#4c1ab932ccb25c17a8992daa12168d0aea622664" - integrity sha512-6TOHqcRy7eg09aCcXLYCvLk87eMuFB8P1rBonpjJPcz++FQdEL5834c1Vq8vCePabKY2Scg3DNagRIblagXjXg== - "@centerforopenscience/osf-style@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@centerforopenscience/osf-style/-/osf-style-1.9.0.tgz#0ab5cb17e2c531aafcc19e226f36ff86b734116e" @@ -63,25 +41,6 @@ resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-3.0.2.tgz#275ab6bc04977e145b072ba18c24779eb3427073" integrity sha512-cmp/nT0pPC7HUALF8uc3+D5ECwEBWxYQbOIHwtGUWEu72sWtZc26k5onr920HWOViF0nYaC+Qzz6Ln56SQcaVg== -"@samverschueren/stream-to-observable@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz#a21117b19ee9be70c379ec1877537ef2e1c63301" - integrity sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ== - dependencies: - any-observable "^0.3.0" - -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - URIjs@^1.14.1: version "1.16.1" resolved "https://registry.yarnpkg.com/URIjs/-/URIjs-1.16.1.tgz#edebc678b8b74b26b05d2b481e12383f5ae04b8b" @@ -144,18 +103,6 @@ amdefine@>=0.0.4: resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= - dependencies: - string-width "^2.0.0" - -ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -178,11 +125,6 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -any-observable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" - integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== - aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -195,33 +137,6 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - asn1.js@^5.2.0: version "5.4.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" @@ -277,132 +192,6 @@ babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.0.0, babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-loader@^6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca" - integrity sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo= - dependencies: - find-cache-dir "^0.1.1" - loader-utils "^0.2.16" - mkdirp "^0.5.1" - object-assign "^4.0.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" @@ -483,19 +272,6 @@ bower@^1.8.8: resolved "https://registry.yarnpkg.com/bower/-/bower-1.8.13.tgz#5892f391f47134db88ea93d4c91a31f09792dc58" integrity sha512-8eWko16JlCTdaZZG70kddHPed17pHEbH8/IjfP4IFkQsfEqRsyNM09Dc8cDBFkSvtQ/2lTea7A+bMhRggG2a+Q== -boxen@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== - dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^2.0.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -602,11 +378,6 @@ builtin-status-codes@^3.0.0: resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= -builtins@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" - integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= - bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -638,34 +409,12 @@ cacache@^10.0.4: unique-filename "^1.1.0" y18n "^4.0.0" -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= - dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" - camelcase@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= -camelcase@^4.0.0, camelcase@^4.1.0: +camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= @@ -685,12 +434,7 @@ caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001312.tgz#efb31cb54e5f4714126d8c35292666c9b7290c87" integrity sha512-4eJfCSGxsF9JcQXBLdHclxkpLWv+Va7Y6QESYCWSdrR8b8x16TxUjCoOK/kU7SFC0BdcuK0nvt6ZkM59Q03LjQ== -capture-stack-trace@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" - integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== - -chalk@^1.0.0, chalk@^1.1.3: +chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -701,7 +445,7 @@ chalk@^1.0.0, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1: +chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -710,21 +454,11 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= - chownr@^1.0.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== - cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -740,31 +474,6 @@ clap@^1.0.9: dependencies: chalk "^1.1.3" -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= - -cli-cursor@^2.0.0, cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - -cli-truncate@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" - integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= - dependencies: - slice-ansi "0.0.4" - string-width "^1.0.1" - -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -774,13 +483,6 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" -clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= - dependencies: - mimic-response "^1.0.0" - clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -875,18 +577,6 @@ concat-stream@^1.5.0: readable-stream "^2.2.2" typedarray "^0.0.6" -configstore@^3.0.0: - version "3.1.5" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.5.tgz#e9af331fadc14dabd544d3e7e76dc446a09a530f" - integrity sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA== - dependencies: - dot-prop "^4.2.1" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" - console-browserify@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" @@ -902,13 +592,6 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.5.1: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - copy-anything@^2.0.1: version "2.0.6" resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" @@ -928,11 +611,6 @@ copy-concurrently@^1.0.0: rimraf "^2.5.4" run-queue "^1.0.0" -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -946,13 +624,6 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.5.3" -create-error-class@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= - dependencies: - capture-stack-trace "^1.0.0" - create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" @@ -985,17 +656,6 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -1013,17 +673,12 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= - css-color-names@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= -css-loader@^0.28.11, css-loader@~0.26.1: +css-loader@^0.28.11: version "0.28.11" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" integrity sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg== @@ -1102,13 +757,6 @@ csso@~2.3.1: clap "^1.0.9" source-map "^0.5.3" -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" @@ -1127,12 +775,7 @@ d@1, d@^1.0.1: es5-ext "^0.10.50" type "^1.0.1" -date-fns@^1.27.2: - version "1.30.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" - integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== - -debug@2.6.9, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -1146,53 +789,16 @@ debug@^3.2.6: dependencies: ms "^2.1.1" -decamelize-keys@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= -del@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" - integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= - dependencies: - globby "^6.1.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - p-map "^1.1.1" - pify "^3.0.0" - rimraf "^2.2.8" - depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -1206,13 +812,6 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" - diff@~5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" @@ -1232,22 +831,10 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -dot-prop@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" - integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== - dependencies: - is-obj "^1.0.0" - "dropzone@https://github.com/CenterForOpenScience/dropzone.git#aba21eb6b82cc823ac7a7a53d6e035791c082bae": version "4.3.0" resolved "https://github.com/CenterForOpenScience/dropzone.git#aba21eb6b82cc823ac7a7a53d6e035791c082bae" -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" @@ -1268,11 +855,6 @@ electron-to-chromium@^1.2.7: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz#17056914465da0890ce00351a3b946fd4cd51ff6" integrity sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw== -elegant-spinner@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" - integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= - elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -1313,11 +895,6 @@ enhanced-resolve@^3.4.0: object-assign "^4.0.1" tapable "^0.2.7" -entities@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" - integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== - errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" @@ -1325,7 +902,7 @@ errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -1462,19 +1039,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" - integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== - dependencies: - cross-spawn "^6.0.0" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -1503,15 +1067,6 @@ ext@^1.1.2: dependencies: type "^2.5.0" -external-editor@^2.0.4, external-editor@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" - integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - fast-deep-equal@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" @@ -1532,21 +1087,6 @@ fastparse@^1.1.2: resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== -figures@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - file-loader@^0.11.2: version "0.11.2" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.11.2.tgz#4ff1df28af38719a6098093b88c82c71d1794a34" @@ -1554,15 +1094,6 @@ file-loader@^0.11.2: dependencies: loader-utils "^1.0.2" -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" - integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= - dependencies: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" - find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" @@ -1572,14 +1103,6 @@ find-cache-dir@^1.0.0: make-dir "^1.0.0" pkg-dir "^2.0.0" -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -1600,15 +1123,6 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -font-awesome-webpack@0.0.5-beta.2: - version "0.0.5-beta.2" - resolved "https://registry.yarnpkg.com/font-awesome-webpack/-/font-awesome-webpack-0.0.5-beta.2.tgz#9ea5f22f0615d08e76d8db341563649a726286d6" - integrity sha1-nqXyLwYV0I522Ns0FWNkmnJihtY= - dependencies: - css-loader "~0.26.1" - less-loader "~2.2.3" - style-loader "~0.13.1" - from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" @@ -1647,31 +1161,12 @@ get-stream@^3.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -github-url-from-git@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" - integrity sha1-+YX+3MCpqledyI16/waNVcxiUaA= - glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.3, glob@^7.1.2, glob@^7.1.3: +glob@^7.1.2, glob@^7.1.3: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -1683,63 +1178,6 @@ glob@^7.0.3, glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -global-dirs@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= - dependencies: - ini "^1.3.4" - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -got@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - graceful-fs@^4.1.11, graceful-fs@^4.1.2: version "4.2.9" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" @@ -1772,11 +1210,6 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-yarn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-1.0.0.tgz#89e25db604b725c8f5976fff0addc921b828a5a7" - integrity sha1-ieJdtgS3Jcj1l2//Ct3JIbgopac= - has@^1.0.1, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -1815,14 +1248,6 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -1833,11 +1258,6 @@ html-comment-regex@^1.1.0: resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== -http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - http-errors@1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" @@ -1854,7 +1274,7 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -1888,11 +1308,6 @@ image-size@~0.5.0: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - imports-loader@^0.6.3: version "0.6.5" resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.6.5.tgz#ae74653031d59e37b3c2fb2544ac61aeae3530a6" @@ -1906,11 +1321,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -1939,72 +1349,16 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inquirer@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -inquirer@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" - integrity sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.1.0" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^5.5.2" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= -ip-regex@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" - integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== - is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" @@ -2015,13 +1369,6 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== - dependencies: - ci-info "^1.5.0" - is-core-module@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" @@ -2029,11 +1376,6 @@ is-core-module@^2.8.1: dependencies: has "^1.0.3" -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -2046,85 +1388,12 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-installed-globally@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= - dependencies: - global-dirs "^0.1.0" - is-path-inside "^1.0.0" - -is-npm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-observable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" - integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== - dependencies: - symbol-observable "^1.1.0" - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= - -is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= - dependencies: - path-is-inside "^1.0.1" - -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: +is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -is-promise@^2.1.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" - integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== - -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= - -is-retry-allowed@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - -is-scoped@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-scoped/-/is-scoped-1.0.0.tgz#449ca98299e713038256289ecb2b540dc437cb30" - integrity sha1-RJypgpnnEwOCViieyytUDcQ3yzA= - dependencies: - scoped-regex "^1.0.0" - -is-scoped@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-scoped/-/is-scoped-2.1.0.tgz#fef0713772658bdf5bee418608267ddae6d3566d" - integrity sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ== - dependencies: - scoped-regex "^2.0.0" - -is-stream@^1.0.0, is-stream@^1.1.0: +is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -2136,13 +1405,6 @@ is-svg@^2.0.0: dependencies: html-comment-regex "^1.1.0" -is-url-superb@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-3.0.0.tgz#b9a1da878a1ac73659047d1e6f4ef22c209d3e25" - integrity sha512-3faQP+wHCGDQT1qReM5zCPx2mxoal6DzbzquFlCYJLWyy4WPTved33ea2xFbX37z4NoriEwZGIYhFtx8RUB5wQ== - dependencies: - url-regex "^5.0.0" - is-what@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" @@ -2158,11 +1420,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -issue-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/issue-regex/-/issue-regex-2.0.0.tgz#bb1802490394f8083c7a6787247cbf975638ef5d" - integrity sha512-flaQ/45dMqCYSMzBQI/h3bcto6T70uN7kjNnI8n3gQU6no5p+QcnMWBNXkraED0YvbUymxKaqdvgPa09RZQM5A== - jquery-ui@>=1.10.4: version "1.13.1" resolved "https://registry.yarnpkg.com/jquery-ui/-/jquery-ui-1.13.1.tgz#d0b7a42e73a04c31bb5706adf86f6f8942f64eaa" @@ -2190,11 +1447,6 @@ js-md5@^0.7.3: resolved "https://registry.yarnpkg.com/js-md5/-/js-md5-0.7.3.tgz#b4f2fbb0b327455f598d6727e38ec272cd09c3f2" integrity sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ== -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" @@ -2208,26 +1460,11 @@ js-yaml@~3.7.0: argparse "^1.0.7" esprima "^2.6.0" -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= - json-loader@^0.5.4: version "0.5.7" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" @@ -2263,13 +1500,6 @@ keen-dataviz@^1.0.2: c3 "^0.4.18" d3 "^3.5.17" -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - knockout.validation@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/knockout.validation/-/knockout.validation-2.0.4.tgz#e87f82f41b5bdcb7029ea6be3fef2a903054558b" @@ -2280,26 +1510,12 @@ knockout@~3.4.2: resolved "https://registry.yarnpkg.com/knockout/-/knockout-3.4.2.tgz#e87958de77ad1e936f7ce645bab8b5d7c456d937" integrity sha1-6HlY3netHpNvfOZFuri118RW2Tc= -latest-version@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" - integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= - dependencies: - package-json "^4.0.0" - lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - -less-loader@~2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-2.2.3.tgz#b6d8f8139c8493df09d992a93a00734b08f84528" - integrity sha1-ttj4E5yEk98J2ZKpOgBzSwj4RSg= + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= dependencies: - loader-utils "^0.2.5" + invert-kv "^1.0.0" less@^4.1.2: version "4.1.2" @@ -2318,71 +1534,11 @@ less@^4.1.2: needle "^2.5.2" source-map "~0.6.0" -linkify-it@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" - integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== - dependencies: - uc.micro "^1.0.1" - linkifyjs@^3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-3.0.5.tgz#99e51a3a0c0e232fcb63ebb89eea3ff923378f34" integrity sha512-1Y9XQH65eQKA9p2xtk+zxvnTeQBG7rdAXSkUG97DmuI/Xhji9uaUzaWxRj6rf9YC0v8KKHkxav7tnLX82Sz5Fg== -listr-input@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/listr-input/-/listr-input-0.1.3.tgz#0c313967b6d179ebe964a81e9363ce2a5a39d25c" - integrity sha512-dvjSD1MrWGXxxPixpMQlSBmkyqhJrPxGo30un25k/vlvFOWZj70AauU+YkEh7CA8vmpkE6Wde37DJDmqYqF39g== - dependencies: - inquirer "^3.3.0" - rxjs "^5.5.2" - through "^2.3.8" - -listr-silent-renderer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" - integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= - -listr-update-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" - integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== - dependencies: - chalk "^1.1.3" - cli-truncate "^0.2.1" - elegant-spinner "^1.0.1" - figures "^1.7.0" - indent-string "^3.0.0" - log-symbols "^1.0.2" - log-update "^2.3.0" - strip-ansi "^3.0.1" - -listr-verbose-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" - integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== - dependencies: - chalk "^2.4.1" - cli-cursor "^2.1.0" - date-fns "^1.27.2" - figures "^2.0.0" - -listr@^0.14.1: - version "0.14.3" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" - integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== - dependencies: - "@samverschueren/stream-to-observable" "^0.3.0" - is-observable "^1.1.0" - is-promise "^2.1.0" - is-stream "^1.1.0" - listr-silent-renderer "^1.1.1" - listr-update-renderer "^0.5.0" - listr-verbose-renderer "^0.5.0" - p-map "^2.0.0" - rxjs "^6.3.3" - load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" @@ -2393,22 +1549,12 @@ load-json-file@^2.0.0: pify "^2.0.0" strip-bom "^3.0.0" -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - loader-runner@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@0.2.x, loader-utils@^0.2.16, loader-utils@^0.2.5: +loader-utils@0.2.x: version "0.2.17" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= @@ -2485,64 +1631,11 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash.zip@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" - integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= - -lodash@^4.17.14, lodash@^4.17.4, lodash@^4.3.0: +lodash@^4.17.14: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= - dependencies: - chalk "^1.0.0" - -log-symbols@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" - -log-update@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" - integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= - dependencies: - ansi-escapes "^3.0.0" - cli-cursor "^2.0.0" - wrap-ansi "^3.0.1" - -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - lru-cache@^4.0.1, lru-cache@^4.1.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -2566,37 +1659,6 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= - -markdown-it-ins-del@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/markdown-it-ins-del/-/markdown-it-ins-del-0.1.1.tgz#8b421d8e788ee84a1d572eb3fcc0028ce431c9ea" - integrity sha1-i0IdjniO6EodVy6z/MACjOQxyeo= - -markdown-it-sanitizer@~0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/markdown-it-sanitizer/-/markdown-it-sanitizer-0.4.3.tgz#2ba34e9fe16e6372ce7192fb50b37d9dfbff0102" - integrity sha1-K6NOn+FuY3LOcZL7ULN9nfv/AQI= - -markdown-it@~12.3.2: - version "12.3.2" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90" - integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg== - dependencies: - argparse "^2.0.1" - entities "~2.1.0" - linkify-it "^3.0.1" - mdurl "^1.0.1" - uc.micro "^1.0.5" - math-expression-evaluator@^1.2.14: version "1.3.14" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.3.14.tgz#0ebeaccf65fea0f6f5a626f88df41814e5fcd9bf" @@ -2611,11 +1673,6 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -mdurl@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= - media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -2636,21 +1693,6 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" -meow@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" - integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - yargs-parser "^10.0.0" - miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -2693,11 +1735,6 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -2715,14 +1752,6 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" @@ -2783,11 +1812,6 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - needle@^2.5.2: version "2.9.1" resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" @@ -2802,11 +1826,6 @@ next-tick@~1.0.0: resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - node-libs-browser@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" @@ -2836,7 +1855,7 @@ node-libs-browser@^2.0.0: util "^0.11.0" vm-browserify "^1.0.1" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: +normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -2861,52 +1880,6 @@ normalize-url@^1.4.0: query-string "^4.1.0" sort-keys "^1.0.0" -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -np@^3.0.4: - version "3.1.0" - resolved "https://registry.yarnpkg.com/np/-/np-3.1.0.tgz#f83437459164c529fad801937c201488e319931d" - integrity sha512-3HTje97SzbsvK9g61C72PpDk9AloaaTn0K7xHbx7jMrs9vJtCZqu7TWUGxrcYGiKRO/uFRn5SiRZfYB/gpL9Iw== - dependencies: - "@samverschueren/stream-to-observable" "^0.3.0" - any-observable "^0.3.0" - chalk "^2.3.0" - del "^3.0.0" - execa "^0.10.0" - github-url-from-git "^1.5.0" - has-yarn "^1.0.0" - inquirer "^5.2.0" - is-scoped "^1.0.0" - issue-regex "^2.0.0" - listr "^0.14.1" - listr-input "^0.1.1" - log-symbols "^2.1.0" - meow "^5.0.0" - npm-name "^5.0.0" - p-timeout "^2.0.1" - read-pkg-up "^3.0.0" - rxjs "^6.2.0" - semver "^5.2.0" - split "^1.0.0" - terminal-link "^1.1.0" - update-notifier "^2.1.0" - -npm-name@^5.0.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/npm-name/-/npm-name-5.5.0.tgz#3a73adbcb0488a41a44ff820ed51dcc32c72bd09" - integrity sha512-l7/uyVfEi2e3ho+ovaJZC0xlbwzXNUz3RxkxpfcnLuoGKAuYoo9YoJ/uy18PsTD8IziugGHks4t/mGmBJEZ4Qg== - dependencies: - got "^9.6.0" - is-scoped "^2.1.0" - is-url-superb "^3.0.0" - lodash.zip "^4.2.0" - registry-auth-token "^4.0.0" - registry-url "^5.1.0" - validate-npm-package-name "^3.0.0" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -2948,23 +1921,11 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" @@ -2974,16 +1935,6 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -3003,38 +1954,11 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" -p-map@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" - integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== - -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-timeout@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" - integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== - dependencies: - p-finally "^1.0.0" - p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= -package-json@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= - dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" - pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" @@ -3067,14 +1991,6 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - parse-node-version@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" @@ -3085,29 +2001,17 @@ path-browserify@0.0.1: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -path-key@^2.0.0, path-key@^2.0.1: +path-key@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= @@ -3124,13 +2028,6 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - pbkdf2@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" @@ -3162,25 +2059,6 @@ pikaday@^1.3.2: resolved "https://registry.yarnpkg.com/pikaday/-/pikaday-1.8.2.tgz#72cc73fab7ccc068cbdf7dcaa1ce400fcfd894e3" integrity sha512-TNtsE+34BIax3WtkB/qqu5uepV1McKYEgvL3kWzU7aqPCpMEN6rBF3AOwu4WCwAealWlBGobXny/9kJb49C1ew== -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= - dependencies: - find-up "^1.0.0" - pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" @@ -3472,26 +2350,16 @@ postcss@^6.0.1: source-map "^0.6.1" supports-color "^5.4.0" -prepend-http@^1.0.0, prepend-http@^1.0.1: +prepend-http@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - pretty-data@^0.40.0: version "0.40.0" resolved "https://registry.yarnpkg.com/pretty-data/-/pretty-data-0.40.0.tgz#572aa8ea23467467ab94b6b5266a6fd9c8fddd72" integrity sha1-Vyqo6iNGdGerlLa1Jmpv2cj93XI= -private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -3537,14 +2405,6 @@ pump@^2.0.0, pump@^2.0.1: end-of-stream "^1.1.0" once "^1.3.1" -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - pumpify@^1.3.3: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" @@ -3597,11 +2457,6 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= - randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -3632,16 +2487,6 @@ raw-loader@~0.5.0: resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" integrity sha1-DD0L6u2KAclm2Xh793goElKpeao= -rc@^1.0.1, rc@^1.1.6, rc@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" @@ -3650,14 +2495,6 @@ read-pkg-up@^2.0.0: find-up "^2.0.0" read-pkg "^2.0.0" -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" @@ -3667,15 +2504,6 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -3698,14 +2526,6 @@ readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= - dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" - reduce-css-calc@^1.2.6: version "1.3.0" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" @@ -3722,47 +2542,6 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^1.0.0" -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -registry-auth-token@^3.0.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" - integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-auth-token@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" - integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== - dependencies: - rc "^1.2.8" - -registry-url@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= - dependencies: - rc "^1.0.1" - -registry-url@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -3782,22 +2561,7 @@ resolve@^1.10.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= - dependencies: - lowercase-keys "^1.0.0" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.2: +rimraf@^2.5.4, rimraf@^2.6.2: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -3812,11 +2576,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -run-async@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -3824,32 +2583,6 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= - -rxjs@^5.5.2: - version "5.5.12" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" - integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== - dependencies: - symbol-observable "1.0.1" - -rxjs@^6.2.0, rxjs@^6.3.3: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -3894,29 +2627,12 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -scoped-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-1.0.0.tgz#a346bb1acd4207ae70bd7c0c7ca9e566b6baddb8" - integrity sha1-o0a7Gs1CB65wvXwMfKnlZra63bg= - -scoped-regex@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-2.1.0.tgz#7b9be845d81fd9d21d1ec97c61a0b7cf86d2015f" - integrity sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ== - select2@3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/select2/-/select2-3.5.1.tgz#f2819489bbc65fd6d328be72bbe2b95dd7e87cfe" integrity sha1-8oGUibvGX9bTKL5yu+K5XdfofP4= -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= - dependencies: - semver "^5.0.3" - -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.2.0, semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -3961,21 +2677,11 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.0: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= - sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" @@ -3988,13 +2694,6 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - source-map@0.1.x: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" @@ -4002,7 +2701,7 @@ source-map@0.1.x: dependencies: amdefine ">=0.0.4" -source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.3, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -4038,13 +2737,6 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== -split@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== - dependencies: - through "2" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -4108,7 +2800,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -4154,17 +2846,7 @@ strip-eof@^1.0.0: resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -style-loader@^0.23.1, style-loader@~0.13.1: +style-loader@^0.23.1: version "0.23.1" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== @@ -4191,21 +2873,13 @@ supports-color@^4.2.1: dependencies: has-flag "^2.0.0" -supports-color@^5.0.0, supports-color@^5.3.0, supports-color@^5.4.0: +supports-color@^5.3.0, supports-color@^5.4.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" -supports-hyperlinks@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" - integrity sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw== - dependencies: - has-flag "^2.0.0" - supports-color "^5.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -4224,36 +2898,11 @@ svgo@^0.7.0: sax "~1.2.1" whet.extend "~0.9.9" -symbol-observable@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" - integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= - -symbol-observable@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - tapable@^0.2.7: version "0.2.9" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8" integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A== -term-size@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= - dependencies: - execa "^0.7.0" - -terminal-link@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-1.3.0.tgz#3e9a308289e13340053aaf40e8f1a06d1335646e" - integrity sha512-nFaWG/gs3brGi3opgWU2+dyFGbQ7tueSRYOBOD8URdDXCbAGqDEZzuskCc+okCClYcJFDPwn8e2mbv4FqAnWFA== - dependencies: - ansi-escapes "^3.2.0" - supports-hyperlinks "^1.0.1" - through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -4262,16 +2911,6 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@2, through@^2.3.6, through@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -timed-out@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - timers-browserify@^2.0.4: version "2.0.12" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" @@ -4279,33 +2918,11 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" -tlds@^1.203.0: - version "1.229.0" - resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.229.0.tgz#fd02585a234669d47a7f1752c87f100a34feba60" - integrity sha512-yZCodKInN+BPGUyYgKHsodJ2FVWRjW/fYx6rKCAT/e24BBJd8FcxWgKD0aBgk+7uQ/88h/fmRTd4Nvzxf3313A== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= - -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" @@ -4320,21 +2937,6 @@ toidentifier@1.0.1: jquery-ui ">=1.10.4" mithril ">=0.2" -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - -tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - tslib@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" @@ -4375,11 +2977,6 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -uc.micro@^1.0.1, uc.micro@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" - integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== - uglify-es@^3.3.4: version "3.3.9" resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" @@ -4426,39 +3023,11 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= - dependencies: - crypto-random-string "^1.0.0" - unpipe@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= - -update-notifier@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" - integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== - dependencies: - boxen "^1.2.1" - chalk "^2.0.1" - configstore "^3.0.0" - import-lazy "^2.1.0" - is-ci "^1.0.10" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -4475,28 +3044,6 @@ url-loader@~0.6.2: mime "^1.4.1" schema-utils "^0.3.0" -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - -url-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-5.0.0.tgz#8f5456ab83d898d18b2f91753a702649b873273a" - integrity sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g== - dependencies: - ip-regex "^4.1.0" - tlds "^1.203.0" - url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -4537,13 +3084,6 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -validate-npm-package-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= - dependencies: - builtins "^1.0.3" - vendors@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" @@ -4615,13 +3155,6 @@ which@^1.2.9: dependencies: isexe "^2.0.0" -widest-line@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" - integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== - dependencies: - string-width "^2.1.1" - worker-farm@^1.5.2: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -4637,33 +3170,11 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" -wrap-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" - integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^2.0.0: - version "2.4.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= - xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -4684,13 +3195,6 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yargs-parser@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== - dependencies: - camelcase "^4.1.0" - yargs-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" From 3cefffe4c63a03bdd75c84407af3040a28078d3d Mon Sep 17 00:00:00 2001 From: antkryt Date: Wed, 11 Mar 2026 20:22:48 +0200 Subject: [PATCH 25/31] [ENG-10384] return 409 when submit to closed registry (#11628) --- api/draft_registrations/permissions.py | 31 +++++++++++++++++++ api/draft_registrations/views.py | 2 ++ api/nodes/views.py | 6 +++- .../views/test_draft_registration_list.py | 26 ++++++++++++++++ 4 files changed, 64 insertions(+), 1 deletion(-) diff --git a/api/draft_registrations/permissions.py b/api/draft_registrations/permissions.py index 5232ee9d546..fb6829aafa0 100644 --- a/api/draft_registrations/permissions.py +++ b/api/draft_registrations/permissions.py @@ -1,11 +1,13 @@ from rest_framework import permissions +from api.base.exceptions import Conflict from api.base.utils import get_user_auth, assert_resource_type from osf.models import ( DraftRegistration, AbstractNode, DraftRegistrationContributor, OSFUser, + RegistrationProvider, ) from api.nodes.permissions import ContributorDetailPermissions from osf.utils.permissions import WRITE, ADMIN @@ -90,3 +92,32 @@ def has_object_permission(self, request, view, obj): elif isinstance(obj, AbstractNode): return obj.has_permission(auth.user, WRITE) return False + + +class CanSubmitDraftRegistrationToProvider(permissions.BasePermission): + """ + Prevent creating draft registrations for providers that are closed to submissions. + """ + + def has_permission(self, request, view): + if request.method != 'POST': + return True + + provider_id = request.data.get('provider') + + if not provider_id: + try: + provider = RegistrationProvider.get_default() + except RegistrationProvider.DoesNotExist: + return True + else: + try: + provider = RegistrationProvider.objects.get(_id=provider_id) + except RegistrationProvider.DoesNotExist: + # Let existing validation handle bad provider ids. + return True + + if not provider.allow_submissions: + raise Conflict(f"Registry {provider.name} is closed for new submissions. Please start a new registration with a different registry.") + + return True diff --git a/api/draft_registrations/views.py b/api/draft_registrations/views.py index 30c583dd94a..88a266c9ab6 100644 --- a/api/draft_registrations/views.py +++ b/api/draft_registrations/views.py @@ -8,6 +8,7 @@ DraftContributorDetailPermissions, DraftRegistrationPermission, IsAdminContributor, + CanSubmitDraftRegistrationToProvider, ) from api.draft_registrations.serializers import ( DraftRegistrationSerializer, @@ -53,6 +54,7 @@ class DraftRegistrationList(NodeDraftRegistrationsList): drf_permissions.IsAuthenticatedOrReadOnly, base_permissions.TokenHasScope, DraftRegistrationPermission, + CanSubmitDraftRegistrationToProvider, ) view_category = 'draft_registrations' diff --git a/api/nodes/views.py b/api/nodes/views.py index 69c7fa7d25e..51648d365cd 100644 --- a/api/nodes/views.py +++ b/api/nodes/views.py @@ -74,7 +74,10 @@ NodeCommentSerializer, ) from api.draft_registrations.serializers import DraftRegistrationSerializer, DraftRegistrationDetailSerializer -from api.draft_registrations.permissions import DraftRegistrationPermission +from api.draft_registrations.permissions import ( + DraftRegistrationPermission, + CanSubmitDraftRegistrationToProvider, +) from api.files.serializers import FileSerializer, OsfStorageFileSerializer from api.files import annotations as file_annotations from api.identifiers.serializers import NodeIdentifierSerializer @@ -671,6 +674,7 @@ class NodeDraftRegistrationsList(JSONAPIBaseView, generics.ListCreateAPIView, No DraftRegistrationPermission, drf_permissions.IsAuthenticatedOrReadOnly, base_permissions.TokenHasScope, + CanSubmitDraftRegistrationToProvider, ) parser_classes = (JSONAPIMultipleRelationshipsParser, JSONAPIMultipleRelationshipsParserForRegularJSON) diff --git a/api_tests/draft_registrations/views/test_draft_registration_list.py b/api_tests/draft_registrations/views/test_draft_registration_list.py index 4aed087605a..c2c0cce084c 100644 --- a/api_tests/draft_registrations/views/test_draft_registration_list.py +++ b/api_tests/draft_registrations/views/test_draft_registration_list.py @@ -399,6 +399,19 @@ def test_affiliated_institutions_are_copied_from_user(self, app, user, url_draft draft_registration = DraftRegistration.load(res.json['data']['id']) assert list(draft_registration.affiliated_institutions.all()) == list(user.get_affiliated_institutions()) + def test_cannot_create_draft_when_provider_disallows_submissions( + self, app, user, provider, payload, url_draft_registrations): + provider.allow_submissions = False + provider.save() + + res = app.post_json_api( + url_draft_registrations, + payload, + auth=user.auth, + expect_errors=True, + ) + assert res.status_code == 409 + class TestDraftRegistrationCreateWithoutNode(AbstractDraftRegistrationTestCase): @pytest.fixture() @@ -451,6 +464,19 @@ def test_create_draft_with_provider( draft = DraftRegistration.load(data['id']) assert draft.provider == non_default_provider + def test_cannot_create_draft_when_provider_disallows_submissions( + self, app, user, url_draft_registrations, non_default_provider, payload_with_non_default_provider): + non_default_provider.allow_submissions = False + non_default_provider.save() + + res = app.post_json_api( + url_draft_registrations, + payload_with_non_default_provider, + auth=user.auth, + expect_errors=True, + ) + assert res.status_code == 409 + def test_write_contrib(self, app, user, project_public, payload, url_draft_registrations, user_write_contrib): """(no node supplied, so any logged in user can create) """ From 981ef4a0639ee339715fa7c994aca8feef281c33 Mon Sep 17 00:00:00 2001 From: Yuhuai Liu Date: Thu, 19 Mar 2026 16:52:12 -0400 Subject: [PATCH 26/31] Merge develop into Feature/pbs 26 2 (#11642) * [ENG-10083] Add type<-->is_digest "relation" and update subscription (#11575) * Add is_digest_type property to NotificationType and log message in emit method * Fix is_digest handling in NotificationType.emit method * Log message update in NotificationType.emit method for is_digest handling * fix unit tests --------- Co-authored-by: Ostap Zherebetskyi * Add notification subscriptions de-duplication v2 command (#11576) Co-authored-by: Ostap Zherebetskyi * [ENG-10190][ENG-10214] Permanently update a couple of templates to match admin/admin changes Update archive_size_exceeded_user and provider_reviews_resubmission_confirmation templates * Update changelog and bump version * Exclude spam and deleted Registration from queryset (#11572) * [ENG-10135] - Fix/eng 10135 (#11587) * Exclude spam and deleted Registration from queryset * Update RegistrationActionList to check deleted flag * Fix tests * Fix test * Feature/fair signposting (#11599) * linkset initial implementation * linkset initial implementation (updating data extraction and adding serialization) * and \n in EOF instead of % * update code * get file mediatype from metadata * add unittests for linkset approach (TODO: ?) * update code * update code and unit tests and * update file related code and unit tests * refactor code after CR | implement 'describes' | check file type differs from parent project / registry / preprint * update files to compare on unittests run * implement datacite - scheme type mapping for linkset draft version (need tests updates and maybe some type yield logic ) * Update osf/metadata/osf_gathering.py Co-authored-by: abram axel booth * Update osf/metadata/serializers/linkset.py Co-authored-by: abram axel booth * implement datacite - schema mapping * update tests expected results * resolve CR * refactor code | resolve CR * remove redundant describes from file response (#11590) * [ENG-10256] 2.1.9 BE: Fix permission issue where users without permission to an object can access the metadata (#11588) * Fix permission issue where users without permission to an object can access the metadata (add decorator is_contributor_or_public_resource) * refactor code * resolve CR | refactor code * resolve CR | add unittests * add *args, **kwargs for decorated view * [ENG-10167] 2.1.6 BE: add link header to guid metadata endpoints (#11594) * add link header to guid metadata endpoints for registry and project * update code * avoid Component Registration/Project JSON Contains type: null (#11597) * [ENG-10168] 2.1.7 BE: add link header to cedar metadata records endpoints (#11596) * add link header to guid metadata endpoints for registry and project * update code * add link header to cedar metadata records endpoints * change ResearchProject for CreativeWork for projects (#11603) * [ENG-10169] 2.1.8 BE: add link header to file download URL (#11600) * avoid Component Registration/Project JSON Contains type: null * add link header to file download URL * update unittests * resolve CR --------- Co-authored-by: mkovalua Co-authored-by: abram axel booth * Bump versio no. Add CHANGELOG * [ENG-10054] feature/ror-migration (#11610) * feat(osf): script to migrate Crossref Funder IDs to ROR IDs * feat(osf): Fix fot the script to migrate Crossref Funder IDs to ROR IDs * feat(osf): Update OSF metadata model code and tests for ROR funder identifier support * feat(osf): Add DataCite client tests for ROR funder identifier support * feat(osf): update migration script to remove unmapped crossref funders * add another stat to the migration script --------- Co-authored-by: Andriy Sheredko * bump version & update changelog * add command to migrate ror funder names * bump version & update changelog * [ENG-10538] Post-NR Project PR (#11623) * Create global_file_updated and global_reviews subscriptions if missing * Use USER_FILE_UPDATED for group global_file_updated * Use REVIEWS_SUBMISSION_STATUS for group global_reviews * Add missing `is_digest=True` for new OSF user subscriptions * Extend otf subscription creation to apply to _node_file_updated group * Fix typo for `_is_digest` * add is_digest_type property * Add is_digest_type property to NotificationType and log message in emit method * Fix is_digest handling in NotificationType.emit method * Log message update in NotificationType.emit method for is_digest handling * fix unit tests * Move set-deafult-subscriptions out of non-effective try-except * Add fake_sent field to Notification model and update notification creation logic * add unique_together constraint * Add 'PARTIAL_SUCCESS' status to EmailTask model and update email task handling logic * NR migration [ENG-10040, ENG-10025, ENG-9854] * Remove subscription if notifications.tasks.send_moderator_email_task fails with permission error * Apply suggestion from @Ostap-Zherebetskyi * remove datetime * Add 'no_login_email_last_sent' field to OSFUser and update email task logic * Enforce and improve permission check for subscriptions * Fix typo in annotated_obj_qs for NODE_FILE_UPDATED * Add unit tests for testing node_file_updated subscription detail * Implement notifications cleanup task and related settings; add tests for functionality * Fix legacy subscription ID for NODE_FILE_UPDATED: "guid_files_updated" * Fix duplicate and mismatched type NODE_FILE(S)_UPDATED * removed email.py * Fix annotated qs for global reviews and update unit tests * Update tests for node_file(s)_updated subscription detail * Rename fixtures for notification subscription detail tests * Annotate with legacy_id for serializer to handle created subscriptions * Add unit tests for creating missing subscriptions on the fly * clear useless code * Rename migration name for NR post-release * Improve unit test: test_emit_frequency_none * Remove `seen` from `Notification` and re-make migrations * `mark_sent()` now handles `fake_sent=True`, and only `save()` once * Update default settings * remove useless import * Enhance SubscriptionList queryset with additional content types and refactor notification type handling * fix unit test * Refactor SubscriptionList queryset to use a single provider content type and update related notification handling; add script to update notification subscriptions' content types. * fix CR comments * Update comments * split into 3 files * remove populate_notification_subscriptions * Renamed files, refactor of populate notification subscriptions user global file updated * added try/except, added timers * converted populate_notification_subscriptions_user_global_reviews.py * fix batch time execution * converted populate_notification_subscriptions_node_file_updated * convert to separate update and create scripts * updated, added parameters * move to remove_after_use * add time track to last batch, fix proper time track for batch in node_file_updated * convert to use review_nt * Fix unit tests due to new constraints * Move missing subscription creation to a helper function in utils * Subscription list view now creates missing attributes on-the-fly * Note: only works for when filter on "legacy id"; logs message to sentry for tracking purpose when filter on "event names". * Fix broken `.exists()` due to complex annotated QS with `.distinct()` * fix names of tasks * Add notification subscriptions de-duplication v2 command * fix naming * Add deduplication command to notification migration * Fix notification handling by updating legacy ID suffix from '_files_updated' to '_file_updated' across utils and views; adjust related test cases accordingly. * fix unit tests * Update the name of the NotificationType NODE_FILE_UPDATED to be consistent * Rename notification type from node_files_updated to node_file_updated for consistency * clean keys * fix naming in templates, event_context * remove leftover comments * Refactor notification type references to use NotificationTypeEnum - Updated all instances of NotificationType.Type to NotificationTypeEnum in test files and application code. - Ensured consistency in notification type usage across various tests including auth, claims, events, and more. - This change improves clarity and maintainability by standardizing the notification type references. * Fix notification type reference for FILE_UPDATED * Refactor notification type references to use NotificationTypeEnum across views and scripts * fix unit tests * remove imports * fix USER_CROSSREF_DOI_PENDING event_context * sync naming * added explanation * Add Celery task to disable removed beat tasks from PeriodicTask entries * Apply suggestion from @Ostap-Zherebetskyi * Apply suggestion from @cslzchen * Add migrations to remove duplicate notification subscriptions and refactor notification model * removed comment * Refactor no-login email filtering to ensure last sent date is before last login date * Add test to exclude users logged in before no_login_email_last_sent * Refactor no-login email user filtering to exclude those with pending EmailTasks and recent no-login emails * Fix CollectionSubmission URLs to use absolute_url method for consistency * Refactor logo handling in notification methods to improve consistency and readability * Add management command to sync notification templates * Apply suggestion from @cslzchen * Add management command for deleting withdrawn or failed registration files to CeleryConfig * fix: update logo handling in send_moderator_email_task for favicon support --------- Co-authored-by: Longze Chen Co-authored-by: Ostap Zherebetskyi Co-authored-by: Bohdan Odintsov * Updated cut-off time and added comments for NR settings * Update changelog and bump version * resolve merge conflicts * respond to CR comments * fix tests * fix tests again --------- Co-authored-by: Longze Chen Co-authored-by: Ostap Zherebetskyi Co-authored-by: Vlad0n20 <137097005+Vlad0n20@users.noreply.github.com> Co-authored-by: futa-ikeda <51409893+futa-ikeda@users.noreply.github.com> Co-authored-by: mkovalua Co-authored-by: abram axel booth Co-authored-by: Fitz Elliott Co-authored-by: Andriy Sheredko Co-authored-by: Bohdan Odintsov --- CHANGELOG | 32 ++ addons/base/views.py | 16 +- addons/boa/tasks.py | 10 +- addons/boa/tests/test_tasks.py | 4 +- addons/osfstorage/tests/test_models.py | 4 +- addons/osfstorage/tests/test_views.py | 10 +- admin/management/urls.py | 4 +- admin/management/views.py | 9 + admin/providers/views.py | 4 +- admin/templates/management/commands.html | 13 + admin/users/views.py | 5 +- admin_tests/preprints/test_views.py | 4 +- admin_tests/users/test_views.py | 10 +- api/cedar_metadata_records/views.py | 11 +- api/crossref/views.py | 4 +- api/institutions/authentication.py | 13 +- api/nodes/views.py | 10 +- api/preprints/serializers.py | 4 +- api/providers/serializers.py | 6 +- api/providers/tasks.py | 16 +- api/providers/views.py | 4 + api/registrations/views.py | 6 +- api/requests/serializers.py | 7 +- api/subscriptions/utils.py | 82 +++ api/subscriptions/views.py | 257 +++++---- api/users/serializers.py | 5 +- api/users/services.py | 7 +- api/users/views.py | 16 +- api_tests/actions/views/test_action_list.py | 6 +- api_tests/base/test_throttling.py | 4 +- .../test_record_metadata_download_get.py | 5 + ...est_collection_submissions_actions_list.py | 24 +- .../views/test_crossref_email_response.py | 4 +- ...est_draft_registration_contributor_list.py | 8 +- .../views/test_draft_registration_list.py | 6 +- api_tests/guids/views/test_guid_detail.py | 16 +- .../test_institution_relationship_nodes.py | 8 +- .../provider/test_collection_submission.py | 10 +- ...est_collections_provider_moderator_list.py | 8 +- api_tests/mailhog/provider/test_preprints.py | 22 +- api_tests/mailhog/provider/test_reviewable.py | 8 +- .../mailhog/provider/test_schema_responses.py | 28 +- .../mailhog/provider/test_submissions.py | 15 +- api_tests/mailhog/test_mailhog.py | 6 +- .../views/test_node_contributors_list.py | 8 +- .../nodes/views/test_node_detail_update.py | 4 +- api_tests/nodes/views/test_node_forks_list.py | 28 +- api_tests/nodes/views/test_node_list.py | 14 +- .../test_node_relationship_institutions.py | 38 +- .../notifications/test_notification_digest.py | 43 +- .../test_notifications_cleanup.py | 189 ++++++ .../test_notifications_db_transaction.py | 27 +- .../views/test_preprint_contributors_list.py | 14 +- .../views/test_preprint_detail_update.py | 8 +- ...est_collections_provider_moderator_list.py | 8 +- .../test_preprint_provider_moderator_list.py | 4 +- api_tests/providers/tasks/test_bulk_upload.py | 8 +- .../test_node_request_institutional_access.py | 42 +- ...de_request_institutional_access_logging.py | 6 +- .../requests/views/test_node_request_list.py | 12 +- .../views/test_request_actions_create.py | 14 +- api_tests/share/test_share_preprint.py | 71 +-- .../views/test_subscriptions_detail.py | 266 +++++++-- .../views/test_subscriptions_list.py | 14 +- api_tests/users/views/test_user_claim.py | 22 +- api_tests/users/views/test_user_confirm.py | 4 +- api_tests/users/views/test_user_list.py | 8 +- .../test_user_message_institutional_access.py | 6 +- api_tests/users/views/test_user_settings.py | 4 +- .../test_user_settings_reset_password.py | 4 +- framework/auth/campaigns.py | 16 +- framework/auth/decorators.py | 23 + framework/auth/views.py | 22 +- notifications.yaml | 137 +---- notifications/file_event_notifications.py | 21 +- notifications/listeners.py | 23 +- notifications/tasks.py | 100 ++-- osf/admin.py | 2 +- .../commands/check_crossref_dois.py | 6 +- .../commands/deactivate_requested_accounts.py | 8 +- osf/management/commands/find_spammy_files.py | 4 +- .../commands/migrate_funder_ids_to_ror.py | 349 +++++++++++ .../commands/migrate_funder_names_to_ror.py | 307 ++++++++++ .../commands/migrate_notifications.py | 10 +- ...duplicate_notification_subscriptions_v2.py | 94 +++ .../send_storage_exceeded_announcement.py | 5 +- osf/metadata/osf_gathering.py | 15 +- osf/metadata/rdfutils.py | 48 +- osf/metadata/schemas/datacite.json | 4 + osf/metadata/serializers/__init__.py | 3 + .../datacite/datacite_tree_walker.py | 16 +- osf/metadata/serializers/linkset.py | 153 +++++ ...duplicate_notification_subscriptions_v2.py | 27 + ...0037_notification_refactor_post_release.py | 37 ++ osf/models/__init__.py | 2 +- osf/models/collection_submission.py | 93 ++- osf/models/email_task.py | 2 + osf/models/institution.py | 4 +- osf/models/mixins.py | 29 +- osf/models/node.py | 8 +- osf/models/notification.py | 15 +- osf/models/notification_subscription.py | 52 +- osf/models/notification_type.py | 352 ++++++------ osf/models/preprint.py | 11 +- osf/models/provider.py | 8 +- osf/models/registrations.py | 6 +- osf/models/sanctions.py | 18 +- osf/models/schema_response.py | 10 +- osf/models/user.py | 6 +- osf/models/user_message.py | 4 +- osf/utils/machines.py | 12 +- osf/utils/notifications.py | 21 +- .../test_migrate_funder_ids_to_ror.py | 415 ++++++++++++++ .../test_migrate_notifications.py | 33 +- .../file_basic.linkset | 9 + .../file_basic.linkset.json | 48 ++ .../expected_metadata_files/file_full.linkset | 9 + .../file_full.linkset.json | 48 ++ .../expected_metadata_files/file_full.turtle | 8 +- .../preprint_basic.linkset | 10 + .../preprint_basic.linkset.json | 51 ++ .../preprint_full.linkset | 12 + .../preprint_full.linkset.json | 51 ++ .../preprint_full.turtle | 8 +- .../project_basic.linkset | 11 + .../project_basic.linkset.json | 57 ++ .../project_full.datacite.json | 11 +- .../project_full.datacite.xml | 6 +- .../project_full.linkset | 12 + .../project_full.linkset.json | 62 ++ .../project_full.turtle | 8 +- .../registration_basic.linkset | 11 + .../registration_basic.linkset.json | 57 ++ .../registration_full.linkset | 12 + .../registration_full.linkset.json | 62 ++ .../registration_full.turtle | 8 +- osf_tests/metadata/test_osf_gathering.py | 10 + .../metadata/test_serialized_metadata.py | 30 +- osf_tests/test_archiver.py | 18 +- osf_tests/test_collection.py | 4 +- osf_tests/test_collection_submission.py | 34 +- osf_tests/test_institution.py | 8 +- .../test_institutional_admin_contributors.py | 8 +- osf_tests/test_merging_users.py | 4 +- osf_tests/test_node.py | 6 +- ...t_registration_moderation_notifications.py | 8 +- osf_tests/test_reviewable.py | 6 +- osf_tests/test_schema_responses.py | 32 +- osf_tests/test_user.py | 4 +- package.json | 2 +- pyproject.toml | 2 +- scripts/disable_removed_beat_tasks.py | 24 + scripts/osfstorage/usage_audit.py | 4 +- .../populate_notification_subscriptions.py | 113 ---- ...e_notification_subscription_provider_ct.py | 31 + ...ication_subscriptions_node_file_updated.py | 128 +++++ ..._subscriptions_user_global_file_updated.py | 111 ++++ ...ation_subscriptions_user_global_reviews.py | 104 ++++ scripts/stuck_registration_audit.py | 5 +- .../test_deactivate_requested_accounts.py | 6 +- .../tests/test_populate_new_and_noteworthy.py | 1 + scripts/triggered_mails.py | 35 +- tests/identifiers/test_datacite.py | 147 ++++- tests/test_add_contributiors_subscriptions.py | 22 +- tests/test_adding_contributor_views.py | 30 +- tests/test_auth.py | 63 +- tests/test_auth_views.py | 6 +- tests/test_claim_views.py | 20 +- tests/test_events.py | 50 +- tests/test_forgot_password.py | 6 +- tests/test_misc_views.py | 6 +- tests/test_preprints.py | 6 +- tests/test_registrations/test_retractions.py | 6 +- tests/test_registrations/test_views.py | 2 +- tests/test_resend_confirmation.py | 4 +- tests/test_spam_mixin.py | 4 +- tests/test_triggered_mails.py | 55 +- tests/test_user_profile_view.py | 4 +- tests/utils.py | 4 +- website/archiver/utils.py | 62 +- website/mailchimp_utils.py | 16 +- website/notifications/__init__.py | 0 website/notifications/constants.py | 39 -- website/notifications/emails.py | 243 -------- website/notifications/utils.py | 479 ---------------- website/notifications/views.py | 540 ------------------ website/profile/views.py | 8 +- website/project/views/contributor.py | 42 +- website/reviews/listeners.py | 12 +- website/routes.py | 46 +- website/settings/defaults.py | 29 +- website/settings/local-ci.py | 4 +- .../archive_size_exceeded_user.html.mako | 2 +- website/templates/invite_default.html.mako | 2 +- ...est_institutional_access_request.html.mako | 2 +- ...eviews_resubmission_confirmation.html.mako | 4 +- website/views.py | 13 +- 197 files changed, 4581 insertions(+), 2854 deletions(-) create mode 100644 api/subscriptions/utils.py create mode 100644 api_tests/notifications/test_notifications_cleanup.py create mode 100644 osf/management/commands/migrate_funder_ids_to_ror.py create mode 100644 osf/management/commands/migrate_funder_names_to_ror.py create mode 100644 osf/management/commands/remove_duplicate_notification_subscriptions_v2.py create mode 100644 osf/metadata/serializers/linkset.py create mode 100644 osf/migrations/0036_remove_duplicate_notification_subscriptions_v2.py create mode 100644 osf/migrations/0037_notification_refactor_post_release.py create mode 100644 osf_tests/management_commands/test_migrate_funder_ids_to_ror.py create mode 100644 osf_tests/metadata/expected_metadata_files/file_basic.linkset create mode 100644 osf_tests/metadata/expected_metadata_files/file_basic.linkset.json create mode 100644 osf_tests/metadata/expected_metadata_files/file_full.linkset create mode 100644 osf_tests/metadata/expected_metadata_files/file_full.linkset.json create mode 100644 osf_tests/metadata/expected_metadata_files/preprint_basic.linkset create mode 100644 osf_tests/metadata/expected_metadata_files/preprint_basic.linkset.json create mode 100644 osf_tests/metadata/expected_metadata_files/preprint_full.linkset create mode 100644 osf_tests/metadata/expected_metadata_files/preprint_full.linkset.json create mode 100644 osf_tests/metadata/expected_metadata_files/project_basic.linkset create mode 100644 osf_tests/metadata/expected_metadata_files/project_basic.linkset.json create mode 100644 osf_tests/metadata/expected_metadata_files/project_full.linkset create mode 100644 osf_tests/metadata/expected_metadata_files/project_full.linkset.json create mode 100644 osf_tests/metadata/expected_metadata_files/registration_basic.linkset create mode 100644 osf_tests/metadata/expected_metadata_files/registration_basic.linkset.json create mode 100644 osf_tests/metadata/expected_metadata_files/registration_full.linkset create mode 100644 osf_tests/metadata/expected_metadata_files/registration_full.linkset.json create mode 100644 scripts/disable_removed_beat_tasks.py delete mode 100644 scripts/populate_notification_subscriptions.py create mode 100644 scripts/remove_after_use/merge_notification_subscription_provider_ct.py create mode 100644 scripts/remove_after_use/populate_notification_subscriptions_node_file_updated.py create mode 100644 scripts/remove_after_use/populate_notification_subscriptions_user_global_file_updated.py create mode 100644 scripts/remove_after_use/populate_notification_subscriptions_user_global_reviews.py delete mode 100644 website/notifications/__init__.py delete mode 100644 website/notifications/constants.py delete mode 100644 website/notifications/emails.py delete mode 100644 website/notifications/utils.py delete mode 100644 website/notifications/views.py diff --git a/CHANGELOG b/CHANGELOG index e78571a3001..10515a802f1 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,38 @@ We follow the CalVer (https://calver.org/) versioning scheme: YY.MINOR.MICRO. +26.5.0 (2026-03-13) +=================== + +- Notification refactor post-release project (Post-NR) + +26.4.1 (2026-03-01) +=================== + +- Add script to update ROR funder names + +26.4.0 (2026-02-26) +=================== + +- Transition funder ids from CrossRef to ROR + +26.3.0 (2026-02-24) +=================== + +- FAIR Signposting + +26.2.1 (2026-02-09) +=================== + +- Permanently update two notification types +- Link digest to types and fix/log incorrect usage +- Update notifiction dedupe command + +26.2.0 +====== + +- TODO: add date and log + 26.1.6 (2026-01-14) =================== diff --git a/addons/base/views.py b/addons/base/views.py index 22009cc1d9e..8b4097244b3 100644 --- a/addons/base/views.py +++ b/addons/base/views.py @@ -51,7 +51,7 @@ DraftRegistration, Guid, FileVersionUserMetadata, - FileVersion, NotificationType + FileVersion, NotificationTypeEnum ) from osf.metrics import PreprintView, PreprintDownload from osf.utils import permissions @@ -575,14 +575,13 @@ def create_waterbutler_log(payload, **kwargs): if payload.get('email') or payload.get('errors'): if payload.get('email'): - notification_type = NotificationType.Type.USER_FILE_OPERATION_SUCCESS.instance + notification_type = NotificationTypeEnum.USER_FILE_OPERATION_SUCCESS.instance if payload.get('errors'): - notification_type = NotificationType.Type.USER_FILE_OPERATION_FAILED.instance + notification_type = NotificationTypeEnum.USER_FILE_OPERATION_FAILED.instance notification_type.emit( user=user, subscribed_object=node, event_context={ - 'user_fullname': user.fullname, 'action': payload['action'], 'source_node': source_node._id, 'source_node_title': source_node.title, @@ -1035,9 +1034,12 @@ def persistent_file_download(auth, **kwargs): query_params = request.args.to_dict() - return redirect( - file.generate_waterbutler_url(**query_params), - code=http_status.HTTP_302_FOUND + return make_response( + '', http_status.HTTP_302_FOUND, { + 'Location': file.generate_waterbutler_url(**query_params), + 'Link': f'<{settings.DOMAIN}metadata/{id_or_guid}/?format=linkset> ; rel="linkset" ; type="application/linkset",' + f' <{settings.DOMAIN}metadata/{id_or_guid}/?format=linkset-json"> ; rel="linkset-json" ; type="application/linkset+json"', + } ) diff --git a/addons/boa/tasks.py b/addons/boa/tasks.py index 283867d8489..afbb89f8961 100644 --- a/addons/boa/tasks.py +++ b/addons/boa/tasks.py @@ -14,7 +14,7 @@ from addons.boa.boa_error_code import BoaErrorCode from framework import sentry from framework.celery_tasks import app as celery_app -from osf.models import OSFUser, NotificationType +from osf.models import OSFUser, NotificationTypeEnum from osf.utils.fields import ensure_str, ensure_bytes from website import settings as osf_settings @@ -183,18 +183,15 @@ async def submit_to_boa_async(host, username, password, user_guid, project_guid, logger.info('Successfully uploaded query output to OSF.') logger.debug('Task ends <<<<<<<<') - NotificationType.Type.ADDONS_BOA_JOB_COMPLETE.instance.emit( + NotificationTypeEnum.ADDONS_BOA_JOB_COMPLETE.instance.emit( user=user, event_context={ 'user_fullname': user.fullname, - 'query_file_name': query_file_name, 'query_file_full_path': file_full_path, 'output_file_name': output_file_name, 'job_id': boa_job.id, 'project_url': project_url, 'boa_job_list_url': boa_settings.BOA_JOB_LIST_URL, - 'boa_support_email': boa_settings.BOA_SUPPORT_EMAIL, - 'osf_support_email': osf_settings.OSF_SUPPORT_EMAIL, } ) return BoaErrorCode.NO_ERROR @@ -209,12 +206,11 @@ def handle_boa_error(message, code, username, fullname, project_url, query_file_ sentry.log_message(message, skip_session=True) except Exception: pass - NotificationType.Type.ADDONS_BOA_JOB_FAILURE.instance.emit( + NotificationTypeEnum.ADDONS_BOA_JOB_FAILURE.instance.emit( destination_address=username, event_context={ 'user_fullname': fullname, 'code': code, - 'query_file_name': query_file_name, 'file_size': file_size, 'message': message, 'max_file_size': boa_settings.MAX_SUBMISSION_SIZE, diff --git a/addons/boa/tests/test_tasks.py b/addons/boa/tests/test_tasks.py index 814dc3e2f57..38cc6eba11d 100644 --- a/addons/boa/tests/test_tasks.py +++ b/addons/boa/tests/test_tasks.py @@ -9,7 +9,7 @@ from addons.boa import settings as boa_settings from addons.boa.boa_error_code import BoaErrorCode from addons.boa.tasks import submit_to_boa, submit_to_boa_async, handle_boa_error -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf_tests.factories import AuthUserFactory, ProjectFactory from tests.base import OsfTestCase from tests.utils import capture_notifications @@ -66,7 +66,7 @@ def test_handle_boa_error(self): job_id=self.job_id ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.ADDONS_BOA_JOB_FAILURE + assert notifications['emits'][0]['type'] == NotificationTypeEnum.ADDONS_BOA_JOB_FAILURE mock_sentry_log_message.assert_called_with(self.error_message, skip_session=True) mock_logger_error.assert_called_with(self.error_message) assert return_value == BoaErrorCode.UNKNOWN diff --git a/addons/osfstorage/tests/test_models.py b/addons/osfstorage/tests/test_models.py index 9fbae6a7fa8..e3972ef04af 100644 --- a/addons/osfstorage/tests/test_models.py +++ b/addons/osfstorage/tests/test_models.py @@ -9,7 +9,7 @@ from framework.auth import Auth from addons.osfstorage.models import OsfStorageFile, OsfStorageFileNode, OsfStorageFolder -from osf.models import BaseFileNode, NotificationType +from osf.models import BaseFileNode, NotificationTypeEnum from osf.exceptions import ValidationError from osf.utils.permissions import WRITE, ADMIN @@ -750,7 +750,7 @@ def test_after_fork_copies_versions(self, node, node_settings, auth_obj): fork = node.fork_node(auth_obj) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT fork_node_settings = fork.get_addon('osfstorage') fork_node_settings.reload() diff --git a/addons/osfstorage/tests/test_views.py b/addons/osfstorage/tests/test_views.py index 16d928e3343..825b68b2671 100644 --- a/addons/osfstorage/tests/test_views.py +++ b/addons/osfstorage/tests/test_views.py @@ -1539,11 +1539,19 @@ def test_download_file(self): # Test download works with path url = base_url.format(file._id) redirect = self.app.get(url, auth=self.user.auth) + link_header = (f'<{settings.DOMAIN}metadata/{file._id}/?format=linkset> ; rel="linkset" ; type="application/linkset", ' + f'<{settings.DOMAIN}metadata/{file._id}/?format=linkset-json"> ; rel="linkset-json" ; type="application/linkset+json"') + assert link_header == redirect.headers['Link'] assert redirect.status_code == 302 # Test download works with guid - url = base_url.format(file.get_guid(create=True)._id) + guid = file.get_guid(create=True)._id + url = base_url.format(guid) redirect = self.app.get(url, auth=self.user.auth) + link_header = ( + f'<{settings.DOMAIN}metadata/{guid}/?format=linkset> ; rel="linkset" ; type="application/linkset", ' + f'<{settings.DOMAIN}metadata/{guid}/?format=linkset-json"> ; rel="linkset-json" ; type="application/linkset+json"') + assert link_header == redirect.headers['Link'] assert redirect.status_code == 302 # Test nonexistent file 404's diff --git a/admin/management/urls.py b/admin/management/urls.py index 6b84a854598..d583deb2ce0 100644 --- a/admin/management/urls.py +++ b/admin/management/urls.py @@ -17,5 +17,7 @@ re_path(r'^ingest_cedar_metadata_templates', views.IngestCedarMetadataTemplates.as_view(), name='ingest_cedar_metadata_templates'), re_path(r'^bulk_resync', views.BulkResync.as_view(), name='bulk-resync'), re_path(r'^empty_metadata_dataarchive_registration_bulk_resync', views.EmptyMetadataDataarchiveRegistrationBulkResync.as_view(), - name='empty-metadata-dataarchive-registration-bulk-resync') + name='empty-metadata-dataarchive-registration-bulk-resync'), + re_path(r'^sync_notification_templates', views.SyncNotificationTemplates.as_view(), + name='sync_notification_templates') ] diff --git a/admin/management/views.py b/admin/management/views.py index d97e4f4b894..36f3d893f24 100644 --- a/admin/management/views.py +++ b/admin/management/views.py @@ -11,6 +11,7 @@ from osf.management.commands.monthly_reporters_go import monthly_reporters_go from osf.management.commands.fetch_cedar_metadata_templates import ingest_cedar_metadata_templates from osf.management.commands.sync_doi_metadata import sync_doi_metadata, sync_doi_empty_metadata_dataarchive_registrations +from osf.management.commands.populate_notification_types import populate_notification_types from scripts.find_spammy_content import manage_spammy_content from django.urls import reverse from django.shortcuts import redirect @@ -172,3 +173,11 @@ def post(self, request): }) messages.success(request, 'Resyncing with DataCite! It will take some time.') return redirect(reverse('management:commands')) + + +class SyncNotificationTemplates(ManagementCommandPermissionView): + + def post(self, request): + populate_notification_types() + messages.success(request, 'Notification templates have been successfully synced.') + return redirect(reverse('management:commands')) diff --git a/admin/providers/views.py b/admin/providers/views.py index 20f8383dc69..ae0d74a05f8 100644 --- a/admin/providers/views.py +++ b/admin/providers/views.py @@ -1,7 +1,7 @@ from django.shortcuts import redirect from django.views.generic import TemplateView from django.contrib import messages -from osf.models import RegistrationProvider, OSFUser, CollectionProvider, NotificationType +from osf.models import RegistrationProvider, OSFUser, CollectionProvider, NotificationTypeEnum from website.settings import DOMAIN @@ -63,7 +63,7 @@ def post(self, request, *args, **kwargs): context['provider_url'] = f'{provider.domain or DOMAIN}{provider_type_word}/{(provider._id if not provider.domain else '').strip('/')}' messages.success(request, f'The following {target_type} was successfully added: {target_user.fullname} ({target_user.username})') - notification_type = NotificationType.Type.PROVIDER_MODERATOR_ADDED + notification_type = NotificationTypeEnum.PROVIDER_MODERATOR_ADDED notification_type.instance.emit( user=target_user, event_context=context, diff --git a/admin/templates/management/commands.html b/admin/templates/management/commands.html index c596e876b1c..dd90affd5ff 100644 --- a/admin/templates/management/commands.html +++ b/admin/templates/management/commands.html @@ -152,6 +152,19 @@

Resync empty metadata dataarchive registrations with DataCite

+
+

Sync Notification Templates

+

+ Use this management command to sync notification templates. Warning: existing templates modifications via django admin will be overridden if they haven't been updated in code. In addition, templates are cached for 2 hours so changes won't be effective immediately. +

+
+ {% csrf_token %} + + +
{% endblock %} diff --git a/admin/users/views.py b/admin/users/views.py index ff7c2078e63..be5f6a6d684 100644 --- a/admin/users/views.py +++ b/admin/users/views.py @@ -20,7 +20,7 @@ from osf.models.base import Guid from osf.models.user import OSFUser from osf.models.spam import SpamStatus -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from framework.auth import get_user from framework.auth.core import generate_verification_key from osf.models.institution import Institution @@ -186,12 +186,11 @@ def post(self, request, *args, **kwargs): message=f'User account {user.pk} disabled', action_flag=USER_REMOVED ) - NotificationType.Type.USER_REQUEST_DEACTIVATION_COMPLETE.instance.emit( + NotificationTypeEnum.USER_REQUEST_DEACTIVATION_COMPLETE.instance.emit( user=user, event_context={ 'user_fullname': user.fullname, 'contact_email': OSF_SUPPORT_EMAIL, - 'can_change_preferences': False, } ) else: diff --git a/admin_tests/preprints/test_views.py b/admin_tests/preprints/test_views.py index 2cdcda136d1..efd571a5772 100644 --- a/admin_tests/preprints/test_views.py +++ b/admin_tests/preprints/test_views.py @@ -8,7 +8,7 @@ from django.contrib.messages.storage.fallback import FallbackStorage from tests.base import AdminTestCase -from osf.models import Preprint, PreprintLog, PreprintRequest, NotificationType +from osf.models import Preprint, PreprintLog, PreprintRequest, NotificationTypeEnum from framework.auth import Auth from osf_tests.factories import ( AuthUserFactory, @@ -719,7 +719,7 @@ def test_can_unwithdraw_preprint_without_moderation_workflow(self, withdrawal_re machine_state=DefaultStates.INITIAL.value) withdrawal_request.run_submit(admin) - with assert_notification(type=NotificationType.Type.PREPRINT_REQUEST_WITHDRAWAL_APPROVED): + with assert_notification(type=NotificationTypeEnum.PREPRINT_REQUEST_WITHDRAWAL_APPROVED): withdrawal_request.run_accept(admin, withdrawal_request.comment) assert preprint.machine_state == 'withdrawn' diff --git a/admin_tests/users/test_views.py b/admin_tests/users/test_views.py index a10a2af7d00..c913a8e2347 100644 --- a/admin_tests/users/test_views.py +++ b/admin_tests/users/test_views.py @@ -27,7 +27,7 @@ from admin.users.forms import UserSearchForm, MergeUserForm from osf.models.admin_log_entry import AdminLogEntry from tests.utils import assert_notification, capture_notifications -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum pytestmark = pytest.mark.django_db @@ -105,7 +105,7 @@ def test_correct_view_permissions(self): response = views.ResetPasswordView.as_view()(request, guid=guid) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_FORGOT_PASSWORD + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_FORGOT_PASSWORD self.assertEqual(response.status_code, 302) @@ -168,7 +168,7 @@ def setUp(self): def test_disable_user(self): settings.ENABLE_EMAIL_SUBSCRIPTIONS = False count = AdminLogEntry.objects.count() - with assert_notification(type=NotificationType.Type.USER_REQUEST_DEACTIVATION_COMPLETE, user=self.user): + with assert_notification(type=NotificationTypeEnum.USER_REQUEST_DEACTIVATION_COMPLETE, user=self.user): self.view().post(self.request) self.user.reload() assert self.user.is_disabled @@ -176,7 +176,7 @@ def test_disable_user(self): def test_reactivate_user(self): settings.ENABLE_EMAIL_SUBSCRIPTIONS = False - with assert_notification(type=NotificationType.Type.USER_REQUEST_DEACTIVATION_COMPLETE, user=self.user): + with assert_notification(type=NotificationTypeEnum.USER_REQUEST_DEACTIVATION_COMPLETE, user=self.user): self.view().post(self.request) count = AdminLogEntry.objects.count() self.view().post(self.request) @@ -206,7 +206,7 @@ def test_correct_view_permissions(self): change_permission = Permission.objects.get(codename='change_osfuser') user.user_permissions.add(change_permission) user.save() - with assert_notification(type=NotificationType.Type.USER_REQUEST_DEACTIVATION_COMPLETE, user=user): + with assert_notification(type=NotificationTypeEnum.USER_REQUEST_DEACTIVATION_COMPLETE, user=user): request = RequestFactory().post(reverse('users:disable', kwargs={'guid': guid})) request.user = user diff --git a/api/cedar_metadata_records/views.py b/api/cedar_metadata_records/views.py index 86eec237804..33ae361334f 100644 --- a/api/cedar_metadata_records/views.py +++ b/api/cedar_metadata_records/views.py @@ -19,8 +19,8 @@ CedarMetadataRecordsDetailSerializer, ) from framework.auth.oauth_scopes import CoreScopes - -from osf.models import CedarMetadataRecord +from osf.models import CedarMetadataRecord, Node, Registration +from website import settings logger = logging.getLogger(__name__) @@ -99,5 +99,10 @@ def get_serializer_class(self): def get(self, request, *args, **kwargs): record = self.get_object() + is_referent_project_or_registration = isinstance(record.guid.referent, (Node, Registration)) file_name = f'{record._id}-{record.get_template_name()}-v{record.get_template_version()}.json' - return Response(record.metadata, headers={'Content-Disposition': f'attachment; filename={file_name}'}) + headers = {'Content-Disposition': f'attachment; filename={file_name}'} + if is_referent_project_or_registration: + guid_id = record.guid._id + headers['link'] = f'<{settings.DOMAIN}{guid_id}/>; rel="describes"; type="text/html"' + return Response(record.metadata, headers=headers) diff --git a/api/crossref/views.py b/api/crossref/views.py index 333ce1e48f7..9baeb37d562 100644 --- a/api/crossref/views.py +++ b/api/crossref/views.py @@ -6,7 +6,7 @@ from rest_framework.views import APIView from api.crossref.permissions import RequestComesFromMailgun -from osf.models import Preprint, NotificationType +from osf.models import Preprint, NotificationTypeEnum from website import settings from website.preprints.tasks import mint_doi_on_crossref_fail @@ -78,7 +78,7 @@ def post(self, request): if unexpected_errors: batch_id = crossref_email_content.find('batch_id').text email_error_text = request.POST['body-plain'] - NotificationType.Type.DESK_CROSSREF_ERROR.instance.emit( + NotificationTypeEnum.DESK_CROSSREF_ERROR.instance.emit( destination_address=settings.OSF_SUPPORT_EMAIL, event_context={ 'batch_id': batch_id, diff --git a/api/institutions/authentication.py b/api/institutions/authentication.py index 7824b3380a4..ed7ad96d857 100644 --- a/api/institutions/authentication.py +++ b/api/institutions/authentication.py @@ -21,7 +21,7 @@ from osf import features from osf.exceptions import InstitutionAffiliationStateError -from osf.models import Institution, NotificationType +from osf.models import Institution, NotificationTypeEnum from osf.models.institution import SsoFilterCriteriaAction from website.settings import OSF_SUPPORT_EMAIL, DOMAIN @@ -348,11 +348,10 @@ def authenticate(self, request): user.save() # Send confirmation email for all three: created, confirmed and claimed - NotificationType.Type.USER_WELCOME_OSF4I.instance.emit( + NotificationTypeEnum.USER_WELCOME_OSF4I.instance.emit( user=user, event_context={ 'domain': DOMAIN, - 'osf_support_email': OSF_SUPPORT_EMAIL, 'user_fullname': user.fullname, 'storage_flag_is_active': flag_is_active(request, features.STORAGE_I18N), }, @@ -363,14 +362,12 @@ def authenticate(self, request): if email_to_add: assert not is_created and email_to_add == sso_email user.emails.create(address=email_to_add) - NotificationType.Type.USER_ADD_SSO_EMAIL_OSF4I.instance.emit( + NotificationTypeEnum.USER_ADD_SSO_EMAIL_OSF4I.instance.emit( user=user, event_context={ 'user_fullname': user.fullname, 'email_to_add': email_to_add, - 'domain': DOMAIN, 'osf_support_email': OSF_SUPPORT_EMAIL, - 'storage_flag_is_active': flag_is_active(request, features.STORAGE_I18N), }, save=False, ) @@ -383,17 +380,15 @@ def authenticate(self, request): duplicate_user.remove_sso_identity_from_affiliation(institution) if secondary_institution: duplicate_user.remove_sso_identity_from_affiliation(secondary_institution) - NotificationType.Type.USER_DUPLICATE_ACCOUNTS_OSF4I.instance.emit( + NotificationTypeEnum.USER_DUPLICATE_ACCOUNTS_OSF4I.instance.emit( user=user, subscribed_object=user, event_context={ 'user_fullname': user.fullname, 'user_username': user.username, 'user__id': user._id, - 'duplicate_user_fullname': duplicate_user.fullname, 'duplicate_user_username': duplicate_user.username, 'duplicate_user__id': duplicate_user._id, - 'domain': DOMAIN, 'osf_support_email': OSF_SUPPORT_EMAIL, }, ) diff --git a/api/nodes/views.py b/api/nodes/views.py index 51648d365cd..931220a6f88 100644 --- a/api/nodes/views.py +++ b/api/nodes/views.py @@ -161,7 +161,7 @@ Preprint, Collection, Contributor, - NotificationType, + NotificationTypeEnum, ) from addons.osfstorage.models import Region from osf.utils.permissions import ADMIN, WRITE_NODE @@ -1093,26 +1093,22 @@ def perform_create(self, serializer): try: fork = serializer.save(node=node) except Exception as exc: - NotificationType.Type.NODE_FORK_FAILED.instance.emit( + NotificationTypeEnum.NODE_FORK_FAILED.instance.emit( user=user, subscribed_object=node, event_context={ - 'domain': settings.DOMAIN, 'node_title': node.title, - 'can_change_preferences': False, }, ) raise exc - NotificationType.Type.NODE_FORK_COMPLETED.instance.emit( + NotificationTypeEnum.NODE_FORK_COMPLETED.instance.emit( user=user, subscribed_object=node, event_context={ 'domain': settings.DOMAIN, 'node_title': node.title, - 'fork_title': fork.title, 'fork__id': fork._id, - 'can_change_preferences': False, }, ) diff --git a/api/preprints/serializers.py b/api/preprints/serializers.py index 82223d4e2ae..b901aa093f3 100644 --- a/api/preprints/serializers.py +++ b/api/preprints/serializers.py @@ -50,7 +50,7 @@ PreprintProvider, Node, NodeLicense, - NotificationType, + NotificationTypeEnum, ) from osf.utils import permissions as osf_permissions from osf.utils.workflows import DefaultStates @@ -481,7 +481,7 @@ def update(self, preprint, validated_data): preprint, contributor=author, auth=auth, - notification_type=NotificationType.Type.PREPRINT_CONTRIBUTOR_ADDED_DEFAULT, + notification_type=NotificationTypeEnum.PREPRINT_CONTRIBUTOR_ADDED_DEFAULT, ) return preprint diff --git a/api/providers/serializers.py b/api/providers/serializers.py index 17b77346ced..7431d221fef 100644 --- a/api/providers/serializers.py +++ b/api/providers/serializers.py @@ -10,7 +10,7 @@ from api.preprints.serializers import PreprintProviderRelationshipField from api.providers.workflows import Workflows from api.base.metrics import MetricsSerializerMixin -from osf.models import CitationStyle, NotificationType, RegistrationProvider, CollectionProvider +from osf.models import CitationStyle, NotificationTypeEnum, RegistrationProvider, CollectionProvider from osf.models.user import Email, OSFUser from osf.models.validators import validate_email from osf.utils.permissions import REVIEW_GROUPS, ADMIN @@ -390,9 +390,9 @@ def create(self, validated_data): provider.add_to_group(user, perm_group) setattr(user, 'permission_group', perm_group) # Allows reserialization if 'claim_url' in context: - notification_type = NotificationType.Type.PROVIDER_CONFIRM_EMAIL_MODERATION + notification_type = NotificationTypeEnum.PROVIDER_CONFIRM_EMAIL_MODERATION else: - notification_type = NotificationType.Type.PROVIDER_MODERATOR_ADDED + notification_type = NotificationTypeEnum.PROVIDER_MODERATOR_ADDED notification_type.instance.emit( user=user, event_context=context, diff --git a/api/providers/tasks.py b/api/providers/tasks.py index a3b89cb9dc4..4f19821b540 100644 --- a/api/providers/tasks.py +++ b/api/providers/tasks.py @@ -27,7 +27,7 @@ RegistrationProvider, RegistrationSchema, Subject, - NotificationType, + NotificationTypeEnum, ) from osf.models.licenses import NodeLicense from osf.models.registration_bulk_upload_job import JobState @@ -137,7 +137,7 @@ def prepare_for_registration_bulk_creation(payload_hash, initiator_id, provider_ # Cancel the preparation task if duplicates are found in the CSV and/or in DB if draft_error_list: upload.delete() - NotificationType.Type.REGISTRATION_BULK_UPLOAD_FAILURE_DUPLICATES.instance.emit( + NotificationTypeEnum.REGISTRATION_BULK_UPLOAD_FAILURE_DUPLICATES.instance.emit( user=initiator, event_context={ 'user_fullname': initiator.fullname, @@ -639,11 +639,11 @@ def bulk_upload_finish_job(upload, row_count, success_count, draft_errors, appro if not dry_run: upload.save() if upload.state == JobState.DONE_FULL: - notification_type = NotificationType.Type.USER_REGISTRATION_BULK_UPLOAD_SUCCESS_ALL + notification_type = NotificationTypeEnum.USER_REGISTRATION_BULK_UPLOAD_SUCCESS_ALL elif upload.state == JobState.DONE_PARTIAL: - notification_type = NotificationType.Type.USER_REGISTRATION_BULK_UPLOAD_SUCCESS_PARTIAL + notification_type = NotificationTypeEnum.USER_REGISTRATION_BULK_UPLOAD_SUCCESS_PARTIAL elif upload.state == JobState.DONE_ERROR: - notification_type = NotificationType.Type.USER_REGISTRATION_BULK_UPLOAD_FAILURE_ALL + notification_type = NotificationTypeEnum.USER_REGISTRATION_BULK_UPLOAD_FAILURE_ALL else: logger.error(f'Unexpected job state for upload [{upload.id}]: {upload.state.name}') sentry.log_message(f'Unexpected job state for upload [{upload.id}]: {upload.state.name}') @@ -653,13 +653,11 @@ def bulk_upload_finish_job(upload, row_count, success_count, draft_errors, appro user=initiator, event_context={ 'user_fullname': initiator.fullname, - 'initiator_fullname': initiator.fullname, 'auto_approval': auto_approval, 'count': row_count, 'total': row_count, 'pending_submissions_url': f'{get_registration_provider_submissions_url(provider)}?status=pending', 'draft_errors': draft_errors, - 'approval_errors': approval_errors, 'successes': success_count, 'failures': len(draft_errors), 'osf_support_email': settings.OSF_SUPPORT_EMAIL, @@ -680,7 +678,7 @@ def handle_internal_error(initiator=None, provider=None, message=None, dry_run=T if not dry_run: if initiator: - NotificationType.Type.DESK_USER_REGISTRATION_BULK_UPLOAD_UNEXPECTED_FAILURE.instance.emit( + NotificationTypeEnum.DESK_USER_REGISTRATION_BULK_UPLOAD_UNEXPECTED_FAILURE.instance.emit( user=initiator, event_context={ 'initiator_fullname': initiator.fullname, @@ -700,7 +698,7 @@ def inform_product_of_errors(initiator=None, provider=None, message=None): user_info = f'{initiator._id}, {initiator.fullname}, {initiator.username}' if initiator else 'UNIDENTIFIED' provider_name = provider.name if provider else 'UNIDENTIFIED' - NotificationType.Type.DESK_REGISTRATION_BULK_UPLOAD_PRODUCT_OWNER.instance.emit( + NotificationTypeEnum.DESK_REGISTRATION_BULK_UPLOAD_PRODUCT_OWNER.instance.emit( destination_address=email, event_context={ 'user': user_info, diff --git a/api/providers/views.py b/api/providers/views.py index 85b33258a24..fbfa287d4a7 100644 --- a/api/providers/views.py +++ b/api/providers/views.py @@ -78,6 +78,7 @@ WhitelistedSHAREPreprintProvider, ) from osf.models.action import RegistrationAction, CollectionSubmissionAction +from osf.models.spam import SpamStatus from osf.registrations.utils import ( BulkRegistrationUpload, InvalidHeadersError, @@ -778,6 +779,9 @@ def get_default_queryset(self): return Registration.objects.filter( provider=provider, + deleted__isnull=True, + ).exclude( + spam_status__in=[SpamStatus.FLAGGED, SpamStatus.SPAM], ).annotate( revision_state=registration_annotations.REVISION_STATE, **resource_annotations.make_open_practice_badge_annotations(), diff --git a/api/registrations/views.py b/api/registrations/views.py index c1bb1ba42a4..67705b5eace 100644 --- a/api/registrations/views.py +++ b/api/registrations/views.py @@ -9,6 +9,7 @@ from website.project import signals as project_signals from osf.models import Registration, OSFUser, RegistrationProvider, OutcomeArtifact, CedarMetadataRecord +from osf.models.spam import SpamStatus from osf.utils.permissions import WRITE_NODE from osf.utils.workflows import ApprovalStates @@ -923,7 +924,10 @@ def get_registration(self): return registration def get_default_queryset(self): - return self.get_registration().actions.all() + registration = self.get_registration() + if registration.deleted or registration.spam_status in [SpamStatus.FLAGGED, SpamStatus.SPAM]: + return registration.actions.none() + return registration.actions.all() def get_queryset(self): return self.get_queryset_from_request() diff --git a/api/requests/serializers.py b/api/requests/serializers.py index cca3f713094..c276a23f825 100644 --- a/api/requests/serializers.py +++ b/api/requests/serializers.py @@ -15,7 +15,7 @@ PreprintRequest, Institution, OSFUser, - NotificationType, + NotificationTypeEnum, ) from osf.utils.workflows import DefaultStates, RequestTypes, NodeRequestTypes from osf.utils import permissions as osf_permissions @@ -188,7 +188,7 @@ def make_node_institutional_access_request(self, node, validated_data) -> NodeRe comment = validated_data.get('comment', '').strip() or language.EMPTY_REQUEST_INSTITUTIONAL_ACCESS_REQUEST_TEXT - NotificationType.Type.NODE_INSTITUTIONAL_ACCESS_REQUEST.instance.emit( + NotificationTypeEnum.NODE_INSTITUTIONAL_ACCESS_REQUEST.instance.emit( user=recipient, subscribed_object=node_request.target, event_context={ @@ -196,10 +196,9 @@ def make_node_institutional_access_request(self, node, validated_data) -> NodeRe 'sender_absolute_url': sender.absolute_url, 'node_absolute_url': node_request.target.absolute_url, 'node_title': node_request.target.title, - 'recipient_fullname': recipient.username if recipient else None, + 'recipient_username': recipient.username if recipient else None, 'comment': comment, 'domain': settings.DOMAIN, - 'institution_name': institution.name if institution else None, }, email_context={ 'bcc_addr': [sender.username] if validated_data['bcc_sender'] else None, diff --git a/api/subscriptions/utils.py b/api/subscriptions/utils.py new file mode 100644 index 00000000000..46b1e927d63 --- /dev/null +++ b/api/subscriptions/utils.py @@ -0,0 +1,82 @@ +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import PermissionDenied + +from rest_framework.exceptions import NotFound + +from framework import sentry + +from osf.models import AbstractNode, OSFUser +from osf.models.notification_type import NotificationTypeEnum +from osf.models.notification_subscription import NotificationSubscription + + +def create_missing_notification_from_legacy_id(legacy_id, user): + """ + `global_file_updated` and `global_reviews` should exist by default for every user, and `_files_update` + should exist by default if user is a contributor of the node. If not found, create them with `none` frequency + and `_is_digest=True` as default. Raise error if not found, not authorized or permission denied. + """ + + node_ct = ContentType.objects.get_for_model(AbstractNode) + user_ct = ContentType.objects.get_for_model(OSFUser) + + user_file_updated_nt = NotificationTypeEnum.USER_FILE_UPDATED.instance + reviews_submission_status_nt = NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS.instance + node_file_updated_nt = NotificationTypeEnum.NODE_FILE_UPDATED.instance + + node_guid = 'n/a' + + if legacy_id == f'{user._id}_global_file_updated': + notification_type = user_file_updated_nt + content_type = user_ct + object_id = user.id + elif legacy_id == f'{user._id}_global_reviews': + notification_type = reviews_submission_status_nt + content_type = user_ct + object_id = user.id + elif legacy_id.endswith('_global_file_updated') or legacy_id.endswith('_global_reviews'): + # Mismatched request user and subscription user + sentry.log_message(f'Permission denied: [user={user._id}, legacy_id={legacy_id}]') + raise PermissionDenied + # `_files_update` should exist by default if user is a contributor of the node. + # If not found, create them with `none` frequency and `_is_digest=True` as default. + elif legacy_id.endswith('_file_updated'): + notification_type = node_file_updated_nt + content_type = node_ct + node_guid = legacy_id[:-len('_file_updated')] + node = AbstractNode.objects.filter(guids___id=node_guid, is_deleted=False, type='osf.node').first() + if not node: + # The node in the legacy subscription ID does not exist or is invalid + sentry.log_message( + f'Node not found in legacy subscription ID: [user={user._id}, legacy_id={legacy_id}]', + ) + raise NotFound + if not node.is_contributor(user): + # The request user is not a contributor of the node + sentry.log_message( + f'Permission denied: [user={user._id}], node={node_guid}, legacy_id={legacy_id}]', + ) + raise PermissionDenied + object_id = node.id + else: + sentry.log_message(f'Subscription not found: [user={user._id}, legacy_id={legacy_id}]') + raise NotFound + missing_subscription_created = NotificationSubscription.objects.create( + notification_type=notification_type, + user=user, + content_type=content_type, + object_id=object_id, + _is_digest=True, + message_frequency='none', + ) + sentry.log_message( + f'Missing default subscription has been created: [user={user._id}], node={node_guid} type={notification_type}, legacy_id={legacy_id}]', + ) + return missing_subscription_created + +def create_missing_notifications_from_event_name(filter_event_names, user): + # Note: this may not be needed since 1) missing node subscriptions are created in the LIST view when filter by + # legacy ID, and 2) missing user global subscriptions are created in DETAILS view with legacy ID. However, log + # this message to sentry for tracking how often this happens. + sentry.log_message(f'Detected empty subscription list when filter by event names: [event={filter_event_names}, user={user._id}]') + return None diff --git a/api/subscriptions/views.py b/api/subscriptions/views.py index 953e2a66aec..2cf3b881b11 100644 --- a/api/subscriptions/views.py +++ b/api/subscriptions/views.py @@ -1,13 +1,15 @@ -from django.db.models import Value, When, Case, OuterRef, Subquery +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import PermissionDenied +from django.db.models import Value, When, Case, OuterRef, Subquery, F from django.db.models.fields import CharField, IntegerField from django.db.models.functions import Concat, Cast -from django.contrib.contenttypes.models import ContentType + from rest_framework import generics from rest_framework import permissions as drf_permissions -from rest_framework.exceptions import NotFound -from django.core.exceptions import ObjectDoesNotExist, PermissionDenied from rest_framework.response import Response + from framework.auth.oauth_scopes import CoreScopes + from api.base.views import JSONAPIBaseView from api.base.filters import ListFilterMixin from api.base import permissions as base_permissions @@ -18,6 +20,8 @@ RegistrationSubscriptionSerializer, ) from api.subscriptions.permissions import IsSubscriptionOwner +from api.subscriptions import utils + from osf.models import ( CollectionProvider, PreprintProvider, @@ -25,8 +29,9 @@ AbstractProvider, AbstractNode, Guid, + OSFUser, ) -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from osf.models.notification_subscription import NotificationSubscription @@ -44,63 +49,79 @@ class SubscriptionList(JSONAPIBaseView, generics.ListAPIView, ListFilterMixin): required_write_scopes = [CoreScopes.NULL] def get_queryset(self): + + user = self.request.user user_guid = self.request.user._id + filter_id = self.request.query_params.get('filter[id]') + filter_event_name = self.request.query_params.get('filter[event_name]') + + provider_ct = ContentType.objects.get_for_model(AbstractProvider) + node_ct = ContentType.objects.get_for_model(AbstractNode) + user_ct = ContentType.objects.get_for_model(OSFUser) + node_subquery = AbstractNode.objects.filter( id=Cast(OuterRef('object_id'), IntegerField()), ).values('guids___id')[:1] _global_file_updated = [ - NotificationType.Type.USER_FILE_UPDATED.value, - NotificationType.Type.FILE_ADDED.value, - NotificationType.Type.FILE_REMOVED.value, - NotificationType.Type.ADDON_FILE_COPIED.value, - NotificationType.Type.ADDON_FILE_RENAMED.value, - NotificationType.Type.ADDON_FILE_MOVED.value, - NotificationType.Type.ADDON_FILE_REMOVED.value, - NotificationType.Type.FOLDER_CREATED.value, + NotificationTypeEnum.USER_FILE_UPDATED.value, + NotificationTypeEnum.FILE_ADDED.value, + NotificationTypeEnum.FILE_REMOVED.value, + NotificationTypeEnum.ADDON_FILE_COPIED.value, + NotificationTypeEnum.ADDON_FILE_RENAMED.value, + NotificationTypeEnum.ADDON_FILE_MOVED.value, + NotificationTypeEnum.ADDON_FILE_REMOVED.value, + NotificationTypeEnum.FOLDER_CREATED.value, ] - _global_reviews = [ - NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS.value, - NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION.value, - NotificationType.Type.PROVIDER_REVIEWS_RESUBMISSION_CONFIRMATION.value, - NotificationType.Type.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.value, - NotificationType.Type.REVIEWS_SUBMISSION_STATUS.value, + _global_reviews_provider = [ + NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS.value, + NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION.value, + NotificationTypeEnum.PROVIDER_REVIEWS_RESUBMISSION_CONFIRMATION.value, + NotificationTypeEnum.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.value, + ] + _global_reviews_user = [ + NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS.value, ] _node_file_updated = [ - NotificationType.Type.NODE_FILE_UPDATED.value, - NotificationType.Type.FILE_ADDED.value, - NotificationType.Type.FILE_REMOVED.value, - NotificationType.Type.ADDON_FILE_COPIED.value, - NotificationType.Type.ADDON_FILE_RENAMED.value, - NotificationType.Type.ADDON_FILE_MOVED.value, - NotificationType.Type.ADDON_FILE_REMOVED.value, - NotificationType.Type.FOLDER_CREATED.value, - NotificationType.Type.FILE_UPDATED.value, + NotificationTypeEnum.NODE_FILE_UPDATED.value, + NotificationTypeEnum.FILE_ADDED.value, + NotificationTypeEnum.FILE_REMOVED.value, + NotificationTypeEnum.ADDON_FILE_COPIED.value, + NotificationTypeEnum.ADDON_FILE_RENAMED.value, + NotificationTypeEnum.ADDON_FILE_MOVED.value, + NotificationTypeEnum.ADDON_FILE_REMOVED.value, + NotificationTypeEnum.FOLDER_CREATED.value, + NotificationTypeEnum.FILE_UPDATED.value, ] - qs = NotificationSubscription.objects.filter( - notification_type__name__in=[ - NotificationType.Type.USER_FILE_UPDATED.value, - NotificationType.Type.NODE_FILE_UPDATED.value, - NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS.value, - ] + _global_reviews + _global_file_updated + _node_file_updated, - user=self.request.user, + full_set_of_types = _global_reviews_provider + _global_reviews_user + _global_file_updated + _node_file_updated + annotated_qs = NotificationSubscription.objects.filter( + notification_type__name__in=full_set_of_types, + user=user, ).annotate( event_name=Case( When( notification_type__name__in=_node_file_updated, - then=Value('files_updated'), + content_type=node_ct, + then=Value('file_updated'), ), When( notification_type__name__in=_global_file_updated, + content_type=user_ct, then=Value('global_file_updated'), ), When( - notification_type__name__in=_global_reviews, + notification_type__name__in=_global_reviews_provider, + content_type=provider_ct, + then=Value('global_reviews'), + ), + When( + notification_type__name__in=_global_reviews_user, + content_type=user_ct, then=Value('global_reviews'), ), - default=Value('notification_type__name'), + default=F('notification_type__name'), ), legacy_id=Case( When( @@ -112,24 +133,44 @@ def get_queryset(self): then=Value(f'{user_guid}_global_file_updated'), ), When( - notification_type__name__in=_global_reviews, + notification_type__name__in=_global_reviews_provider, + content_type=provider_ct, then=Value(f'{user_guid}_global_reviews'), ), - default=Value('notification_type__name'), + When( + notification_type__name__in=_global_reviews_user, + content_type=user_ct, + then=Value(f'{user_guid}_global_reviews'), + ), + default=F('notification_type__name'), ), ).distinct('legacy_id') + return_qs = annotated_qs + # Apply manual filter for legacy_id if requested - filter_id = self.request.query_params.get('filter[id]') if filter_id: - qs = qs.filter(legacy_id=filter_id) - # convert to list comprehension because legacy_id is an annotation, not in DB + return_qs = annotated_qs.filter(legacy_id=filter_id) + # TODO: Rework missing subscription fix after fully populating the OSF DB with all missing notifications + # NOTE: `.exists()` errors for unknown reason, possibly due to complex annotation with `.distinct()` + if return_qs.count() == 0: + missing_subscription_created = utils.create_missing_notification_from_legacy_id(filter_id, user) + if missing_subscription_created: + return_qs = annotated_qs.filter(legacy_id=filter_id) + # `filter_id` takes priority over `filter_event_name` + return return_qs + # Apply manual filter for event_name if requested - filter_event_name = self.request.query_params.get('filter[event_name]') if filter_event_name: - qs = qs.filter(event_name__in=filter_event_name.split(',')) + filter_event_names = filter_event_name.split(',') + return_qs = annotated_qs.filter(event_name__in=filter_event_names) + # TODO: Rework missing subscription fix after fully populating the OSF DB with all missing notifications + # NOTE: `.exists()` errors for unknown reason, possibly due to complex annotation with `.distinct()` + if return_qs.count() == 0: + utils.create_missing_notifications_from_event_name(filter_event_names, user) + + return return_qs - return qs class AbstractProviderSubscriptionList(SubscriptionList): def get_queryset(self): @@ -155,66 +196,74 @@ class SubscriptionDetail(JSONAPIBaseView, generics.RetrieveUpdateAPIView): def get_object(self): subscription_id = self.kwargs['subscription_id'] + user = self.request.user user_guid = self.request.user._id - - provider_ct = ContentType.objects.get(app_label='osf', model='abstractprovider') - node_ct = ContentType.objects.get(app_label='osf', model='abstractnode') + user_ct = ContentType.objects.get_for_model(OSFUser) + node_ct = ContentType.objects.get_for_model(AbstractNode) node_subquery = AbstractNode.objects.filter( id=Cast(OuterRef('object_id'), IntegerField()), ).values('guids___id')[:1] - try: - annotated_obj_qs = NotificationSubscription.objects.filter(user=self.request.user).annotate( - legacy_id=Case( - When( - notification_type__name=NotificationType.Type.NODE_FILE_UPDATED.value, - content_type=node_ct, - then=Concat(Subquery(node_subquery), Value('_files_updated')), - ), - When( - notification_type__name=NotificationType.Type.USER_FILE_UPDATED.value, - then=Value(f'{user_guid}_global_file_updated'), - ), - When( - notification_type__name=NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS.value, - content_type=provider_ct, - then=Value(f'{user_guid}_global_reviews'), - ), - default=Value(f'{user_guid}_global'), - output_field=CharField(), + missing_subscription_created = None + annotated_obj_qs = NotificationSubscription.objects.filter(user=user).annotate( + legacy_id=Case( + When( + notification_type__name=NotificationTypeEnum.NODE_FILE_UPDATED.value, + content_type=node_ct, + then=Concat(Subquery(node_subquery), Value('_file_updated')), ), - ) - obj = annotated_obj_qs.filter(legacy_id=subscription_id) - - except ObjectDoesNotExist: - raise NotFound - - obj = obj.filter(user=self.request.user).first() - if not obj: + When( + notification_type__name=NotificationTypeEnum.USER_FILE_UPDATED.value, + then=Value(f'{user_guid}_global_file_updated'), + ), + When( + notification_type__name=NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS.value, + content_type=user_ct, + then=Value(f'{user_guid}_global_reviews'), + ), + default=Value(f'{user_guid}_global'), + output_field=CharField(), + ), + ) + existing_subscriptions = annotated_obj_qs.filter(legacy_id=subscription_id) + + # TODO: Rework missing subscription fix after fully populating the OSF DB with all missing notifications + if not existing_subscriptions.exists(): + missing_subscription_created = utils.create_missing_notification_from_legacy_id(subscription_id, user) + if missing_subscription_created: + # Note: must use `annotated_obj_qs` to insert `legacy_id` so that `SubscriptionSerializer` can build data + # properly; in addition, there should be only one result + subscription = annotated_obj_qs.get(legacy_id=subscription_id) + else: + # TODO: Use `get()` and fails/warns on multiple objects after fully de-duplicating the OSF DB + subscription = existing_subscriptions.order_by('id').last() + if not subscription: raise PermissionDenied - self.check_object_permissions(self.request, obj) - return obj + self.check_object_permissions(self.request, subscription) + return subscription def update(self, request, *args, **kwargs): """ Update a notification subscription """ + self.get_object() + if '_global_file_updated' in self.kwargs['subscription_id']: # Copy _global_file_updated subscription changes to all file subscriptions qs = NotificationSubscription.objects.filter( user=self.request.user, notification_type__name__in=[ - NotificationType.Type.USER_FILE_UPDATED.value, - NotificationType.Type.FILE_UPDATED.value, - NotificationType.Type.FILE_ADDED.value, - NotificationType.Type.FILE_REMOVED.value, - NotificationType.Type.ADDON_FILE_COPIED.value, - NotificationType.Type.ADDON_FILE_RENAMED.value, - NotificationType.Type.ADDON_FILE_MOVED.value, - NotificationType.Type.ADDON_FILE_REMOVED.value, - NotificationType.Type.FOLDER_CREATED.value, + NotificationTypeEnum.USER_FILE_UPDATED.value, + NotificationTypeEnum.FILE_UPDATED.value, + NotificationTypeEnum.FILE_ADDED.value, + NotificationTypeEnum.FILE_REMOVED.value, + NotificationTypeEnum.ADDON_FILE_COPIED.value, + NotificationTypeEnum.ADDON_FILE_RENAMED.value, + NotificationTypeEnum.ADDON_FILE_MOVED.value, + NotificationTypeEnum.ADDON_FILE_REMOVED.value, + NotificationTypeEnum.FOLDER_CREATED.value, ], ).exclude(content_type=ContentType.objects.get_for_model(AbstractNode)) if not qs.exists(): @@ -230,11 +279,11 @@ def update(self, request, *args, **kwargs): qs = NotificationSubscription.objects.filter( user=self.request.user, notification_type__name__in=[ - NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS.value, - NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION.value, - NotificationType.Type.PROVIDER_REVIEWS_RESUBMISSION_CONFIRMATION.value, - NotificationType.Type.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.value, - NotificationType.Type.REVIEWS_SUBMISSION_STATUS.value, + NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS.value, + NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION.value, + NotificationTypeEnum.PROVIDER_REVIEWS_RESUBMISSION_CONFIRMATION.value, + NotificationTypeEnum.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.value, + NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS.value, ], ) if not qs.exists(): @@ -245,24 +294,24 @@ def update(self, request, *args, **kwargs): serializer.is_valid(raise_exception=True) self.perform_update(serializer) return Response(serializer.data) - elif '_files_updated' in self.kwargs['subscription_id']: - # Copy _files_updated subscription changes to all node file subscriptions - node_id = Guid.load(self.kwargs['subscription_id'].split('_files_updated')[0]).object_id + elif '_file_updated' in self.kwargs['subscription_id']: + # Copy _file_updated subscription changes to all node file subscriptions + node_id = Guid.load(self.kwargs['subscription_id'].split('_file_updated')[0]).object_id qs = NotificationSubscription.objects.filter( user=self.request.user, content_type=ContentType.objects.get_for_model(AbstractNode), object_id=node_id, notification_type__name__in=[ - NotificationType.Type.NODE_FILE_UPDATED.value, - NotificationType.Type.FILE_UPDATED.value, - NotificationType.Type.FILE_ADDED.value, - NotificationType.Type.FILE_REMOVED.value, - NotificationType.Type.ADDON_FILE_COPIED.value, - NotificationType.Type.ADDON_FILE_RENAMED.value, - NotificationType.Type.ADDON_FILE_MOVED.value, - NotificationType.Type.ADDON_FILE_REMOVED.value, - NotificationType.Type.FOLDER_CREATED.value, + NotificationTypeEnum.NODE_FILE_UPDATED.value, + NotificationTypeEnum.FILE_UPDATED.value, + NotificationTypeEnum.FILE_ADDED.value, + NotificationTypeEnum.FILE_REMOVED.value, + NotificationTypeEnum.ADDON_FILE_COPIED.value, + NotificationTypeEnum.ADDON_FILE_RENAMED.value, + NotificationTypeEnum.ADDON_FILE_MOVED.value, + NotificationTypeEnum.ADDON_FILE_REMOVED.value, + NotificationTypeEnum.FOLDER_CREATED.value, ], ) if not qs.exists(): diff --git a/api/users/serializers.py b/api/users/serializers.py index 023ce24442d..608f93c98c0 100644 --- a/api/users/serializers.py +++ b/api/users/serializers.py @@ -34,7 +34,7 @@ from api.nodes.serializers import NodeSerializer, RegionRelationshipField from framework.auth.views import send_confirm_email_async from osf.exceptions import ValidationValueError, ValidationError, BlockedEmailError -from osf.models import Email, Node, OSFUser, Preprint, Registration, UserMessage, Institution, NotificationType +from osf.models import Email, Node, OSFUser, Preprint, Registration, UserMessage, Institution, NotificationTypeEnum from osf.models.user_message import MessageTypes from osf.models.provider import AbstractProviderGroupObjectPermission from osf.utils.requests import string_type_request_headers @@ -737,14 +737,13 @@ def update(self, instance, validated_data): if primary and instance.confirmed: user.username = instance.address user.save() - notification_type = NotificationType.Type.USER_PRIMARY_EMAIL_CHANGED + notification_type = NotificationTypeEnum.USER_PRIMARY_EMAIL_CHANGED notification_type.instance.emit( subscribed_object=user, user=user, event_context={ 'user_fullname': user.fullname, 'new_address': user.username, - 'can_change_preferences': False, 'osf_contact_email': settings.OSF_CONTACT_EMAIL, }, ) diff --git a/api/users/services.py b/api/users/services.py index 9237f0b1d9f..3b93b230804 100644 --- a/api/users/services.py +++ b/api/users/services.py @@ -2,7 +2,7 @@ from django.utils import timezone from framework.auth.core import generate_verification_key -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from website import settings @@ -15,14 +15,13 @@ def send_password_reset_email(user, email, verification_type='password', institu user.save() reset_link = furl(settings.DOMAIN).add(path=f'resetpassword/{user._id}/{user.verification_key_v2["token"]}').url - notification_type = NotificationType.Type.USER_FORGOT_PASSWORD_INSTITUTION if institutional \ - else NotificationType.Type.USER_FORGOT_PASSWORD + notification_type = NotificationTypeEnum.USER_FORGOT_PASSWORD_INSTITUTION if institutional \ + else NotificationTypeEnum.USER_FORGOT_PASSWORD notification_type.instance.emit( destination_address=email, event_context={ 'reset_link': reset_link, - 'can_change_preferences': False, **mail_kwargs, }, ) diff --git a/api/users/views.py b/api/users/views.py index 6485fc625ad..b920798be86 100644 --- a/api/users/views.py +++ b/api/users/views.py @@ -99,7 +99,7 @@ OSFUser, Email, Tag, - NotificationType, + NotificationTypeEnum, PreprintProvider, ) from osf.utils.tokens import TokenHandler @@ -645,14 +645,13 @@ def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user = self.get_user() - NotificationType.Type.DESK_REQUEST_EXPORT.instance.emit( + NotificationTypeEnum.DESK_REQUEST_EXPORT.instance.emit( user=user, destination_address=settings.OSF_SUPPORT_EMAIL, event_context={ 'user_username': user.username, 'user_absolute_url': user.absolute_url, 'user__id': user._id, - 'can_change_preferences': False, }, ) user.email_last_sent = timezone.now() @@ -857,15 +856,14 @@ def get(self, request, *args, **kwargs): user_obj.save() reset_link = f'{settings.DOMAIN}resetpassword/{user_obj._id}/{user_obj.verification_key_v2["token"]}/' if institutional: - notification_type = NotificationType.Type.USER_FORGOT_PASSWORD_INSTITUTION + notification_type = NotificationTypeEnum.USER_FORGOT_PASSWORD_INSTITUTION else: - notification_type = NotificationType.Type.USER_FORGOT_PASSWORD + notification_type = NotificationTypeEnum.USER_FORGOT_PASSWORD notification_type.instance.emit( user=user_obj, message_frequency='instantly', event_context={ - 'can_change_preferences': False, 'reset_link': reset_link, }, ) @@ -1168,12 +1166,11 @@ def _process_external_identity(self, user, external_identity, service_url): if external_status == 'CREATE': service_url += '&' + urlencode({'new': 'true'}) elif external_status == 'LINK': - NotificationType.Type.USER_EXTERNAL_LOGIN_LINK_SUCCESS.instance.emit( + NotificationTypeEnum.USER_EXTERNAL_LOGIN_LINK_SUCCESS.instance.emit( user=user, message_frequency='instantly', event_context={ 'user_fullname': user.fullname, - 'can_change_preferences': False, 'external_id_provider': provider, }, ) @@ -1490,11 +1487,10 @@ def post(self, request, *args, **kwargs): if external_status == 'CREATE': service_url += '&{}'.format(urlencode({'new': 'true'})) elif external_status == 'LINK': - NotificationType.Type.USER_EXTERNAL_LOGIN_CONFIRM_EMAIL_LINK.instance.emit( + NotificationTypeEnum.USER_EXTERNAL_LOGIN_CONFIRM_EMAIL_LINK.instance.emit( user=user, message_frequency='instantly', event_context={ - 'can_change_preferences': False, 'external_id_provider': provider.name, }, ) diff --git a/api_tests/actions/views/test_action_list.py b/api_tests/actions/views/test_action_list.py index 2881706ba7c..fc5de8a1d02 100644 --- a/api_tests/actions/views/test_action_list.py +++ b/api_tests/actions/views/test_action_list.py @@ -1,7 +1,7 @@ import pytest from api.base.settings.defaults import API_BASE -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf_tests.factories import ( PreprintFactory, AuthUserFactory, @@ -193,8 +193,8 @@ def test_accept_permissions_accept(self, app, url, preprint, node_admin, moderat with capture_notifications() as notifications: res = app.post_json_api(url, accept_payload, auth=moderator.auth) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.REVIEWS_SUBMISSION_STATUS - assert notifications['emits'][1]['type'] == NotificationType.Type.REVIEWS_SUBMISSION_STATUS + assert notifications['emits'][0]['type'] == NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS + assert notifications['emits'][1]['type'] == NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS assert res.status_code == 201 preprint.refresh_from_db() assert preprint.machine_state == 'accepted' diff --git a/api_tests/base/test_throttling.py b/api_tests/base/test_throttling.py index a1c2921ca2f..22de7950bbd 100644 --- a/api_tests/base/test_throttling.py +++ b/api_tests/base/test_throttling.py @@ -1,7 +1,7 @@ from unittest import mock from api.base.settings.defaults import API_BASE -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from tests.base import ApiTestCase from osf_tests.factories import AuthUserFactory, ProjectFactory @@ -131,7 +131,7 @@ def test_add_contrib_throttle_rate_allow_request_called(self, mock_allow): auth=self.user.auth ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT assert res.status_code == 201 assert mock_allow.call_count == 1 diff --git a/api_tests/cedar_metadata_records/views/test_record_metadata_download_get.py b/api_tests/cedar_metadata_records/views/test_record_metadata_download_get.py index eb10a25aa8c..81cb97852f5 100644 --- a/api_tests/cedar_metadata_records/views/test_record_metadata_download_get.py +++ b/api_tests/cedar_metadata_records/views/test_record_metadata_download_get.py @@ -3,6 +3,8 @@ from .test_record import TestCedarMetadataRecord from osf.utils.permissions import READ, WRITE from osf_tests.factories import AuthUserFactory +from website import settings + @pytest.mark.django_db class TestCedarMetadataRecordMetadataDownloadPrivateProjectPublishedMetadata(TestCedarMetadataRecord): @@ -13,6 +15,7 @@ def test_record_metadata_download_for_node_with_admin_auth(self, app, node, user resp = app.get(f'/_/cedar_metadata_records/{cedar_record_for_node._id}/metadata_download/', auth=admin.auth) assert resp.status_code == 200 assert resp.headers['Content-Disposition'] == f'attachment; filename={self.get_record_metadata_download_file_name(cedar_record_for_node)}' + assert resp.headers.get('Link') == f'<{settings.DOMAIN}{node._id}/>; rel="describes"; type="text/html"' assert resp.json == cedar_record_metadata_json def test_record_metadata_download_for_node_with_write_auth(self, app, node, cedar_record_for_node, cedar_record_metadata_json): @@ -179,6 +182,7 @@ def test_record_metadata_download_for_registration_with_admin_auth(self, app, us resp = app.get(f'/_/cedar_metadata_records/{cedar_record_for_registration._id}/metadata_download/', auth=admin.auth) assert resp.status_code == 200 assert resp.headers['Content-Disposition'] == f'attachment; filename={self.get_record_metadata_download_file_name(cedar_record_for_registration)}' + assert resp.headers.get('Link') == f'<{settings.DOMAIN}{cedar_record_for_registration.guid._id}/>; rel="describes"; type="text/html"' assert resp.json == cedar_record_metadata_json def test_record_metadata_download_for_registration_with_write_auth(self, app, registration, cedar_record_for_registration, cedar_record_metadata_json): @@ -307,6 +311,7 @@ def test_record_metadata_download_for_node_with_admin_auth(self, app, user, ceda resp = app.get(f'/_/cedar_metadata_records/{cedar_draft_record_for_file_alt._id}/metadata_download/', auth=admin.auth) assert resp.status_code == 200 assert resp.headers['Content-Disposition'] == f'attachment; filename={self.get_record_metadata_download_file_name(cedar_draft_record_for_file_alt)}' + assert not resp.headers.get('Link') assert resp.json == cedar_record_metadata_json def test_record_metadata_download_for_node_with_write_auth(self, app, node_alt, cedar_draft_record_for_file_alt, cedar_record_metadata_json): diff --git a/api_tests/collection_submission_actions/views/test_collection_submissions_actions_list.py b/api_tests/collection_submission_actions/views/test_collection_submissions_actions_list.py index 9c9fb239fb2..9de82198b96 100644 --- a/api_tests/collection_submission_actions/views/test_collection_submissions_actions_list.py +++ b/api_tests/collection_submission_actions/views/test_collection_submissions_actions_list.py @@ -5,7 +5,7 @@ from django.utils import timezone from osf_tests.factories import NodeFactory, CollectionFactory, CollectionProviderFactory -from osf.models import CollectionSubmission, NotificationType +from osf.models import CollectionSubmission, NotificationTypeEnum from osf.utils.workflows import CollectionSubmissionsTriggers, CollectionSubmissionStates from tests.utils import capture_notifications @@ -133,9 +133,9 @@ def test_status_code__collection_moderator_accept_reject_moderated(self, app, no ) assert len(notifications['emits']) == 1 if moderator_trigger is CollectionSubmissionsTriggers.ACCEPT: - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_ACCEPTED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_ACCEPTED if moderator_trigger is CollectionSubmissionsTriggers.REJECT: - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REJECTED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REJECTED assert resp.status_code == 201 @pytest.mark.parametrize('moderator_trigger', [CollectionSubmissionsTriggers.ACCEPT, CollectionSubmissionsTriggers.REJECT]) @@ -181,13 +181,13 @@ def test_status_code__remove(self, app, node, collection_submission, user_role): assert resp.status_code == 201 if user_role == UserRoles.MODERATOR: assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_MODERATOR + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_MODERATOR assert notifications['emits'][0]['kwargs']['user'] == collection_submission.creator else: assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_ADMIN + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_ADMIN assert notifications['emits'][0]['kwargs']['user'] == collection_submission.creator - assert notifications['emits'][1]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_ADMIN + assert notifications['emits'][1]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_ADMIN assert notifications['emits'][1]['kwargs']['user'] == node.contributors.last() @@ -211,7 +211,7 @@ def test_POST_accept__writes_action_and_advances_state(self, app, collection_sub with capture_notifications() as notifications: app.post_json_api(POST_URL, payload, auth=test_auth) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_ACCEPTED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_ACCEPTED user = collection_submission.collection.provider.get_group('moderator').user_set.first() collection_submission.refresh_from_db() @@ -230,7 +230,7 @@ def test_POST_reject__writes_action_and_advances_state(self, app, collection_sub with capture_notifications() as notifications: app.post_json_api(POST_URL, payload, auth=test_auth) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REJECTED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REJECTED user = collection_submission.collection.provider.get_group('moderator').user_set.first() collection_submission.refresh_from_db() @@ -249,9 +249,9 @@ def test_POST_cancel__writes_action_and_advances_state(self, app, collection_sub with capture_notifications() as notifications: app.post_json_api(POST_URL, payload, auth=test_auth) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_CANCEL + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_CANCEL assert notifications['emits'][0]['kwargs']['user'] == collection_submission.creator - assert notifications['emits'][1]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_CANCEL + assert notifications['emits'][1]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_CANCEL assert notifications['emits'][0]['kwargs']['user'] == node.creator collection_submission.refresh_from_db() @@ -271,7 +271,7 @@ def test_POST_remove__writes_action_and_advances_state(self, app, collection_sub with capture_notifications() as notifications: app.post_json_api(POST_URL, payload, auth=test_auth) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_MODERATOR + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_MODERATOR user = collection_submission.collection.provider.get_group('moderator').user_set.first() collection_submission.refresh_from_db() action = collection_submission.actions.last() @@ -322,7 +322,7 @@ def test_status_code__private_collection_moderator(self, app, node, collection, expect_errors=True ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_ACCEPTED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_ACCEPTED assert resp.status_code == 201 diff --git a/api_tests/crossref/views/test_crossref_email_response.py b/api_tests/crossref/views/test_crossref_email_response.py index 33345f4f442..196c0debd2a 100644 --- a/api_tests/crossref/views/test_crossref_email_response.py +++ b/api_tests/crossref/views/test_crossref_email_response.py @@ -5,7 +5,7 @@ from django.utils import timezone -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf_tests import factories from tests.utils import capture_notifications from website import settings @@ -163,7 +163,7 @@ def test_error_response_sends_message_does_not_set_doi(self, app, url, preprint, with capture_notifications() as notifications: app.post(url, context_data) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.DESK_CROSSREF_ERROR + assert notifications['emits'][0]['type'] == NotificationTypeEnum.DESK_CROSSREF_ERROR assert not preprint.get_identifier_value('doi') def test_success_response_sets_doi(self, app, url, preprint, success_xml): diff --git a/api_tests/draft_registrations/views/test_draft_registration_contributor_list.py b/api_tests/draft_registrations/views/test_draft_registration_contributor_list.py index c40886863fa..5d76ae1522b 100644 --- a/api_tests/draft_registrations/views/test_draft_registration_contributor_list.py +++ b/api_tests/draft_registrations/views/test_draft_registration_contributor_list.py @@ -16,7 +16,7 @@ TestNodeContributorFiltering, ) from api_tests.nodes.views.utils import NodeCRUDTestCase -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from osf_tests.factories import ( DraftRegistrationFactory, AuthUserFactory, @@ -238,7 +238,7 @@ def test_add_contributor_sends_email(self, app, user, user_two, url_project_cont ) assert res.status_code == 201 assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.DRAFT_REGISTRATION_CONTRIBUTOR_ADDED_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.DRAFT_REGISTRATION_CONTRIBUTOR_ADDED_DEFAULT # Overrides TestNodeContributorCreateEmail def test_add_contributor_signal_if_default( @@ -281,7 +281,7 @@ def test_add_unregistered_contributor_sends_email(self, app, user, url_project_c ) assert res.status_code == 201 assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_INVITE_DRAFT_REGISTRATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_INVITE_DRAFT_REGISTRATION # Overrides TestNodeContributorCreateEmail def test_add_unregistered_contributor_signal_if_default(self, app, user, url_project_contribs): @@ -300,7 +300,7 @@ def test_add_unregistered_contributor_signal_if_default(self, app, user, url_pro ) assert res.status_code == 201 assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_INVITE_DRAFT_REGISTRATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_INVITE_DRAFT_REGISTRATION # Overrides TestNodeContributorCreateEmail def test_add_unregistered_contributor_without_email_no_email(self, app, user, url_project_contribs): diff --git a/api_tests/draft_registrations/views/test_draft_registration_list.py b/api_tests/draft_registrations/views/test_draft_registration_list.py index c2c0cce084c..decb75e087e 100644 --- a/api_tests/draft_registrations/views/test_draft_registration_list.py +++ b/api_tests/draft_registrations/views/test_draft_registration_list.py @@ -6,7 +6,7 @@ from api.base.settings.defaults import API_BASE from osf.migrations import ensure_invisible_and_inactive_schema -from osf.models import DraftRegistration, NodeLicense, RegistrationProvider, RegistrationSchema, NotificationType +from osf.models import DraftRegistration, NodeLicense, RegistrationProvider, RegistrationSchema, NotificationTypeEnum from osf_tests.factories import ( RegistrationFactory, CollectionFactory, @@ -448,7 +448,7 @@ def test_create_no_project_draft_emails_initiator(self, app, user, url_draft_reg auth=user.auth ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.DRAFT_REGISTRATION_CONTRIBUTOR_ADDED_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.DRAFT_REGISTRATION_CONTRIBUTOR_ADDED_DEFAULT assert notifications['emits'][0]['kwargs']['user'] == user def test_create_draft_with_provider( @@ -541,7 +541,7 @@ def test_draft_registration_attributes_not_copied_from_node(self, app, project_p auth=user.auth ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.DRAFT_REGISTRATION_CONTRIBUTOR_ADDED_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.DRAFT_REGISTRATION_CONTRIBUTOR_ADDED_DEFAULT assert res.status_code == 201 attributes = res.json['data']['attributes'] assert attributes['title'] == '' diff --git a/api_tests/guids/views/test_guid_detail.py b/api_tests/guids/views/test_guid_detail.py index 4a6db0fbc35..f52ff10e215 100644 --- a/api_tests/guids/views/test_guid_detail.py +++ b/api_tests/guids/views/test_guid_detail.py @@ -12,6 +12,7 @@ PrivateLinkFactory, ) from website.settings import API_DOMAIN +from tests.utils import capture_notifications @pytest.mark.django_db @@ -32,13 +33,14 @@ def registration(self): @pytest.fixture() def versioned_preprint(self, user): preprint = PreprintFactory(reviews_workflow='pre-moderation') - PreprintFactory.create_version( - create_from=preprint, - creator=user, - final_machine_state='accepted', - is_published=True, - set_doi=False - ) + with capture_notifications(): + PreprintFactory.create_version( + create_from=preprint, + creator=user, + final_machine_state='accepted', + is_published=True, + set_doi=False + ) return preprint def test_redirects(self, app, project, registration, user): diff --git a/api_tests/institutions/views/test_institution_relationship_nodes.py b/api_tests/institutions/views/test_institution_relationship_nodes.py index f99802dbe91..7b3fc54f05f 100644 --- a/api_tests/institutions/views/test_institution_relationship_nodes.py +++ b/api_tests/institutions/views/test_institution_relationship_nodes.py @@ -1,7 +1,7 @@ import pytest from api.base.settings.defaults import API_BASE -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf_tests.factories import ( RegistrationFactory, InstitutionFactory, @@ -425,7 +425,7 @@ def test_email_sent_on_affiliation_addition( assert res.status_code == 201 assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED def test_email_sent_on_affiliation_removal(self, app, admin, institution, node_public, url_institution_nodes): current_institution = InstitutionFactory() @@ -448,7 +448,7 @@ def test_email_sent_on_affiliation_removal(self, app, admin, institution, node_p assert res.status_code == 204 assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert notifications['emits'][0]['kwargs']['user'] == node_public.creator - assert notifications['emits'][1]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert notifications['emits'][1]['kwargs']['user'] == admin diff --git a/api_tests/mailhog/provider/test_collection_submission.py b/api_tests/mailhog/provider/test_collection_submission.py index 24e6b010d64..97de8e9b2c4 100644 --- a/api_tests/mailhog/provider/test_collection_submission.py +++ b/api_tests/mailhog/provider/test_collection_submission.py @@ -7,7 +7,7 @@ CollectionProviderFactory, CollectionFactory, ) -from osf.models import NotificationType, CollectionSubmission +from osf.models import NotificationTypeEnum, CollectionSubmission from tests.utils import get_mailhog_messages, delete_mailhog_messages, capture_notifications from osf.utils.workflows import CollectionSubmissionStates @@ -49,8 +49,8 @@ def test_notify_contributors_pending(self, node, moderated_collection): ) collection_submission.save() assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_SUBMITTED - assert notifications['emits'][1]['type'] == NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_SUBMITTED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS assert collection_submission.state == CollectionSubmissionStates.PENDING massages = get_mailhog_messages() assert massages['count'] == len(notifications['emails']) @@ -67,8 +67,8 @@ def test_notify_moderators_pending(self, node, moderated_collection): ) collection_submission.save() assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_SUBMITTED - assert notifications['emits'][1]['type'] == NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_SUBMITTED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS assert collection_submission.state == CollectionSubmissionStates.PENDING massages = get_mailhog_messages() assert massages['count'] == len(notifications['emails']) diff --git a/api_tests/mailhog/provider/test_collections_provider_moderator_list.py b/api_tests/mailhog/provider/test_collections_provider_moderator_list.py index 635deb42c4b..49d139062b7 100644 --- a/api_tests/mailhog/provider/test_collections_provider_moderator_list.py +++ b/api_tests/mailhog/provider/test_collections_provider_moderator_list.py @@ -2,7 +2,7 @@ from waffle.testutils import override_switch from osf import features from api.base.settings.defaults import API_BASE -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf_tests.factories import ( AuthUserFactory, CollectionProviderFactory, @@ -69,7 +69,7 @@ def test_POST_admin_success_existing_user(self, app, url, nonmoderator, moderato with capture_notifications(passthrough=True) as notifications: res = app.post_json_api(url, payload, auth=admin.auth) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_MODERATOR_ADDED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_MODERATOR_ADDED assert res.status_code == 201 assert res.json['data']['id'] == nonmoderator._id assert res.json['data']['attributes']['permission_group'] == 'moderator' @@ -97,7 +97,7 @@ def test_POST_admin_failure_unreg_moderator(self, app, url, moderator, nonmodera res = app.post_json_api(url, payload, auth=admin.auth) assert res.status_code == 201 assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_CONFIRM_EMAIL_MODERATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_CONFIRM_EMAIL_MODERATION assert notifications['emits'][0]['kwargs']['user'].username == unreg_user['email'] massages = get_mailhog_messages() @@ -113,7 +113,7 @@ def test_POST_admin_success_email(self, app, url, nonmoderator, moderator, admin with capture_notifications(passthrough=True) as notifications: res = app.post_json_api(url, payload, auth=admin.auth) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_CONFIRM_EMAIL_MODERATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_CONFIRM_EMAIL_MODERATION assert res.status_code == 201 assert len(res.json['data']['id']) == 5 assert res.json['data']['attributes']['permission_group'] == 'moderator' diff --git a/api_tests/mailhog/provider/test_preprints.py b/api_tests/mailhog/provider/test_preprints.py index db514c87c34..7aa5fed3a9b 100644 --- a/api_tests/mailhog/provider/test_preprints.py +++ b/api_tests/mailhog/provider/test_preprints.py @@ -2,7 +2,7 @@ from osf import features from framework.auth.core import Auth -from osf.models import NotificationType, Notification +from osf.models import NotificationTypeEnum from osf_tests.factories import ( ProjectFactory, AuthUserFactory, @@ -12,7 +12,6 @@ from osf.utils.permissions import WRITE from tests.base import OsfTestCase from tests.utils import get_mailhog_messages, delete_mailhog_messages, capture_notifications, assert_emails -from notifications.tasks import send_users_instant_digest_email class TestPreprintConfirmationEmails(OsfTestCase): @@ -33,27 +32,16 @@ def test_creator_gets_email(self): with capture_notifications(passthrough=True) as notifications: self.preprint.set_published(True, auth=Auth(self.user), save=True) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION messages = get_mailhog_messages() - assert not messages['items'] - assert Notification.objects.all() - with capture_notifications(passthrough=True) as notifications: - send_users_instant_digest_email.delay() - - messages = get_mailhog_messages() - assert messages['count'] == len(notifications['emits']) + assert_emails(messages, notifications) delete_mailhog_messages() with capture_notifications(passthrough=True) as notifications: self.preprint_branded.set_published(True, auth=Auth(self.user), save=True) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION messages = get_mailhog_messages() - assert not messages['items'] - with capture_notifications(passthrough=True) as notifications: - send_users_instant_digest_email.delay() - massages = get_mailhog_messages() - assert massages['count'] == len(notifications['emits']) - assert_emails(massages, notifications) + assert_emails(messages, notifications) delete_mailhog_messages() diff --git a/api_tests/mailhog/provider/test_reviewable.py b/api_tests/mailhog/provider/test_reviewable.py index c493c6a3b22..f07a874b061 100644 --- a/api_tests/mailhog/provider/test_reviewable.py +++ b/api_tests/mailhog/provider/test_reviewable.py @@ -1,7 +1,7 @@ import pytest from waffle.testutils import override_switch from osf import features -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf.utils.workflows import DefaultStates from osf_tests.factories import PreprintFactory, AuthUserFactory from tests.utils import get_mailhog_messages, delete_mailhog_messages, capture_notifications, assert_emails @@ -20,7 +20,7 @@ def test_reject_resubmission_sends_emails(self): with capture_notifications(passthrough=True) as notifications: preprint.run_submit(user) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION assert preprint.machine_state == DefaultStates.PENDING.value delete_mailhog_messages() @@ -30,7 +30,7 @@ def test_reject_resubmission_sends_emails(self): preprint.run_reject(user, 'comment') assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.REVIEWS_SUBMISSION_STATUS + assert notifications['emits'][0]['type'] == NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS assert preprint.machine_state == DefaultStates.REJECTED.value massages = get_mailhog_messages() @@ -41,7 +41,7 @@ def test_reject_resubmission_sends_emails(self): with capture_notifications(passthrough=True) as notifications: preprint.run_submit(user) # Resubmission alerts users and moderators assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_REVIEWS_RESUBMISSION_CONFIRMATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_REVIEWS_RESUBMISSION_CONFIRMATION assert preprint.machine_state == DefaultStates.PENDING.value messages = get_mailhog_messages() diff --git a/api_tests/mailhog/provider/test_schema_responses.py b/api_tests/mailhog/provider/test_schema_responses.py index f8fec0b42bf..cab6a5a8da4 100644 --- a/api_tests/mailhog/provider/test_schema_responses.py +++ b/api_tests/mailhog/provider/test_schema_responses.py @@ -2,7 +2,7 @@ from waffle.testutils import override_switch from osf import features from api.providers.workflows import Workflows -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf.models import schema_response # import module for mocking purposes from osf.utils.workflows import ApprovalStates from osf_tests.factories import AuthUserFactory, ProjectFactory, RegistrationFactory, RegistrationProviderFactory @@ -125,9 +125,9 @@ def test_submit_response_notification( with capture_notifications(passthrough=True) as notifications: revised_response.submit(user=admin_user, required_approvers=[admin_user]) assert len(notifications['emits']) == 3 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_SUBMITTED - assert notifications['emits'][1]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_SUBMITTED - assert notifications['emits'][2]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_SUBMITTED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_SUBMITTED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_SUBMITTED + assert notifications['emits'][2]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_SUBMITTED massages = get_mailhog_messages() assert massages['count'] == len(notifications['emails']) assert_emails(massages, notifications) @@ -145,9 +145,9 @@ def test_approve_response_notification( with capture_notifications(passthrough=True) as notifications: revised_response.approve(user=alternate_user) assert len(notifications['emits']) == 3 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_APPROVED - assert notifications['emits'][1]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_APPROVED - assert notifications['emits'][2]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_APPROVED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_APPROVED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_APPROVED + assert notifications['emits'][2]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_APPROVED massages = get_mailhog_messages() assert massages['count'] == len(notifications['emails']) assert_emails(massages, notifications) @@ -164,9 +164,9 @@ def test_reject_response_notification( with capture_notifications(passthrough=True) as notifications: revised_response.reject(user=admin_user) assert len(notifications['emits']) == 3 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_REJECTED - assert notifications['emits'][1]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_REJECTED - assert notifications['emits'][2]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_REJECTED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_REJECTED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_REJECTED + assert notifications['emits'][2]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_REJECTED massages = get_mailhog_messages() assert massages['count'] == len(notifications['emails']) assert_emails(massages, notifications) @@ -207,9 +207,9 @@ def test_accept_notification_sent_on_admin_approval(self, revised_response, admi revised_response.approve(user=admin_user) assert len(notifications['emits']) == 2 assert notifications['emits'][0]['kwargs']['user'] == moderator - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS assert notifications['emits'][1]['kwargs']['user'] == admin_user - assert notifications['emits'][1]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_APPROVED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_APPROVED massages = get_mailhog_messages() assert massages['count'] == len(notifications['emails']) assert_emails(massages, notifications) @@ -226,9 +226,9 @@ def test_moderators_notified_on_admin_approval(self, revised_response, admin_use revised_response.approve(user=admin_user) assert len(notifications['emits']) == 2 assert notifications['emits'][0]['kwargs']['user'] == moderator - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS assert notifications['emits'][1]['kwargs']['user'] == admin_user - assert notifications['emits'][1]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_APPROVED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_APPROVED massages = get_mailhog_messages() assert massages['count'] == len(notifications['emails']) assert_emails(massages, notifications) diff --git a/api_tests/mailhog/provider/test_submissions.py b/api_tests/mailhog/provider/test_submissions.py index caa0abe71b0..542d4410a99 100644 --- a/api_tests/mailhog/provider/test_submissions.py +++ b/api_tests/mailhog/provider/test_submissions.py @@ -18,10 +18,10 @@ from tests.base import get_default_metaschema -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf.migrations import update_provider_auth_groups -from tests.utils import capture_notifications, get_mailhog_messages, delete_mailhog_messages +from tests.utils import capture_notifications, get_mailhog_messages, delete_mailhog_messages, assert_emails @pytest.mark.django_db @@ -82,11 +82,10 @@ def test_get_registration_actions(self, app, registration_actions_url, registrat resp = app.get(registration_actions_url, auth=moderator.auth) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS - assert notifications['emits'][1]['type'] == NotificationType.Type.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS + assert notifications['emits'][1]['type'] == NotificationTypeEnum.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS messages = get_mailhog_messages() - assert messages['count'] == 1 - assert messages['items'][0]['Content']['Headers']['To'][0] == registration.creator.username + assert_emails(messages, notifications) delete_mailhog_messages() @@ -116,8 +115,8 @@ def test_get_provider_actions(self, app, provider_actions_url, registration, mod resp = app.get(provider_actions_url, auth=moderator.auth) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION - assert notifications['emits'][1]['type'] == NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION + assert notifications['emits'][1]['type'] == NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS send_users_instant_digest_email.delay() messages = get_mailhog_messages() assert messages['count'] == 1 diff --git a/api_tests/mailhog/test_mailhog.py b/api_tests/mailhog/test_mailhog.py index 998f588e452..6ef82c641a8 100644 --- a/api_tests/mailhog/test_mailhog.py +++ b/api_tests/mailhog/test_mailhog.py @@ -12,7 +12,7 @@ fake ) from framework import auth -from osf.models import OSFUser, NotificationType +from osf.models import OSFUser, NotificationType, NotificationTypeEnum from tests.base import ( OsfTestCase, ) @@ -28,7 +28,7 @@ class TestMailHog: def test_mailhog_received_mail(self): delete_mailhog_messages() - NotificationType.Type.USER_REGISTRATION_BULK_UPLOAD_FAILURE_ALL.instance.emit( + NotificationTypeEnum.USER_REGISTRATION_BULK_UPLOAD_FAILURE_ALL.instance.emit( message_frequency='instantly', destination_address='to_addr@mail.com', event_context={ @@ -44,7 +44,7 @@ def test_mailhog_received_mail(self): assert res['count'] == 1 assert res['items'][0]['Content']['Headers']['To'][0] == 'to_addr@mail.com' assert res['items'][0]['Content']['Headers']['Subject'][0] == NotificationType.objects.get( - name=NotificationType.Type.USER_REGISTRATION_BULK_UPLOAD_FAILURE_ALL + name=NotificationTypeEnum.USER_REGISTRATION_BULK_UPLOAD_FAILURE_ALL ).subject delete_mailhog_messages() diff --git a/api_tests/nodes/views/test_node_contributors_list.py b/api_tests/nodes/views/test_node_contributors_list.py index 93ea9378f4c..854f5288a14 100644 --- a/api_tests/nodes/views/test_node_contributors_list.py +++ b/api_tests/nodes/views/test_node_contributors_list.py @@ -6,7 +6,7 @@ from api.base.settings.defaults import API_BASE from api.nodes.serializers import NodeContributorsCreateSerializer from framework.auth.core import Auth -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from osf_tests.factories import ( fake_email, AuthUserFactory, @@ -1273,7 +1273,7 @@ def test_add_contributor_signal_if_default( res = app.post_json_api(url, payload, auth=user.auth) args, kwargs = mock_send.call_args assert res.status_code == 201 - assert NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT == kwargs['notification_type'] + assert NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT == kwargs['notification_type'] def test_add_contributor_signal_preprint_email_disallowed( self, app, user, user_two, url_project_contribs @@ -1311,7 +1311,7 @@ def test_add_unregistered_contributor_sends_email( ) assert res.status_code == 201 assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_INVITE_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_INVITE_DEFAULT @mock.patch('website.project.signals.unreg_contributor_added.send') def test_add_unregistered_contributor_signal_if_default( @@ -1333,7 +1333,7 @@ def test_add_unregistered_contributor_signal_if_default( ) assert res.status_code == 201 assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_INVITE_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_INVITE_DEFAULT def test_add_unregistered_contributor_signal_preprint_email_disallowed( self, app, user, url_project_contribs diff --git a/api_tests/nodes/views/test_node_detail_update.py b/api_tests/nodes/views/test_node_detail_update.py index de6bd55158e..b4000a31db6 100644 --- a/api_tests/nodes/views/test_node_detail_update.py +++ b/api_tests/nodes/views/test_node_detail_update.py @@ -8,7 +8,7 @@ from api_tests.nodes.views.utils import NodeCRUDTestCase from api_tests.subjects.mixins import UpdateSubjectsMixin from framework.auth.core import Auth -from osf.models import NodeLog, NotificationType +from osf.models import NodeLog, NotificationTypeEnum from osf.utils.sanitize import strip_html from osf.utils import permissions from osf_tests.factories import ( @@ -47,7 +47,7 @@ def test_node_institution_update(self, app, user_two, project_private, url_priva ] } } - with assert_notification(type=NotificationType.Type.NODE_AFFILIATION_CHANGED, user=user_two, times=2): + with assert_notification(type=NotificationTypeEnum.NODE_AFFILIATION_CHANGED, user=user_two, times=2): res = app.patch_json_api( url_private, make_node_payload( diff --git a/api_tests/nodes/views/test_node_forks_list.py b/api_tests/nodes/views/test_node_forks_list.py index e51d8f95bed..e892468e1ef 100644 --- a/api_tests/nodes/views/test_node_forks_list.py +++ b/api_tests/nodes/views/test_node_forks_list.py @@ -3,7 +3,7 @@ from api.base.settings.defaults import API_BASE from framework.auth.core import Auth -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from osf_tests.factories import ( NodeFactory, ProjectFactory, @@ -255,7 +255,7 @@ def test_create_fork_from_public_project_with_new_title( fork_data_with_title, public_project_url ): - with assert_notification(type=NotificationType.Type.NODE_FORK_COMPLETED, user=user): + with assert_notification(type=NotificationTypeEnum.NODE_FORK_COMPLETED, user=user): res = app.post_json_api( public_project_url, fork_data_with_title, @@ -273,7 +273,7 @@ def test_create_fork_from_private_project_with_new_title( fork_data_with_title, private_project_url ): - with assert_notification(type=NotificationType.Type.NODE_FORK_COMPLETED, user=user): + with assert_notification(type=NotificationTypeEnum.NODE_FORK_COMPLETED, user=user): res = app.post_json_api( private_project_url, fork_data_with_title, @@ -291,7 +291,7 @@ def test_can_fork_public_node_logged_in( public_project_url ): non_contrib = AuthUserFactory() - with assert_notification(type=NotificationType.Type.NODE_FORK_COMPLETED, user=non_contrib): + with assert_notification(type=NotificationTypeEnum.NODE_FORK_COMPLETED, user=non_contrib): res = app.post_json_api( public_project_url, fork_data, @@ -333,7 +333,7 @@ def test_cannot_fork_errors( def test_can_fork_public_node_logged_in_contributor( self, app, user, public_project, fork_data, public_project_url): - with assert_notification(type=NotificationType.Type.NODE_FORK_COMPLETED, user=user): + with assert_notification(type=NotificationTypeEnum.NODE_FORK_COMPLETED, user=user): res = app.post_json_api( public_project_url, fork_data, @@ -346,7 +346,7 @@ def test_can_fork_public_node_logged_in_contributor( def test_can_fork_private_node_logged_in_contributor( self, app, user, private_project, fork_data, private_project_url): - with assert_notification(type=NotificationType.Type.NODE_FORK_COMPLETED, user=user): + with assert_notification(type=NotificationTypeEnum.NODE_FORK_COMPLETED, user=user): res = app.post_json_api( private_project_url + '?embed=children&embed=node_links&embed=logs&embed=contributors&embed=forked_from', @@ -374,7 +374,7 @@ def test_fork_private_components_no_access( creator=user_two, is_public=False ) - with assert_notification(type=NotificationType.Type.NODE_FORK_COMPLETED, user=user_three): + with assert_notification(type=NotificationTypeEnum.NODE_FORK_COMPLETED, user=user_three): res = app.post_json_api(url, fork_data, auth=user_three.auth) assert res.status_code == 201 # Private components that you do not have access to are not forked @@ -385,7 +385,7 @@ def test_fork_components_you_can_access( fork_data, private_project_url): url = private_project_url + '?embed=children' new_component = NodeFactory(parent=private_project, creator=user) - with assert_notification(type=NotificationType.Type.NODE_FORK_COMPLETED, user=user): + with assert_notification(type=NotificationTypeEnum.NODE_FORK_COMPLETED, user=user): res = app.post_json_api(url, fork_data, auth=user.auth) assert res.status_code == 201 assert res.json['data']['embeds']['children']['links']['meta']['total'] == 1 @@ -403,7 +403,7 @@ def test_fork_private_node_links( url = private_project_url + '?embed=node_links' # Node link is forked, but shows up as a private node link - with assert_notification(type=NotificationType.Type.NODE_FORK_COMPLETED, user=user): + with assert_notification(type=NotificationTypeEnum.NODE_FORK_COMPLETED, user=user): res = app.post_json_api( url, fork_data, @@ -424,7 +424,7 @@ def test_fork_node_links_you_can_access( private_project.add_pointer(pointer, auth=Auth(user_two), save=True) url = private_project_url + '?embed=node_links' - with assert_notification(type=NotificationType.Type.NODE_FORK_COMPLETED, user=user): + with assert_notification(type=NotificationTypeEnum.NODE_FORK_COMPLETED, user=user): res = app.post_json_api( url, fork_data, @@ -440,7 +440,7 @@ def test_can_fork_registration( registration = RegistrationFactory(project=private_project, user=user) url = f'/{API_BASE}registrations/{registration._id}/forks/' - with assert_notification(type=NotificationType.Type.NODE_FORK_COMPLETED, user=user): + with assert_notification(type=NotificationTypeEnum.NODE_FORK_COMPLETED, user=user): res = app.post_json_api(url, fork_data, auth=user.auth) assert res.status_code == 201 assert res.json['data']['id'] == registration.forks.first()._id @@ -453,7 +453,7 @@ def test_read_only_contributor_can_fork_private_registration( private_project.add_contributor( read_contrib, permissions=permissions.READ, save=True) - with assert_notification(type=NotificationType.Type.NODE_FORK_COMPLETED, user=read_contrib): + with assert_notification(type=NotificationTypeEnum.NODE_FORK_COMPLETED, user=read_contrib): res = app.post_json_api( private_project_url, fork_data, @@ -464,7 +464,7 @@ def test_read_only_contributor_can_fork_private_registration( assert res.json['data']['id'] == private_project.forks.first()._id def test_send_email_success(self, app, user, public_project_url, fork_data_with_title, public_project): - with assert_notification(type=NotificationType.Type.NODE_FORK_COMPLETED, user=user): + with assert_notification(type=NotificationTypeEnum.NODE_FORK_COMPLETED, user=user): res = app.post_json_api( public_project_url, fork_data_with_title, @@ -477,7 +477,7 @@ def test_send_email_success(self, app, user, public_project_url, fork_data_with_ def test_send_email_failed(self, app, user, public_project_url, fork_data_with_title): with mock.patch.object(NodeForksSerializer, 'save', side_effect=Exception()): with pytest.raises(Exception): - with assert_notification(type=NotificationType.Type.NODE_FORK_FAILED, user=user): + with assert_notification(type=NotificationTypeEnum.NODE_FORK_FAILED, user=user): app.post_json_api( public_project_url, fork_data_with_title, diff --git a/api_tests/nodes/views/test_node_list.py b/api_tests/nodes/views/test_node_list.py index ddef9428952..ce6751c2c16 100644 --- a/api_tests/nodes/views/test_node_list.py +++ b/api_tests/nodes/views/test_node_list.py @@ -8,7 +8,7 @@ from api_tests.nodes.filters.test_filters import NodesListFilteringMixin, NodesListDateFilteringMixin from api_tests.subjects.mixins import SubjectsFilterMixin from framework.auth.core import Auth -from osf.models import AbstractNode, Node, NodeLog, NotificationType +from osf.models import AbstractNode, Node, NodeLog, NotificationTypeEnum from osf.models.licenses import NodeLicense from osf.utils.sanitize import strip_html from osf.utils import permissions @@ -1428,7 +1428,7 @@ def test_create_node_errors(self, app, user_one, public_project, private_project def test_creates_public_project_logged_in( self, app, user_one, public_project, url, institution_one): - with assert_notification(type=NotificationType.Type.NODE_AFFILIATION_CHANGED, user=user_one): + with assert_notification(type=NotificationTypeEnum.NODE_AFFILIATION_CHANGED, user=user_one): res = app.post_json_api( url, public_project, auth=user_one.auth @@ -1531,7 +1531,7 @@ def test_non_contributor_create_project_from_public_template_success(self, app, auth=user_without_permissions.auth ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST assert res.status_code == 201 def test_non_contributor_create_project_from_private_template_no_permission_fails(self, app, user_one, category, url): @@ -1576,7 +1576,7 @@ def test_contributor_create_project_from_private_template_with_permission_succes auth=user_without_permissions.auth ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST assert res.status_code == 201 assert template_from.has_permission(user_without_permissions, permissions.READ) @@ -1593,7 +1593,7 @@ def test_contributor_create_project_from_private_template_with_permission_succes auth=user_without_permissions.auth ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST assert res.status_code == 201 assert template_from.has_permission(user_without_permissions, permissions.WRITE) @@ -1610,7 +1610,7 @@ def test_contributor_create_project_from_private_template_with_permission_succes auth=user_without_permissions.auth ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST assert res.status_code == 201 assert template_from.has_permission(user_without_permissions, permissions.ADMIN) @@ -1759,7 +1759,7 @@ def test_create_project_with_region_relationship( } } } - with assert_notification(type=NotificationType.Type.NODE_AFFILIATION_CHANGED, user=user_one, times=2): + with assert_notification(type=NotificationTypeEnum.NODE_AFFILIATION_CHANGED, user=user_one, times=2): res = app.post_json_api( url, private_project, diff --git a/api_tests/nodes/views/test_node_relationship_institutions.py b/api_tests/nodes/views/test_node_relationship_institutions.py index fa0eeca1edb..475a03b0001 100644 --- a/api_tests/nodes/views/test_node_relationship_institutions.py +++ b/api_tests/nodes/views/test_node_relationship_institutions.py @@ -1,7 +1,7 @@ import pytest from api.base.settings.defaults import API_BASE -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf_tests.factories import ( InstitutionFactory, AuthUserFactory, @@ -198,7 +198,7 @@ def test_user_with_institution_and_permissions( ) assert len(notifications['emits']) == 2 assert notifications['emits'][0]['kwargs']['user'] == user - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert res.status_code == 201 data = res.json['data'] @@ -228,9 +228,9 @@ def test_user_with_institution_and_permissions_through_patch( assert len(notifications['emits']) == 2 assert notifications['emits'][0]['kwargs']['user'] == user - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert notifications['emits'][1]['kwargs']['user'] == user - assert notifications['emits'][1]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED def test_remove_institutions_with_affiliated_user( self, @@ -254,7 +254,7 @@ def test_remove_institutions_with_affiliated_user( assert len(notifications['emits']) == 1 assert notifications['emits'][0]['kwargs']['user'] == user - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert res.status_code == 200 assert node.affiliated_institutions.count() == 0 @@ -287,7 +287,7 @@ def test_put_not_admin_but_affiliated(self, app, institution_one, node, node_ins auth=user.auth ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert res.status_code == 200 assert institution_one in node.affiliated_institutions.all() @@ -314,7 +314,7 @@ def test_add_through_patch_one_inst_to_node_with_inst( ) assert len(notifications['emits']) == 1 assert notifications['emits'][0]['kwargs']['user'] == user - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert res.status_code == 200 assert institution_one in node.affiliated_institutions.all() @@ -342,10 +342,10 @@ def test_add_through_patch_one_inst_while_removing_other( ) assert len(notifications['emits']) == 2 assert notifications['emits'][0]['kwargs']['user'] == user - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert notifications['emits'][1]['kwargs']['user'] == user - assert notifications['emits'][1]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert res.status_code == 200 assert institution_one not in node.affiliated_institutions.all() @@ -373,7 +373,7 @@ def test_add_one_inst_with_post_to_node_with_inst( ) assert len(notifications['emits']) == 1 assert notifications['emits'][0]['kwargs']['user'] == user - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert res.status_code == 201 assert institution_one in node.affiliated_institutions.all() @@ -406,7 +406,7 @@ def test_delete_existing_inst( ) assert len(notifications['emits']) == 1 assert notifications['emits'][0]['kwargs']['user'] == user - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert res.status_code == 204 assert institution_one not in node.affiliated_institutions.all() @@ -426,7 +426,7 @@ def test_delete_not_affiliated_and_affiliated_insts( ) assert len(notifications['emits']) == 1 assert notifications['emits'][0]['kwargs']['user'] == user - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert res.status_code == 204 assert institution_one not in node.affiliated_institutions.all() @@ -444,7 +444,7 @@ def test_delete_user_is_admin(self, app, user, institution_one, node, resource_u ) assert len(notifications['emits']) == 1 assert notifications['emits'][0]['kwargs']['user'] == user - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert res.status_code == 204 @@ -488,7 +488,7 @@ def test_delete_user_is_admin_but_not_affiliated_with_inst(self, app, institutio auth=user_auth.auth, ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert res.status_code == 204 assert institution_one not in project.affiliated_institutions.all() @@ -509,7 +509,7 @@ def test_admin_can_add_affiliated_institution(self, app, user, institution_one, ) assert len(notifications['emits']) == 1 assert notifications['emits'][0]['kwargs']['user'] == user - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert res.status_code == 201 assert institution_one in node.affiliated_institutions.all() @@ -530,7 +530,7 @@ def test_admin_can_remove_admin_affiliated_institution( auth=user.auth ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert res.status_code == 204 assert institution_one not in node.affiliated_institutions.all() @@ -552,7 +552,7 @@ def test_admin_can_remove_read_write_contributor_affiliated_institution( auth=user.auth ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert res.status_code == 204 assert read_contrib_institution not in node.affiliated_institutions.all() @@ -572,7 +572,7 @@ def test_read_write_contributor_can_add_affiliated_institution( auth=write_contrib.auth ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert res.status_code == 201 assert write_contrib_institution in node.affiliated_institutions.all() @@ -594,7 +594,7 @@ def test_read_write_contributor_can_remove_affiliated_institution( auth=write_contrib.auth ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_AFFILIATION_CHANGED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_AFFILIATION_CHANGED assert res.status_code == 204 assert write_contrib_institution not in node.affiliated_institutions.all() diff --git a/api_tests/notifications/test_notification_digest.py b/api_tests/notifications/test_notification_digest.py index 70433f983c5..a1065c27604 100644 --- a/api_tests/notifications/test_notification_digest.py +++ b/api_tests/notifications/test_notification_digest.py @@ -1,7 +1,7 @@ import pytest from django.contrib.contenttypes.models import ContentType -from osf.models import Notification, NotificationType, EmailTask, Email +from osf.models import Notification, NotificationType, NotificationTypeEnum, EmailTask, Email from notifications.tasks import ( send_user_email_task, send_moderator_email_task, @@ -18,7 +18,7 @@ def add_notification_subscription(user, notification_type, frequency, subscribed Create a NotificationSubscription for a user. If the notification type corresponds to a subscribed_object, set subscribed_object to get the provider. """ - from osf.models import NotificationSubscription, AbstractProvider + from osf.models import NotificationSubscription kwargs = { 'user': user, 'notification_type': NotificationType.objects.get(name=notification_type), @@ -26,10 +26,7 @@ def add_notification_subscription(user, notification_type, frequency, subscribed } if subscribed_object is not None: kwargs['object_id'] = subscribed_object.id - if isinstance(subscribed_object, AbstractProvider): - kwargs['content_type'] = ContentType.objects.get_for_model(subscribed_object, for_concrete_model=False) if subscribed_object else None - else: - kwargs['content_type'] = ContentType.objects.get_for_model(subscribed_object) if subscribed_object else None + kwargs['content_type'] = ContentType.objects.get_for_model(subscribed_object) if subscription is not None: kwargs['object_id'] = subscription.id kwargs['content_type'] = ContentType.objects.get_for_model(subscription) @@ -41,14 +38,14 @@ class TestNotificationDigestTasks: def test_send_user_email_task_success(self): user = AuthUserFactory() - notification_type = NotificationType.objects.get(name=NotificationType.Type.USER_FILE_UPDATED) + notification_type = NotificationType.objects.get(name=NotificationTypeEnum.USER_FILE_UPDATED) subscription_type = add_notification_subscription( user, notification_type, 'daily', subscription=add_notification_subscription( user, - NotificationType.objects.get(name=NotificationType.Type.FILE_UPDATED), + NotificationType.objects.get(name=NotificationTypeEnum.FILE_UPDATED), 'daily' ) ) @@ -74,7 +71,7 @@ def test_send_user_email_task_success(self): with capture_notifications() as notifications: send_user_email_task.apply(args=(user._id, notification_ids)).get() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_DIGEST + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_DIGEST assert notifications['emits'][0]['kwargs']['user'] == user email_task = EmailTask.objects.get(user_id=user.id) assert email_task.status == 'SUCCESS' @@ -94,9 +91,9 @@ def test_send_user_email_task_user_disabled(self): user = AuthUserFactory() user.deactivate_account() user.save() - notification_type = NotificationType.objects.get(name=NotificationType.Type.USER_DIGEST) + notification_type = NotificationType.objects.get(name=NotificationTypeEnum.USER_DIGEST) notification = Notification.objects.create( - subscription=add_notification_subscription(user, NotificationType.Type.USER_FILE_UPDATED, notification_type), + subscription=add_notification_subscription(user, NotificationTypeEnum.USER_FILE_UPDATED, notification_type), sent=None, event_context={}, ) @@ -120,7 +117,7 @@ def test_send_moderator_email_task_registration_provider_admin(self): RegistrationFactory(provider=reg_provider) moderator_group = reg_provider.get_group('moderator') moderator_group.user_set.add(user) - notification_type = NotificationType.objects.get(name=NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS) + notification_type = NotificationType.objects.get(name=NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS) notification = Notification.objects.create( subscription=add_notification_subscription( user, @@ -143,7 +140,7 @@ def test_send_moderator_email_task_registration_provider_admin(self): with capture_notifications() as notifications: send_moderator_email_task.apply(args=(user._id, notification_ids, reg_provider_content_type.id, reg_provider.id)).get() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.DIGEST_REVIEWS_MODERATORS + assert notifications['emits'][0]['type'] == NotificationTypeEnum.DIGEST_REVIEWS_MODERATORS assert notifications['emits'][0]['kwargs']['user'] == user email_task = EmailTask.objects.filter(user_id=user.id).first() @@ -158,7 +155,7 @@ def test_send_moderator_email_task_no_notifications(self): RegistrationFactory(provider=provider) notification_ids = [] - notification_type = NotificationType.objects.get(name=NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS) + notification_type = NotificationType.objects.get(name=NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS) add_notification_subscription( user, notification_type, @@ -177,7 +174,7 @@ def test_send_moderator_email_task_user_not_found(self): def test_get_users_emails(self): user = AuthUserFactory() - notification_type = NotificationType.objects.get(name=NotificationType.Type.USER_FILE_UPDATED) + notification_type = NotificationType.objects.get(name=NotificationTypeEnum.USER_FILE_UPDATED) notification1 = Notification.objects.create( subscription=add_notification_subscription(user, notification_type, 'daily'), sent=None, @@ -193,7 +190,7 @@ def test_get_moderators_emails(self): user = AuthUserFactory() provider = RegistrationProviderFactory() reg = RegistrationFactory(provider=provider) - notification_type = NotificationType.objects.get(name=NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS) + notification_type = NotificationType.objects.get(name=NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS) subscription = add_notification_subscription(user, notification_type, 'daily', subscribed_object=reg) Notification.objects.create( subscription=subscription, @@ -209,14 +206,14 @@ def test_get_moderators_emails(self): def test_send_users_digest_email_end_to_end(self): user = AuthUserFactory() - notification_type = NotificationType.objects.get(name=NotificationType.Type.USER_FILE_UPDATED) + notification_type = NotificationType.objects.get(name=NotificationTypeEnum.USER_FILE_UPDATED) subscription_type = add_notification_subscription( user, notification_type, 'daily', subscription=add_notification_subscription( user, - NotificationType.objects.get(name=NotificationType.Type.FILE_UPDATED), + NotificationType.objects.get(name=NotificationTypeEnum.FILE_UPDATED), 'daily' ) ) @@ -246,7 +243,7 @@ def test_send_users_digest_email_end_to_end(self): with capture_notifications() as notifications: send_users_digest_email.delay() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_DIGEST + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_DIGEST email_task = EmailTask.objects.get(user_id=user.id) assert email_task.status == 'SUCCESS' @@ -256,7 +253,7 @@ def test_send_moderators_digest_email_end_to_end(self): RegistrationFactory(provider=provider) moderator_group = provider.get_group('moderator') moderator_group.user_set.add(user) - notification_type = NotificationType.objects.get(name=NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS) + notification_type = NotificationType.objects.get(name=NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS) Notification.objects.create( subscription=add_notification_subscription(user, notification_type, 'daily', subscribed_object=provider), sent=None, @@ -275,7 +272,7 @@ def test_send_moderators_digest_email_end_to_end(self): with capture_notifications() as notifications: send_moderators_digest_email.delay() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.DIGEST_REVIEWS_MODERATORS + assert notifications['emits'][0]['type'] == NotificationTypeEnum.DIGEST_REVIEWS_MODERATORS email_task = EmailTask.objects.filter(user_id=user.id).first() assert email_task.status == 'SUCCESS' @@ -288,7 +285,7 @@ def test_user_invalid_username_success(self): RegistrationFactory(provider=provider) notification_ids = [] - notification_type = NotificationType.objects.get(name=NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS) + notification_type = NotificationType.objects.get(name=NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS) add_notification_subscription( user, notification_type, @@ -309,7 +306,7 @@ def test_user_no_email_failure(self): RegistrationFactory(provider=provider) notification_ids = [] - notification_type = NotificationType.objects.get(name=NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS) + notification_type = NotificationType.objects.get(name=NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS) add_notification_subscription( user, notification_type, diff --git a/api_tests/notifications/test_notifications_cleanup.py b/api_tests/notifications/test_notifications_cleanup.py new file mode 100644 index 00000000000..848b142b740 --- /dev/null +++ b/api_tests/notifications/test_notifications_cleanup.py @@ -0,0 +1,189 @@ +import pytest +from osf.models import Notification, NotificationType, EmailTask, NotificationSubscription +from notifications.tasks import ( + notifications_cleanup_task +) +from osf_tests.factories import AuthUserFactory +from website.settings import NOTIFICATIONS_CLEANUP_AGE +from django.utils import timezone +from datetime import timedelta + +def create_notification(subscription, sent_date=None): + return Notification.objects.create( + subscription=subscription, + event_context={}, + sent=sent_date + ) + +def create_email_task(user, created_date): + et = EmailTask.objects.create( + task_id=f'test-{created_date.timestamp()}', + user=user, + status='SUCCESS', + ) + et.created_at = created_date + et.save() + return et + +@pytest.mark.django_db +class TestNotificationCleanUpTask: + + @pytest.fixture() + def user(self): + return AuthUserFactory() + + @pytest.fixture() + def notification_type(self): + return NotificationType.objects.get_or_create( + name='Test Notification', + subject='Hello', + template='Sample Template', + )[0] + + @pytest.fixture() + def subscription(self, user, notification_type): + return NotificationSubscription.objects.get_or_create( + user=user, + notification_type=notification_type, + message_frequency='daily', + )[0] + + def test_dry_run_does_not_delete_records(self, user, subscription): + now = timezone.now() + + old_notification = create_notification( + subscription, + sent_date=now - NOTIFICATIONS_CLEANUP_AGE - timedelta(days=1), + ) + old_email_task = create_email_task( + user, + created_date=now - NOTIFICATIONS_CLEANUP_AGE - timedelta(days=1), + ) + + notifications_cleanup_task(dry_run=True) + + assert Notification.objects.filter(id=old_notification.id).exists() + assert EmailTask.objects.filter(id=old_email_task.id).exists() + + def test_deletes_old_notifications_and_email_tasks(self, user, subscription): + now = timezone.now() + + old_notification = create_notification( + subscription, + sent_date=now - NOTIFICATIONS_CLEANUP_AGE - timedelta(days=1), + ) + new_notification = create_notification( + subscription, + sent_date=now - timedelta(days=10), + ) + + old_email_task = create_email_task( + user, + created_date=now - NOTIFICATIONS_CLEANUP_AGE - timedelta(days=1), + ) + new_email_task = create_email_task( + user, + created_date=now - timedelta(days=10), + ) + + notifications_cleanup_task() + + assert not Notification.objects.filter(id=old_notification.id).exists() + assert Notification.objects.filter(id=new_notification.id).exists() + + assert not EmailTask.objects.filter(id=old_email_task.id).exists() + assert EmailTask.objects.filter(id=new_email_task.id).exists() + + def test_records_at_cutoff_are_not_deleted(self, user, subscription): + now = timezone.now() + cutoff = now - NOTIFICATIONS_CLEANUP_AGE + timedelta(hours=1) + + notification = create_notification( + subscription, + sent_date=cutoff, + ) + email_task = create_email_task( + user, + created_date=cutoff, + ) + + notifications_cleanup_task() + + assert Notification.objects.filter(id=notification.id).exists() + assert EmailTask.objects.filter(id=email_task.id).exists() + + def test_cleanup_when_only_notifications_exist(self, user, subscription): + now = timezone.now() + + notification = create_notification( + subscription, + sent_date=now - NOTIFICATIONS_CLEANUP_AGE - timedelta(days=1), + ) + + notifications_cleanup_task() + + assert not Notification.objects.filter(id=notification.id).exists() + + def test_cleanup_when_only_email_tasks_exist(self, user, subscription): + now = timezone.now() + + email_task = create_email_task( + user, + created_date=now - NOTIFICATIONS_CLEANUP_AGE - timedelta(days=1), + ) + + notifications_cleanup_task() + + assert not EmailTask.objects.filter(id=email_task.id).exists() + + def test_task_is_idempotent(self, user, subscription): + now = timezone.now() + + create_notification( + subscription, + sent_date=now - NOTIFICATIONS_CLEANUP_AGE - timedelta(days=1), + ) + create_email_task( + user, + created_date=now - NOTIFICATIONS_CLEANUP_AGE - timedelta(days=1), + ) + + notifications_cleanup_task() + notifications_cleanup_task() + + assert Notification.objects.count() == 0 + assert EmailTask.objects.count() == 0 + + def test_recent_records_are_not_deleted(self, user, subscription): + now = timezone.now() + + create_notification( + subscription, + sent_date=now - NOTIFICATIONS_CLEANUP_AGE - timedelta(days=1), + ) + create_email_task( + user, + created_date=now - NOTIFICATIONS_CLEANUP_AGE - timedelta(days=1), + ) + create_notification( + subscription, + sent_date=now, + ) + create_email_task( + user, + created_date=now, + ) + + notifications_cleanup_task() + + assert Notification.objects.count() == 1 + assert EmailTask.objects.count() == 1 + + def test_not_sent_notifications_are_not_deleted(self, user, subscription): + create_notification(subscription) + create_notification(subscription) + create_notification(subscription) + + notifications_cleanup_task() + + assert Notification.objects.count() == 3 diff --git a/api_tests/notifications/test_notifications_db_transaction.py b/api_tests/notifications/test_notifications_db_transaction.py index dc09dd46487..8fb651de996 100644 --- a/api_tests/notifications/test_notifications_db_transaction.py +++ b/api_tests/notifications/test_notifications_db_transaction.py @@ -1,12 +1,14 @@ +from django.db import reset_queries, connection +from django.utils import timezone + import pytest + +from osf.models import Notification, NotificationTypeEnum, NotificationSubscription from osf_tests.factories import ( AuthUserFactory, NotificationTypeFactory ) -from datetime import datetime -from osf.models import Notification, NotificationType, NotificationSubscription from tests.utils import capture_notifications -from django.db import reset_queries, connection @pytest.mark.django_db @@ -25,9 +27,9 @@ def test_notification_type(self): ) def test_notification_type_cache(self): - NotificationType.Type.NODE_FILE_UPDATED.instance + NotificationTypeEnum.NODE_FILE_UPDATED.instance reset_queries() - NotificationType.Type.NODE_FILE_UPDATED.instance + NotificationTypeEnum.NODE_FILE_UPDATED.instance assert len(connection.queries) == 0 def test_emit_without_saving(self, user_one, test_notification_type): @@ -47,12 +49,21 @@ def test_emit_without_saving(self, user_one, test_notification_type): ).exists() def test_emit_frequency_none(self, user_one, test_notification_type): + assert not Notification.objects.filter( + subscription__notification_type=test_notification_type, + fake_sent=True + ).exists() + time_before = timezone.now() test_notification_type.emit( user=user_one, event_context={'notifications': 'test template for Test notification'}, message_frequency='none' ) - assert Notification.objects.filter( + time_after = timezone.now() + notifications = Notification.objects.filter( subscription__notification_type=test_notification_type, - sent=datetime(1000, 1, 1) - ).exists() + fake_sent=True + ) + assert notifications.exists() + assert notifications.count() == 1 + assert time_before < notifications.first().sent < time_after diff --git a/api_tests/preprints/views/test_preprint_contributors_list.py b/api_tests/preprints/views/test_preprint_contributors_list.py index 53da11cb453..f753245bdd8 100644 --- a/api_tests/preprints/views/test_preprint_contributors_list.py +++ b/api_tests/preprints/views/test_preprint_contributors_list.py @@ -7,7 +7,7 @@ from api.base.settings.defaults import API_BASE from api.nodes.serializers import NodeContributorsCreateSerializer from framework.auth.core import Auth -from osf.models import PreprintLog, NotificationType +from osf.models import PreprintLog, NotificationTypeEnum from osf_tests.factories import ( fake_email, AuthUserFactory, @@ -1418,7 +1418,7 @@ def test_add_contributor_signal_if_preprint( ) assert res.status_code == 201 assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PREPRINT_CONTRIBUTOR_ADDED_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PREPRINT_CONTRIBUTOR_ADDED_DEFAULT def test_add_contributor_signal_no_query_param( self, app, user, user_two, url_preprint_contribs): @@ -1444,7 +1444,7 @@ def test_add_contributor_signal_no_query_param( ) assert res.status_code == 201 assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PREPRINT_CONTRIBUTOR_ADDED_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PREPRINT_CONTRIBUTOR_ADDED_DEFAULT def test_add_unregistered_contributor_sends_email( self, app, user, url_preprint_contribs): @@ -1463,7 +1463,7 @@ def test_add_unregistered_contributor_sends_email( auth=user.auth ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_USER_INVITE_PREPRINT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_USER_INVITE_PREPRINT assert res.status_code == 201 def test_add_unregistered_contributor_signal_if_preprint(self, app, user, url_preprint_contribs): @@ -1483,7 +1483,7 @@ def test_add_unregistered_contributor_signal_if_preprint(self, app, user, url_pr ) assert res.status_code == 201 assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_USER_INVITE_PREPRINT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_USER_INVITE_PREPRINT def test_add_contributor_invalid_send_email_param(self, app, user, url_preprint_contribs): url = f'{url_preprint_contribs}?send_email=true' @@ -1529,7 +1529,7 @@ def test_publishing_preprint_sends_emails_to_contributors( user_two = AuthUserFactory() preprint_unpublished.add_contributor(user_two, permissions=permissions.WRITE, save=True) with capture_signals() as mock_signal: - with assert_notification(type=NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION, user=user): + with assert_notification(type=NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION, user=user): res = app.patch_json_api( url, { @@ -1564,7 +1564,7 @@ def test_contributor_added_signal_not_specified(self, app, user, url_preprint_co ) assert res.status_code == 201 assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_USER_INVITE_PREPRINT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_USER_INVITE_PREPRINT @pytest.mark.django_db class TestPreprintContributorBulkCreate(NodeCRUDTestCase): diff --git a/api_tests/preprints/views/test_preprint_detail_update.py b/api_tests/preprints/views/test_preprint_detail_update.py index b796da0f908..f3096cba10d 100644 --- a/api_tests/preprints/views/test_preprint_detail_update.py +++ b/api_tests/preprints/views/test_preprint_detail_update.py @@ -11,7 +11,7 @@ from osf.models import ( NodeLicense, PreprintContributor, - PreprintLog, NotificationType + PreprintLog, NotificationTypeEnum ) from osf.utils import permissions as osf_permissions from osf.utils.permissions import WRITE @@ -502,7 +502,7 @@ def test_update_contributors( self, mock_update_doi_metadata, app, user, preprint, url ): new_user = AuthUserFactory() - with assert_notification(type=NotificationType.Type.PREPRINT_CONTRIBUTOR_ADDED_DEFAULT, user=new_user): + with assert_notification(type=NotificationTypeEnum.PREPRINT_CONTRIBUTOR_ADDED_DEFAULT, user=new_user): res = app.post_json_api( url + 'contributors/', { @@ -602,7 +602,7 @@ def test_noncontrib_cannot_set_primary_file(self, app, user, preprint, url): def test_update_published(self, app, user): unpublished = PreprintFactory(creator=user, is_published=False) - with assert_notification(type=NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION, user=user): + with assert_notification(type=NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION, user=user): app.patch_json_api( f'/{API_BASE}preprints/{unpublished._id}/', build_preprint_update_payload( @@ -622,7 +622,7 @@ def test_update_published_does_not_make_node_public(self, app, user): project=project ) assert not unpublished.node.is_public - with assert_notification(type=NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION, user=user): + with assert_notification(type=NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION, user=user): app.patch_json_api( f'/{API_BASE}preprints/{unpublished._id}/', build_preprint_update_payload( diff --git a/api_tests/providers/collections/views/test_collections_provider_moderator_list.py b/api_tests/providers/collections/views/test_collections_provider_moderator_list.py index 249fb1365a2..ff0cc0035b7 100644 --- a/api_tests/providers/collections/views/test_collections_provider_moderator_list.py +++ b/api_tests/providers/collections/views/test_collections_provider_moderator_list.py @@ -1,7 +1,7 @@ import pytest from api.base.settings.defaults import API_BASE -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf_tests.factories import ( AuthUserFactory, CollectionProviderFactory, @@ -111,7 +111,7 @@ def test_POST_admin_success_existing_user(self, app, url, nonmoderator, moderato with capture_notifications() as notifications: res = app.post_json_api(url, payload, auth=admin.auth) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_MODERATOR_ADDED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_MODERATOR_ADDED assert res.status_code == 201 assert res.json['data']['id'] == nonmoderator._id assert res.json['data']['attributes']['permission_group'] == 'moderator' @@ -136,7 +136,7 @@ def test_POST_admin_failure_unreg_moderator(self, app, url, moderator, nonmodera assert res.status_code == 201 assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_CONFIRM_EMAIL_MODERATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_CONFIRM_EMAIL_MODERATION assert notifications['emits'][0]['kwargs']['user'].username == unreg_user['email'] def test_POST_admin_failure_invalid_group(self, app, url, nonmoderator, moderator, admin, provider): @@ -149,7 +149,7 @@ def test_POST_admin_success_email(self, app, url, nonmoderator, moderator, admin with capture_notifications() as notifications: res = app.post_json_api(url, payload, auth=admin.auth) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_CONFIRM_EMAIL_MODERATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_CONFIRM_EMAIL_MODERATION assert res.status_code == 201 assert len(res.json['data']['id']) == 5 assert res.json['data']['attributes']['permission_group'] == 'moderator' diff --git a/api_tests/providers/preprints/views/test_preprint_provider_moderator_list.py b/api_tests/providers/preprints/views/test_preprint_provider_moderator_list.py index 0703dcebc83..3d09d783320 100644 --- a/api_tests/providers/preprints/views/test_preprint_provider_moderator_list.py +++ b/api_tests/providers/preprints/views/test_preprint_provider_moderator_list.py @@ -1,7 +1,7 @@ import pytest from api.base.settings.defaults import API_BASE -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf_tests.factories import ( AuthUserFactory, PreprintProviderFactory, @@ -89,7 +89,7 @@ def test_list_post_admin_success_existing_user(self, app, url, nonmoderator, mod assert res.json['data']['id'] == nonmoderator._id assert res.json['data']['attributes']['permission_group'] == 'moderator' assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_MODERATOR_ADDED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_MODERATOR_ADDED def test_list_post_admin_failure_existing_moderator(self, app, url, moderator, admin): payload = self.create_payload(user_id=moderator._id, permission_group='moderator') diff --git a/api_tests/providers/tasks/test_bulk_upload.py b/api_tests/providers/tasks/test_bulk_upload.py index 2da245c50b8..4ebc5ac8c53 100644 --- a/api_tests/providers/tasks/test_bulk_upload.py +++ b/api_tests/providers/tasks/test_bulk_upload.py @@ -5,7 +5,7 @@ from osf.exceptions import RegistrationBulkCreationContributorError, RegistrationBulkCreationRowError from osf.models import RegistrationBulkUploadJob, RegistrationBulkUploadRow, RegistrationProvider, RegistrationSchema, \ - NotificationType + NotificationTypeEnum from osf.models.registration_bulk_upload_job import JobState from osf.models.registration_bulk_upload_row import RegistrationBulkUploadContributors from osf.utils.permissions import ADMIN, READ, WRITE @@ -331,7 +331,7 @@ def test_bulk_creation_done_full( with capture_notifications() as notifications: bulk_create_registrations(upload_job_done_full.id, dry_run=False) notification_types = [notifications['type'] for notifications in notifications['emits']] - assert NotificationType.Type.USER_REGISTRATION_BULK_UPLOAD_SUCCESS_ALL in notification_types + assert NotificationTypeEnum.USER_REGISTRATION_BULK_UPLOAD_SUCCESS_ALL in notification_types upload_job_done_full.reload() assert upload_job_done_full.state == JobState.DONE_FULL assert upload_job_done_full.email_sent @@ -359,7 +359,7 @@ def test_bulk_creation_done_partial( with capture_notifications() as notifications: bulk_create_registrations(upload_job_done_partial.id, dry_run=False) notification_types = [notifications['type'] for notifications in notifications['emits']] - assert NotificationType.Type.USER_REGISTRATION_BULK_UPLOAD_SUCCESS_PARTIAL in notification_types + assert NotificationTypeEnum.USER_REGISTRATION_BULK_UPLOAD_SUCCESS_PARTIAL in notification_types upload_job_done_partial.reload() assert upload_job_done_partial.state == JobState.DONE_PARTIAL assert upload_job_done_partial.email_sent @@ -387,7 +387,7 @@ def test_bulk_creation_done_error( with capture_notifications() as notifications: bulk_create_registrations(upload_job_done_error.id, dry_run=False) notification_types = [notifications['type'] for notifications in notifications['emits']] - assert NotificationType.Type.USER_REGISTRATION_BULK_UPLOAD_FAILURE_ALL in notification_types + assert NotificationTypeEnum.USER_REGISTRATION_BULK_UPLOAD_FAILURE_ALL in notification_types upload_job_done_error.reload() assert upload_job_done_error.state == JobState.DONE_ERROR diff --git a/api_tests/requests/views/test_node_request_institutional_access.py b/api_tests/requests/views/test_node_request_institutional_access.py index b351cbfd787..d8d8d520a44 100644 --- a/api_tests/requests/views/test_node_request_institutional_access.py +++ b/api_tests/requests/views/test_node_request_institutional_access.py @@ -2,7 +2,7 @@ from api.base.settings.defaults import API_BASE from api_tests.requests.mixins import NodeRequestTestMixin -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf_tests.factories import NodeFactory, InstitutionFactory, AuthUserFactory from osf.utils.workflows import DefaultStates, NodeRequestTypes @@ -141,7 +141,7 @@ def test_institutional_admin_can_make_institutional_request( """ Test that an institutional admin can make an institutional access request. """ - with assert_notification(type=NotificationType.Type.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): + with assert_notification(type=NotificationTypeEnum.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): res = app.post_json_api(url, create_payload, auth=institutional_admin.auth) assert res.status_code == 201 @@ -172,7 +172,7 @@ def test_institutional_admin_can_add_requested_permission( Test that an institutional admin can make an institutional access request with requested_permissions. """ create_payload['data']['attributes']['requested_permissions'] = 'admin' - with assert_notification(type=NotificationType.Type.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): + with assert_notification(type=NotificationTypeEnum.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): res = app.post_json_api(url, create_payload, auth=institutional_admin.auth) assert res.status_code == 201 @@ -243,7 +243,7 @@ def test_email_send_institutional_request_specific_email( project.save() # Perform the action - with assert_notification(type=NotificationType.Type.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): + with assert_notification(type=NotificationTypeEnum.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): res = app.post_json_api(url, create_payload, auth=institutional_admin.auth) # Ensure response is successful @@ -284,7 +284,7 @@ def test_email_sent_on_creation( """ Test that an email is sent to the appropriate recipients when an institutional access request is made. """ - with assert_notification(type=NotificationType.Type.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): + with assert_notification(type=NotificationTypeEnum.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): res = app.post_json_api(url, create_payload, auth=institutional_admin.auth) assert res.status_code == 201 @@ -302,7 +302,7 @@ def test_bcc_institutional_admin( Ensure BCC option works as expected, sending messages to sender giving them a copy for themselves. """ create_payload['data']['attributes']['bcc_sender'] = True - with assert_notification(type=NotificationType.Type.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): + with assert_notification(type=NotificationTypeEnum.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): res = app.post_json_api(url, create_payload, auth=institutional_admin.auth) assert res.status_code == 201 @@ -320,7 +320,7 @@ def test_reply_to_institutional_admin( Ensure reply-to option works as expected, allowing a reply to header be added to the email. """ create_payload['data']['attributes']['reply_to'] = True - with assert_notification(type=NotificationType.Type.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): + with assert_notification(type=NotificationTypeEnum.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): res = app.post_json_api(url, create_payload, auth=institutional_admin.auth) assert res.status_code == 201 @@ -354,7 +354,7 @@ def test_placeholder_text_when_comment_is_empty( """ # Test with empty comment create_payload['data']['attributes']['comment'] = '' - with assert_notification(type=NotificationType.Type.NODE_INSTITUTIONAL_ACCESS_REQUEST, + with assert_notification(type=NotificationTypeEnum.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): res = app.post_json_api(url, create_payload, auth=institutional_admin.auth) assert res.status_code == 201 @@ -372,19 +372,19 @@ def test_requester_can_resubmit( Test that a requester can submit another access request for the same node. """ # Create the first request - with assert_notification(type=NotificationType.Type.NODE_INSTITUTIONAL_ACCESS_REQUEST, + with assert_notification(type=NotificationTypeEnum.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): app.post_json_api(url, create_payload, auth=institutional_admin.auth) node_request = project.requests.get() - with assert_notification(type=NotificationType.Type.NODE_REQUEST_ACCESS_DENIED, + with assert_notification(type=NotificationTypeEnum.NODE_REQUEST_ACCESS_DENIED, user=node_request.creator): node_request.run_reject(project.creator, 'test comment2') node_request.refresh_from_db() assert node_request.machine_state == 'rejected' # Attempt to create a second request - with assert_notification(type=NotificationType.Type.NODE_INSTITUTIONAL_ACCESS_REQUEST, + with assert_notification(type=NotificationTypeEnum.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): res = app.post_json_api(url, create_payload, auth=institutional_admin.auth) assert res.status_code == 201 @@ -406,11 +406,11 @@ def test_requester_can_make_insti_request_after_access_resubmit( """ # Create the first request a basic request_type == `access` request - with assert_notification(type=NotificationType.Type.NODE_REQUEST_ACCESS_SUBMITTED, + with assert_notification(type=NotificationTypeEnum.NODE_REQUEST_ACCESS_SUBMITTED, user=project.creator): app.post_json_api(url, create_payload_non_institutional_access, auth=institutional_admin.auth) node_request = project.requests.get() - with assert_notification(type=NotificationType.Type.NODE_REQUEST_ACCESS_DENIED, + with assert_notification(type=NotificationTypeEnum.NODE_REQUEST_ACCESS_DENIED, user=node_request.creator): node_request.run_reject(project.creator, 'test comment2') node_request.refresh_from_db() @@ -421,7 +421,7 @@ def test_requester_can_make_insti_request_after_access_resubmit( create_payload['data']['relationships']['message_recipient']['data']['id'] = project.creator._id # Attempt to create a second request, refresh and update as institutional - with assert_notification(type=NotificationType.Type.NODE_INSTITUTIONAL_ACCESS_REQUEST, + with assert_notification(type=NotificationTypeEnum.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=project.creator): res = app.post_json_api(url, create_payload, auth=institutional_admin.auth) assert res.status_code == 201 @@ -441,12 +441,12 @@ def test_requester_can_resubmit_after_approval( Test that a requester can submit another access request for the same node. """ # Create the first request - with assert_notification(type=NotificationType.Type.NODE_INSTITUTIONAL_ACCESS_REQUEST, + with assert_notification(type=NotificationTypeEnum.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): app.post_json_api(url, create_payload, auth=institutional_admin.auth) node_request = project.requests.get() - with assert_notification(type=NotificationType.Type.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST, + with assert_notification(type=NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST, user=node_request.creator): node_request.run_accept(project.creator, 'test comment2') node_request.refresh_from_db() @@ -456,7 +456,7 @@ def test_requester_can_resubmit_after_approval( node_request = project.requests.get() # Attempt to create a second request - with assert_notification(type=NotificationType.Type.NODE_INSTITUTIONAL_ACCESS_REQUEST, + with assert_notification(type=NotificationTypeEnum.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): res = app.post_json_api(url, create_payload, auth=institutional_admin.auth) assert res.status_code == 201 @@ -468,12 +468,12 @@ def test_requester_can_resubmit_after_2_approvals(self, app, project, institutio Test that a requester can submit another access request for the same node. """ # Create the first request - with assert_notification(type=NotificationType.Type.NODE_INSTITUTIONAL_ACCESS_REQUEST, + with assert_notification(type=NotificationTypeEnum.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): app.post_json_api(url, create_payload, auth=institutional_admin.auth) node_request = project.requests.get() - with assert_notification(type=NotificationType.Type.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST, + with assert_notification(type=NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST, user=node_request.creator): node_request.run_accept(project.creator, 'test comment2') node_request.refresh_from_db() @@ -482,7 +482,7 @@ def test_requester_can_resubmit_after_2_approvals(self, app, project, institutio project.remove_contributor(node_request.creator, Auth(node_request.creator)) # Attempt to create a second request - with assert_notification(type=NotificationType.Type.NODE_INSTITUTIONAL_ACCESS_REQUEST, + with assert_notification(type=NotificationTypeEnum.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): res = app.post_json_api(url, create_payload, auth=institutional_admin.auth) assert res.status_code == 201 @@ -493,7 +493,7 @@ def test_requester_can_resubmit_after_2_approvals(self, app, project, institutio assert project.requests.all().count() == 1 # Attempt to create a second request - with assert_notification(type=NotificationType.Type.NODE_INSTITUTIONAL_ACCESS_REQUEST, + with assert_notification(type=NotificationTypeEnum.NODE_INSTITUTIONAL_ACCESS_REQUEST, user=user_with_affiliation): res = app.post_json_api(url, create_payload, auth=institutional_admin.auth) assert res.status_code == 201 diff --git a/api_tests/requests/views/test_node_request_institutional_access_logging.py b/api_tests/requests/views/test_node_request_institutional_access_logging.py index 903422037bd..b4675058c24 100644 --- a/api_tests/requests/views/test_node_request_institutional_access_logging.py +++ b/api_tests/requests/views/test_node_request_institutional_access_logging.py @@ -3,7 +3,7 @@ from api.base.settings.defaults import API_BASE from osf_tests.factories import NodeFactory, InstitutionFactory, AuthUserFactory -from osf.models import NodeLog, NodeRequest, NotificationType +from osf.models import NodeLog, NodeRequest, NotificationTypeEnum from osf.utils.workflows import NodeRequestTypes from tests.utils import assert_notification @@ -70,7 +70,7 @@ def test_post_node_request_action_success_logged_as_curator(self, app, action_pa Test a successful POST request to create a node-request action and log it. """ # Perform the POST request - with assert_notification(type=NotificationType.Type.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST, user=institutional_admin): + with assert_notification(type=NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST, user=institutional_admin): res = app.post_json_api(url, action_payload, auth=user_with_affiliation.auth) assert res.status_code == 201 assert res.json['data']['attributes']['trigger'] == 'accept' @@ -92,7 +92,7 @@ def test_post_node_request_action_reject_curator(self, app, action_payload, url, """ # Perform the POST request action_payload['data']['attributes']['trigger'] = 'reject' - with assert_notification(type=NotificationType.Type.NODE_REQUEST_ACCESS_DENIED, user=institutional_admin): + with assert_notification(type=NotificationTypeEnum.NODE_REQUEST_ACCESS_DENIED, user=institutional_admin): res = app.post_json_api(url, action_payload, auth=user_with_affiliation.auth) assert res.status_code == 201 assert res.json['data']['attributes']['trigger'] == 'reject' diff --git a/api_tests/requests/views/test_node_request_list.py b/api_tests/requests/views/test_node_request_list.py index 6dafdb18a0d..5067005b78f 100644 --- a/api_tests/requests/views/test_node_request_list.py +++ b/api_tests/requests/views/test_node_request_list.py @@ -2,7 +2,7 @@ from api.base.settings.defaults import API_BASE from api_tests.requests.mixins import NodeRequestTestMixin -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf_tests.factories import NodeFactory, NodeRequestFactory, InstitutionFactory from osf.utils.workflows import DefaultStates, NodeRequestTypes @@ -90,8 +90,8 @@ def test_email_sent_to_all_admins_on_submit(self, app, project, noncontrib, url, res = app.post_json_api(url, create_payload, auth=noncontrib.auth) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_REQUEST_ACCESS_SUBMITTED - assert notifications['emits'][1]['type'] == NotificationType.Type.NODE_REQUEST_ACCESS_SUBMITTED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_REQUEST_ACCESS_SUBMITTED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.NODE_REQUEST_ACCESS_SUBMITTED assert res.status_code == 201 def test_email_not_sent_to_parent_admins_on_submit(self, app, project, noncontrib, url, create_payload, second_admin): @@ -105,7 +105,7 @@ def test_email_not_sent_to_parent_admins_on_submit(self, app, project, noncontri auth=noncontrib.auth ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_REQUEST_ACCESS_SUBMITTED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_REQUEST_ACCESS_SUBMITTED assert res.status_code == 201 assert component.parent_admin_contributors.count() == 1 assert component.contributors.count() == 1 @@ -156,7 +156,7 @@ def test_requester_can_make_access_request_after_insti_access_accepted(self, app # Create the first request a basic request_type == `institutional_request` request app.post_json_api(url, create_payload, auth=noncontrib.auth) node_request = project.requests.get() - with assert_notification(type=NotificationType.Type.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST, user=node_request.creator): + with assert_notification(type=NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST, user=node_request.creator): node_request.run_accept(project.creator, 'test comment2') node_request.refresh_from_db() assert node_request.machine_state == 'accepted' @@ -166,7 +166,7 @@ def test_requester_can_make_access_request_after_insti_access_accepted(self, app create_payload['data']['attributes']['request_type'] = NodeRequestTypes.ACCESS.value # Attempt to create a second request, refresh and update as institutional - with assert_notification(type=NotificationType.Type.NODE_REQUEST_ACCESS_SUBMITTED, user=project.creator): + with assert_notification(type=NotificationTypeEnum.NODE_REQUEST_ACCESS_SUBMITTED, user=project.creator): res = app.post_json_api(url, create_payload, auth=noncontrib.auth) assert res.status_code == 201 node_request.refresh_from_db() diff --git a/api_tests/requests/views/test_request_actions_create.py b/api_tests/requests/views/test_request_actions_create.py index ba1e9ef6409..26661048617 100644 --- a/api_tests/requests/views/test_request_actions_create.py +++ b/api_tests/requests/views/test_request_actions_create.py @@ -2,7 +2,7 @@ from api.base.settings.defaults import API_BASE from api_tests.requests.mixins import NodeRequestTestMixin, PreprintRequestTestMixin -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf.utils import permissions from tests.utils import capture_notifications, assert_notification @@ -201,7 +201,7 @@ def test_email_sent_on_approve(self, app, admin, url, node_request): with capture_notifications() as notifications: res = app.post_json_api(url, payload, auth=admin.auth) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST assert res.status_code == 201 node_request.reload() assert initial_state != node_request.machine_state @@ -214,7 +214,7 @@ def test_email_sent_on_reject(self, app, admin, url, node_request): with capture_notifications() as notifications: res = app.post_json_api(url, payload, auth=admin.auth) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_REQUEST_ACCESS_DENIED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_REQUEST_ACCESS_DENIED assert res.status_code == 201 node_request.reload() @@ -326,7 +326,7 @@ def test_moderator_can_approve_moderated_requests(self, app, moderator, url, pre initial_state = request.machine_state assert not request.target.is_retracted payload = self.create_payload(request._id, trigger='accept') - with assert_notification(type=NotificationType.Type.PREPRINT_REQUEST_WITHDRAWAL_APPROVED, user=request.target.creator): + with assert_notification(type=NotificationTypeEnum.PREPRINT_REQUEST_WITHDRAWAL_APPROVED, user=request.target.creator): res = app.post_json_api(url, payload, auth=moderator.auth) assert res.status_code == 201 request.reload() @@ -363,7 +363,7 @@ def test_moderator_can_reject_moderated_requests(self, app, moderator, url, pre_ initial_state = request.machine_state assert not request.target.is_retracted payload = self.create_payload(request._id, trigger='reject') - with assert_notification(type=NotificationType.Type.PREPRINT_REQUEST_WITHDRAWAL_DECLINED, user=request.target.creator): + with assert_notification(type=NotificationTypeEnum.PREPRINT_REQUEST_WITHDRAWAL_DECLINED, user=request.target.creator): res = app.post_json_api(url, payload, auth=moderator.auth) assert res.status_code == 201 request.reload() @@ -402,8 +402,8 @@ def test_email_sent_on_approve(self, app, moderator, url, pre_request, post_requ with capture_notifications() as notifications: res = app.post_json_api(url, payload, auth=moderator.auth) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.PREPRINT_REQUEST_WITHDRAWAL_APPROVED - assert notifications['emits'][1]['type'] == NotificationType.Type.PREPRINT_REQUEST_WITHDRAWAL_APPROVED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PREPRINT_REQUEST_WITHDRAWAL_APPROVED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.PREPRINT_REQUEST_WITHDRAWAL_APPROVED assert res.status_code == 201 request.reload() request.target.reload() diff --git a/api_tests/share/test_share_preprint.py b/api_tests/share/test_share_preprint.py index cf0c8a3d92d..118abf3105b 100644 --- a/api_tests/share/test_share_preprint.py +++ b/api_tests/share/test_share_preprint.py @@ -18,6 +18,7 @@ from website import settings from website.preprints.tasks import on_preprint_updated from ._utils import expect_preprint_ingest_request +from tests.utils import capture_notifications @pytest.mark.django_db @@ -72,54 +73,59 @@ def test_save_unpublished_not_called(self, mock_share_responses, preprint): preprint.save() def test_save_published_called(self, mock_share_responses, preprint, user, auth): - with expect_preprint_ingest_request(mock_share_responses, preprint): - preprint.set_published(True, auth=auth, save=True) + with capture_notifications(): + with expect_preprint_ingest_request(mock_share_responses, preprint): + preprint.set_published(True, auth=auth, save=True) # This covers an edge case where a preprint is forced back to unpublished # that it sends the information back to share def test_save_unpublished_called_forced(self, mock_share_responses, auth, preprint): - with expect_preprint_ingest_request(mock_share_responses, preprint): - preprint.set_published(True, auth=auth, save=True) - with expect_preprint_ingest_request(mock_share_responses, preprint, delete=True): - preprint.is_published = False - preprint.save(**{'force_update': True}) + with capture_notifications(): + with expect_preprint_ingest_request(mock_share_responses, preprint): + preprint.set_published(True, auth=auth, save=True) + with expect_preprint_ingest_request(mock_share_responses, preprint, delete=True): + preprint.is_published = False + preprint.save(**{'force_update': True}) def test_save_published_subject_change_called(self, mock_share_responses, auth, preprint, subject, subject_two): - preprint.set_published(True, auth=auth, save=True) - with expect_preprint_ingest_request(mock_share_responses, preprint): - preprint.set_subjects([[subject_two._id]], auth=auth) + with capture_notifications(): + preprint.set_published(True, auth=auth, save=True) + with expect_preprint_ingest_request(mock_share_responses, preprint): + preprint.set_subjects([[subject_two._id]], auth=auth) def test_save_unpublished_subject_change_not_called(self, mock_share_responses, auth, preprint, subject_two): with expect_preprint_ingest_request(mock_share_responses, preprint, delete=True): preprint.set_subjects([[subject_two._id]], auth=auth) def test_send_to_share_is_true(self, mock_share_responses, auth, preprint): - preprint.set_published(True, auth=auth, save=True) - with expect_preprint_ingest_request(mock_share_responses, preprint): - on_preprint_updated(preprint._id, saved_fields=['title']) + with capture_notifications(): + preprint.set_published(True, auth=auth, save=True) + with expect_preprint_ingest_request(mock_share_responses, preprint): + on_preprint_updated(preprint._id, saved_fields=['title']) def test_preprint_contributor_changes_updates_preprints_share(self, mock_share_responses, user, auth): - preprint = PreprintFactory(is_published=True, creator=user) - preprint.set_published(True, auth=auth, save=True) - user2 = AuthUserFactory() + with capture_notifications(): + preprint = PreprintFactory(is_published=True, creator=user) + preprint.set_published(True, auth=auth, save=True) + user2 = AuthUserFactory() - with expect_preprint_ingest_request(mock_share_responses, preprint): - preprint.add_contributor(contributor=user2, auth=auth, save=True) + with expect_preprint_ingest_request(mock_share_responses, preprint): + preprint.add_contributor(contributor=user2, auth=auth, save=True) - with expect_preprint_ingest_request(mock_share_responses, preprint): - preprint.move_contributor(contributor=user, index=0, auth=auth, save=True) + with expect_preprint_ingest_request(mock_share_responses, preprint): + preprint.move_contributor(contributor=user, index=0, auth=auth, save=True) - data = [{'id': user._id, 'permissions': ADMIN, 'visible': True}, - {'id': user2._id, 'permissions': WRITE, 'visible': False}] + data = [{'id': user._id, 'permissions': ADMIN, 'visible': True}, + {'id': user2._id, 'permissions': WRITE, 'visible': False}] - with expect_preprint_ingest_request(mock_share_responses, preprint): - preprint.manage_contributors(data, auth=auth, save=True) + with expect_preprint_ingest_request(mock_share_responses, preprint): + preprint.manage_contributors(data, auth=auth, save=True) - with expect_preprint_ingest_request(mock_share_responses, preprint): - preprint.update_contributor(user2, READ, True, auth=auth, save=True) + with expect_preprint_ingest_request(mock_share_responses, preprint): + preprint.update_contributor(user2, READ, True, auth=auth, save=True) - with expect_preprint_ingest_request(mock_share_responses, preprint): - preprint.remove_contributor(contributor=user2, auth=auth) + with expect_preprint_ingest_request(mock_share_responses, preprint): + preprint.remove_contributor(contributor=user2, auth=auth) @pytest.mark.skip('Synchronous retries not supported if celery >=5.0') def test_call_async_update_on_500_failure(self, mock_share_responses, preprint, auth): @@ -129,10 +135,11 @@ def test_call_async_update_on_500_failure(self, mock_share_responses, preprint, preprint.update_search() def test_no_call_async_update_on_400_failure(self, mock_share_responses, preprint, auth): - mock_share_responses.replace(responses.POST, shtrove_ingest_url(), status=400) - preprint.set_published(True, auth=auth, save=True) - with expect_preprint_ingest_request(mock_share_responses, preprint, count=1, error_response=True): - preprint.update_search() + with capture_notifications(): + mock_share_responses.replace(responses.POST, shtrove_ingest_url(), status=400) + preprint.set_published(True, auth=auth, save=True) + with expect_preprint_ingest_request(mock_share_responses, preprint, count=1, error_response=True): + preprint.update_search() def test_delete_from_share(self, mock_share_responses): preprint = PreprintFactory() diff --git a/api_tests/subscriptions/views/test_subscriptions_detail.py b/api_tests/subscriptions/views/test_subscriptions_detail.py index f14ca4e2522..a7246bbbd19 100644 --- a/api_tests/subscriptions/views/test_subscriptions_detail.py +++ b/api_tests/subscriptions/views/test_subscriptions_detail.py @@ -1,11 +1,18 @@ import pytest + from django.contrib.contenttypes.models import ContentType from api.base.settings.defaults import API_BASE -from osf.models import NotificationType +from osf.models import ( + AbstractNode, + NotificationSubscription, + NotificationTypeEnum, + OSFUser +) from osf_tests.factories import ( AuthUserFactory, - NotificationSubscriptionFactory + NodeFactory, + NotificationSubscriptionFactory, ) @pytest.mark.django_db @@ -16,22 +23,83 @@ def user(self): return AuthUserFactory() @pytest.fixture() - def user_no_auth(self): + def user_missing_subscriptions(self): + return AuthUserFactory() + + @pytest.fixture() + def user_no_permission(self): return AuthUserFactory() @pytest.fixture() - def notification(self, user): + def node(self, user): + return NodeFactory(creator=user) + + @pytest.fixture() + def node_missing_subscriptions(self, user_missing_subscriptions): + node = NodeFactory(creator=user_missing_subscriptions) + subscription = NotificationSubscription.objects.get( + user=user_missing_subscriptions, + notification_type__name=NotificationTypeEnum.NODE_FILE_UPDATED.value, + object_id=node.id, + content_type=ContentType.objects.get_for_model(AbstractNode) + ) + subscription.delete() + return node + + @pytest.fixture() + def notification_user_global_file_updated(self, user): + return NotificationSubscriptionFactory( + notification_type=NotificationTypeEnum.USER_FILE_UPDATED.instance, + object_id=user.id, + content_type_id=ContentType.objects.get_for_model(OSFUser).id, + user=user, + _is_digest=True, + message_frequency='daily', + ) + + @pytest.fixture() + def notification_user_global_reviews(self, user): return NotificationSubscriptionFactory( - notification_type=NotificationType.Type.USER_FILE_UPDATED.instance, + notification_type=NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS.instance, object_id=user.id, - content_type_id=ContentType.objects.get_for_model(user).id, - user=user + content_type_id=ContentType.objects.get_for_model(OSFUser).id, + user=user, + _is_digest=True, + message_frequency='daily', ) @pytest.fixture() - def url(self, user): + def url_user_global_file_updated(self, user): return f'/{API_BASE}subscriptions/{user._id}_global_file_updated/' + @pytest.fixture() + def url_user_global_reviews(self, user): + return f'/{API_BASE}subscriptions/{user._id}_global_reviews/' + + @pytest.fixture() + def url_user_global_file_updated_missing(self, user_missing_subscriptions): + return f'/{API_BASE}subscriptions/{user_missing_subscriptions._id}_global_file_updated/' + + @pytest.fixture() + def url_user_global_reviews_missing(self, user_missing_subscriptions): + return f'/{API_BASE}subscriptions/{user_missing_subscriptions._id}_global_reviews/' + + @pytest.fixture() + def url_node_file_updated(self, node): + return f'/{API_BASE}subscriptions/{node._id}_file_updated/' + + @pytest.fixture() + def url_node_file_updated_not_found(self): + return f'/{API_BASE}subscriptions/12345_file_updated/' + + @pytest.fixture() + def url_node_file_updated_without_permission(self, node_without_permission): + return f'/{API_BASE}subscriptions/{node_without_permission._id}_file_updated/' + + @pytest.fixture() + def url_node_file_updated_missing(self, node_missing_subscriptions): + return f'/{API_BASE}subscriptions/{node_missing_subscriptions._id}_file_updated/' + @pytest.fixture() def url_invalid(self): return f'/{API_BASE}subscriptions/invalid-notification-id/' @@ -58,40 +126,158 @@ def payload_invalid(self): } } - def test_subscription_detail_invalid_user(self, app, user, user_no_auth, notification, url, payload): - res = app.get( - url, - auth=user_no_auth.auth, - expect_errors=True - ) + def test_user_global_subscription_detail_permission_denied( + self, + app, + user, + user_no_permission, + notification_user_global_file_updated, + notification_user_global_reviews, + url_user_global_file_updated, + url_user_global_reviews + ): + res = app.get(url_user_global_file_updated, auth=user_no_permission.auth, expect_errors=True) + assert res.status_code == 403 + res = app.get(url_user_global_reviews, auth=user_no_permission.auth, expect_errors=True) assert res.status_code == 403 - def test_subscription_detail_no_user( - self, app, user, user_no_auth, notification, url, url_invalid, payload, payload_invalid + def test_user_global_subscription_detail_forbidden( + self, + app, + user, + user_no_permission, + notification_user_global_file_updated, + notification_user_global_reviews, + url_user_global_file_updated, + url_user_global_reviews ): - res = app.get( - url, - expect_errors=True - ) + res = app.get(url_user_global_file_updated, expect_errors=True) + assert res.status_code == 401 + res = app.get(url_user_global_reviews, expect_errors=True) assert res.status_code == 401 - def test_subscription_detail_valid_user( - self, app, user, user_no_auth, notification, url, url_invalid, payload, payload_invalid + def test_user_global_subscription_detail_success( + self, + app, + user, + user_no_permission, + notification_user_global_file_updated, + notification_user_global_reviews, + url_user_global_file_updated, + url_user_global_reviews ): - - res = app.get(url, auth=user.auth) + res = app.get(url_user_global_file_updated, auth=user.auth) notification_id = res.json['data']['id'] assert res.status_code == 200 assert notification_id == f'{user._id}_global_file_updated' + res = app.get(url_user_global_reviews, auth=user.auth) + notification_id = res.json['data']['id'] + assert res.status_code == 200 + assert notification_id == f'{user._id}_global_reviews' + + def test_user_global_file_updated_subscription_detail_missing_and_created( + self, + app, + user_missing_subscriptions, + url_user_global_file_updated_missing, + ): + assert not NotificationSubscription.objects.filter( + user=user_missing_subscriptions, + notification_type__name=NotificationTypeEnum.USER_FILE_UPDATED.value, + object_id=user_missing_subscriptions.id, + content_type=ContentType.objects.get_for_model(OSFUser) + ).exists() + res = app.get(url_user_global_file_updated_missing, auth=user_missing_subscriptions.auth) + notification_id = res.json['data']['id'] + assert res.status_code == 200 + assert notification_id == f'{user_missing_subscriptions._id}_global_file_updated' + + def test_user_global_reviews_subscription_detail_missing_and_created( + self, + app, + user_missing_subscriptions, + url_user_global_reviews_missing, + ): + assert not NotificationSubscription.objects.filter( + user=user_missing_subscriptions, + notification_type__name=NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS.value, + object_id=user_missing_subscriptions.id, + content_type=ContentType.objects.get_for_model(OSFUser) + ).exists() + res = app.get(url_user_global_reviews_missing, auth=user_missing_subscriptions.auth) + notification_id = res.json['data']['id'] + assert res.status_code == 200 + assert notification_id == f'{user_missing_subscriptions._id}_global_reviews' + + def test_node_file_updated_subscription_detail_success( + self, + app, + user, + node, + url_node_file_updated + ): + res = app.get(url_node_file_updated, auth=user.auth) + notification_id = res.json['data']['id'] + assert res.status_code == 200 + assert notification_id == f'{node._id}_file_updated' + + def test_node_file_updated_subscription_detail_missing_and_created( + self, + app, + user_missing_subscriptions, + node_missing_subscriptions, + url_node_file_updated_missing, + ): + assert not NotificationSubscription.objects.filter( + user=user_missing_subscriptions, + notification_type__name=NotificationTypeEnum.NODE_FILE_UPDATED.value, + object_id=node_missing_subscriptions.id, + content_type=ContentType.objects.get_for_model(AbstractNode) + ).exists() + res = app.get(url_node_file_updated_missing, auth=user_missing_subscriptions.auth) + notification_id = res.json['data']['id'] + assert res.status_code == 200 + assert notification_id == f'{node_missing_subscriptions._id}_file_updated' + + def test_node_file_updated_subscription_detail_not_found( + self, + app, + user, + node, + url_node_file_updated_not_found + ): + res = app.get(url_node_file_updated_not_found, auth=user.auth, expect_errors=True) + assert res.status_code == 404 + + def test_node_file_updated_subscription_detail_permission_denied( + self, + app, + user, + user_no_permission, + node, + url_node_file_updated + ): + res = app.get(url_node_file_updated, auth=user_no_permission.auth, expect_errors=True) + assert res.status_code == 403 + + def test_node_file_updated_subscription_detail_forbidden( + self, + app, + user, + node, + url_node_file_updated + ): + res = app.get(url_node_file_updated, expect_errors=True) + assert res.status_code == 401 def test_subscription_detail_invalid_notification_id_no_user( - self, app, user, user_no_auth, notification, url, url_invalid, payload, payload_invalid + self, app, user, user_no_permission, notification_user_global_file_updated, url_user_global_file_updated, url_invalid, payload, payload_invalid ): res = app.get(url_invalid, expect_errors=True) assert res.status_code == 404 def test_subscription_detail_invalid_notification_id_existing_user( - self, app, user, user_no_auth, notification, url, url_invalid, payload, payload_invalid + self, app, user, user_no_permission, notification_user_global_file_updated, url_user_global_file_updated, url_invalid, payload, payload_invalid ): res = app.get( url_invalid, @@ -101,22 +287,22 @@ def test_subscription_detail_invalid_notification_id_existing_user( assert res.status_code == 404 def test_subscription_detail_invalid_payload_403( - self, app, user, user_no_auth, notification, url, url_invalid, payload, payload_invalid + self, app, user, user_no_permission, notification_user_global_file_updated, url_user_global_file_updated, url_invalid, payload, payload_invalid ): - res = app.patch_json_api(url, payload_invalid, auth=user_no_auth.auth, expect_errors=True) + res = app.patch_json_api(url_user_global_file_updated, payload_invalid, auth=user_no_permission.auth, expect_errors=True) assert res.status_code == 403 def test_subscription_detail_invalid_payload_401( - self, app, user, user_no_auth, notification, url, url_invalid, payload, payload_invalid + self, app, user, user_no_permission, notification_user_global_file_updated, url_user_global_file_updated, url_invalid, payload, payload_invalid ): - res = app.patch_json_api(url, payload_invalid, expect_errors=True) + res = app.patch_json_api(url_user_global_file_updated, payload_invalid, expect_errors=True) assert res.status_code == 401 def test_subscription_detail_invalid_payload_400( - self, app, user, user_no_auth, notification, url, url_invalid, payload, payload_invalid + self, app, user, user_no_permission, notification_user_global_file_updated, url_user_global_file_updated, url_invalid, payload, payload_invalid ): res = app.patch_json_api( - url, + url_user_global_file_updated, payload_invalid, auth=user.auth, expect_errors=True, @@ -126,33 +312,33 @@ def test_subscription_detail_invalid_payload_400( assert res.json['errors'][0]['detail'] == ('"invalid-frequency" is not a valid choice.') def test_subscription_detail_patch_invalid_notification_id_no_user( - self, app, user, user_no_auth, notification, url, url_invalid, payload, payload_invalid + self, app, user, user_no_permission, notification_user_global_file_updated, url_user_global_file_updated, url_invalid, payload, payload_invalid ): res = app.patch_json_api(url_invalid, payload, expect_errors=True) assert res.status_code == 404 def test_subscription_detail_patch_invalid_notification_id_existing_user( - self, app, user, user_no_auth, notification, url, url_invalid, payload, payload_invalid + self, app, user, user_no_permission, notification_user_global_file_updated, url_user_global_file_updated, url_invalid, payload, payload_invalid ): res = app.patch_json_api(url_invalid, payload, auth=user.auth, expect_errors=True) assert res.status_code == 404 def test_subscription_detail_patch_invalid_user( - self, app, user, user_no_auth, notification, url, url_invalid, payload, payload_invalid + self, app, user, user_no_permission, notification_user_global_file_updated, url_user_global_file_updated, url_invalid, payload, payload_invalid ): - res = app.patch_json_api(url, payload, auth=user_no_auth.auth, expect_errors=True) + res = app.patch_json_api(url_user_global_file_updated, payload, auth=user_no_permission.auth, expect_errors=True) assert res.status_code == 403 def test_subscription_detail_patch_no_user( - self, app, user, user_no_auth, notification, url, url_invalid, payload, payload_invalid + self, app, user, user_no_permission, notification_user_global_file_updated, url_user_global_file_updated, url_invalid, payload, payload_invalid ): - res = app.patch_json_api(url, payload, expect_errors=True) + res = app.patch_json_api(url_user_global_file_updated, payload, expect_errors=True) assert res.status_code == 401 def test_subscription_detail_patch( - self, app, user, user_no_auth, notification, url, url_invalid, payload, payload_invalid + self, app, user, user_no_permission, notification_user_global_file_updated, url_user_global_file_updated, url_invalid, payload, payload_invalid ): - res = app.patch_json_api(url, payload, auth=user.auth) + res = app.patch_json_api(url_user_global_file_updated, payload, auth=user.auth) assert res.status_code == 200 assert res.json['data']['attributes']['frequency'] == 'none' diff --git a/api_tests/subscriptions/views/test_subscriptions_list.py b/api_tests/subscriptions/views/test_subscriptions_list.py index 599df9ddcd6..f4e858a6f93 100644 --- a/api_tests/subscriptions/views/test_subscriptions_list.py +++ b/api_tests/subscriptions/views/test_subscriptions_list.py @@ -2,7 +2,7 @@ from django.contrib.contenttypes.models import ContentType from api.base.settings.defaults import API_BASE -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from osf_tests.factories import ( AuthUserFactory, PreprintProviderFactory, @@ -31,7 +31,7 @@ def node(self, user): @pytest.fixture() def global_user_notification(self, user): return NotificationSubscriptionFactory( - notification_type=NotificationType.Type.USER_FILE_UPDATED.instance, + notification_type=NotificationTypeEnum.USER_FILE_UPDATED.instance, object_id=user.id, content_type_id=ContentType.objects.get_for_model(user).id, user=user, @@ -40,7 +40,7 @@ def global_user_notification(self, user): @pytest.fixture() def file_updated_notification(self, node, user): return NotificationSubscriptionFactory( - notification_type=NotificationType.Type.NODE_FILE_UPDATED.instance, + notification_type=NotificationTypeEnum.NODE_FILE_UPDATED.instance, object_id=node.id, content_type_id=ContentType.objects.get_for_model(node).id, user=user, @@ -49,7 +49,7 @@ def file_updated_notification(self, node, user): @pytest.fixture() def provider_notification(self, provider, user): return NotificationSubscriptionFactory( - notification_type=NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS.instance, + notification_type=NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS.instance, object_id=provider.id, content_type_id=ContentType.objects.get_for_model(provider).id, subscribed_object=provider, @@ -91,10 +91,10 @@ def test_cannot_post_patch_put_or_delete(self, app, url, user): assert delete_res.status_code == 405 def test_multiple_values_filter(self, app, url, user): - res = app.get(url + '?filter[event_name]=global_file_updated,files_updated', auth=user.auth) + res = app.get(url + '?filter[event_name]=global_file_updated,file_updated', auth=user.auth) assert len(res.json['data']) == 2 for subscription in res.json['data']: - subscription['attributes']['event_name'] in ['global', 'comments'] + assert subscription['attributes']['event_name'] in ['global_file_updated', 'file_updated'] def test_value_filter_id( self, @@ -122,5 +122,5 @@ def test_value_filter_id( # Confirm it’s the expected subscription object attributes = data[0]['attributes'] - assert attributes['event_name'] == 'files_updated' # event names are legacy + assert attributes['event_name'] == 'file_updated' # event names are legacy assert attributes['frequency'] in ['instantly', 'daily', 'none'] diff --git a/api_tests/users/views/test_user_claim.py b/api_tests/users/views/test_user_claim.py index 15e00c82feb..739b9757ea5 100644 --- a/api_tests/users/views/test_user_claim.py +++ b/api_tests/users/views/test_user_claim.py @@ -6,7 +6,7 @@ from api.users.views import ClaimUser from api_tests.utils import only_supports_methods from framework.auth.core import Auth -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf_tests.factories import ( AuthUserFactory, ProjectFactory, @@ -126,7 +126,7 @@ def test_claim_unauth_success_with_original_email(self, app, url, project, unreg self.payload(email='david@david.son', id=project._id), ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_INVITE_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_INVITE_DEFAULT assert res.status_code == 204 def test_claim_unauth_success_with_claimer_email(self, app, url, unreg_user, project, claimer): @@ -137,8 +137,8 @@ def test_claim_unauth_success_with_claimer_email(self, app, url, unreg_user, pro ) assert res.status_code == 204 assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_FORWARD_INVITE_REGISTERED - assert notifications['emits'][1]['type'] == NotificationType.Type.USER_PENDING_VERIFICATION_REGISTERED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_FORWARD_INVITE_REGISTERED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.USER_PENDING_VERIFICATION_REGISTERED def test_claim_unauth_success_with_unknown_email(self, app, url, project, unreg_user): with capture_notifications() as notifications: @@ -148,8 +148,8 @@ def test_claim_unauth_success_with_unknown_email(self, app, url, project, unreg_ ) assert res.status_code == 204 assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_PENDING_VERIFICATION - assert notifications['emits'][1]['type'] == NotificationType.Type.USER_FORWARD_INVITE + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_PENDING_VERIFICATION + assert notifications['emits'][1]['type'] == NotificationTypeEnum.USER_FORWARD_INVITE def test_claim_unauth_success_with_preprint_id(self, app, url, preprint, unreg_user): with capture_notifications() as notifications: @@ -159,7 +159,7 @@ def test_claim_unauth_success_with_preprint_id(self, app, url, preprint, unreg_u ) assert res.status_code == 204 assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_INVITE_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_INVITE_DEFAULT def test_claim_auth_failure(self, app, url, claimer, wrong_preprint, project, unreg_user, referrer): _url = url.format(unreg_user._id) @@ -228,8 +228,8 @@ def test_claim_auth_throttle_error(self, app, url, claimer, unreg_user, project) expect_errors=True ) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_FORWARD_INVITE_REGISTERED - assert notifications['emits'][1]['type'] == NotificationType.Type.USER_PENDING_VERIFICATION_REGISTERED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_FORWARD_INVITE_REGISTERED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.USER_PENDING_VERIFICATION_REGISTERED res = app.post_json_api( url.format(unreg_user._id), self.payload(id=project._id), @@ -248,8 +248,8 @@ def test_claim_auth_success(self, app, url, claimer, unreg_user, project): ) assert res.status_code == 204 assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_FORWARD_INVITE_REGISTERED - assert notifications['emits'][1]['type'] == NotificationType.Type.USER_PENDING_VERIFICATION_REGISTERED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_FORWARD_INVITE_REGISTERED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.USER_PENDING_VERIFICATION_REGISTERED @pytest.mark.django_db diff --git a/api_tests/users/views/test_user_confirm.py b/api_tests/users/views/test_user_confirm.py index 230b4a5644a..5c9643e3e02 100644 --- a/api_tests/users/views/test_user_confirm.py +++ b/api_tests/users/views/test_user_confirm.py @@ -1,7 +1,7 @@ import pytest from api.base.settings.defaults import API_BASE -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf_tests.factories import AuthUserFactory from tests.utils import capture_notifications @@ -168,7 +168,7 @@ def test_post_success_link(self, app, confirm_url, user_with_email_verification) assert res.status_code == 201 assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_EXTERNAL_LOGIN_LINK_SUCCESS + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_EXTERNAL_LOGIN_LINK_SUCCESS user.reload() assert user.external_identity['ORCID']['0000-0000-0000-0000'] == 'VERIFIED' diff --git a/api_tests/users/views/test_user_list.py b/api_tests/users/views/test_user_list.py index 883defee671..a98fc253fee 100644 --- a/api_tests/users/views/test_user_list.py +++ b/api_tests/users/views/test_user_list.py @@ -10,7 +10,7 @@ from api.base.settings.defaults import API_BASE from framework.auth.cas import CasResponse -from osf.models import OSFUser, ApiOAuth2PersonalToken, NotificationType +from osf.models import OSFUser, ApiOAuth2PersonalToken, NotificationTypeEnum from osf_tests.factories import ( AuthUserFactory, UserFactory, @@ -320,7 +320,7 @@ def test_cookied_requests_can_create_and_email( data ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_MODERATOR_ADDED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_MODERATOR_ADDED assert res.status_code == 201 assert OSFUser.objects.filter(username=email_unconfirmed).count() == 1 @@ -359,7 +359,7 @@ def test_properly_scoped_token_can_create_and_send_email( headers={'Authorization': f'Bearer {token.token_id}'} ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_MODERATOR_ADDED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_MODERATOR_ADDED assert res.status_code == 201 assert res.json['data']['attributes']['username'] == email_unconfirmed @@ -519,7 +519,7 @@ def test_admin_scoped_token_can_create_and_send_email( headers={'Authorization': f'Bearer {token.token_id}'} ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_MODERATOR_ADDED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_MODERATOR_ADDED assert res.status_code == 201 assert res.json['data']['attributes']['username'] == email_unconfirmed diff --git a/api_tests/users/views/test_user_message_institutional_access.py b/api_tests/users/views/test_user_message_institutional_access.py index 04a6cff1f4c..069409ccb0f 100644 --- a/api_tests/users/views/test_user_message_institutional_access.py +++ b/api_tests/users/views/test_user_message_institutional_access.py @@ -1,6 +1,6 @@ import pytest -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from osf.models.user_message import MessageTypes, UserMessage from api.base.settings.defaults import API_BASE from osf_tests.factories import ( @@ -221,7 +221,7 @@ def test_cc_institutional_admin( auth=institutional_admin.auth, ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_INSTITUTIONAL_ACCESS_REQUEST + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_INSTITUTIONAL_ACCESS_REQUEST assert notifications['emits'][0]['kwargs']['user'].username == user_with_affiliation.username assert res.status_code == 201 user_message = UserMessage.objects.get() @@ -235,7 +235,7 @@ def test_cc_field_defaults_to_false(self, app, institutional_admin, url_with_aff with capture_notifications() as notifications: res = app.post_json_api(url_with_affiliation, payload, auth=institutional_admin.auth) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_INSTITUTIONAL_ACCESS_REQUEST + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_INSTITUTIONAL_ACCESS_REQUEST assert notifications['emits'][0]['kwargs']['user'].username == user_with_affiliation.username assert res.status_code == 201 diff --git a/api_tests/users/views/test_user_settings.py b/api_tests/users/views/test_user_settings.py index 53dc254b519..d543c781427 100644 --- a/api_tests/users/views/test_user_settings.py +++ b/api_tests/users/views/test_user_settings.py @@ -7,7 +7,7 @@ AuthUserFactory, UserFactory, ) -from osf.models import Email, NotableDomain, NotificationType +from osf.models import Email, NotableDomain, NotificationTypeEnum from framework.auth.views import auth_email_logout from tests.utils import capture_notifications @@ -59,7 +59,7 @@ def test_post(self, app, user_one, user_two, url, payload): with capture_notifications() as notifications: res = app.post_json_api(url, payload, auth=user_one.auth) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.DESK_REQUEST_EXPORT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.DESK_REQUEST_EXPORT assert res.status_code == 204 user_one.reload() assert user_one.email_last_sent is not None diff --git a/api_tests/users/views/test_user_settings_reset_password.py b/api_tests/users/views/test_user_settings_reset_password.py index 62687a58612..51c2db80038 100644 --- a/api_tests/users/views/test_user_settings_reset_password.py +++ b/api_tests/users/views/test_user_settings_reset_password.py @@ -3,7 +3,7 @@ from api.base.settings.defaults import API_BASE from api.base.settings import CSRF_COOKIE_NAME -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf_tests.factories import ( UserFactory, ) @@ -49,7 +49,7 @@ def test_get(self, app, url, user_one): with capture_notifications() as notifications: res = app.get(url) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_FORGOT_PASSWORD + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_FORGOT_PASSWORD assert res.status_code == 200 user_one.reload() diff --git a/framework/auth/campaigns.py b/framework/auth/campaigns.py index 93ff9ccca4f..728e14bdc8d 100644 --- a/framework/auth/campaigns.py +++ b/framework/auth/campaigns.py @@ -4,7 +4,7 @@ from django.utils import timezone from website import settings -from osf.models import PreprintProvider, NotificationType +from osf.models import PreprintProvider, NotificationTypeEnum from website.settings import DOMAIN, CAMPAIGN_REFRESH_THRESHOLD from website.util.metrics import OsfSourceTags, OsfClaimedTags, CampaignSourceTags, CampaignClaimedTags, provider_source_tag from framework.utils import throttle_period_expired @@ -14,7 +14,7 @@ CAMPAIGNS = None CAMPAIGNS_LAST_REFRESHED = timezone.now() - +# TODO: Notification Refactor have replaced deprecated notification types with placeholder ones; still need to clean up deprecated campaigns. def get_campaigns(): global CAMPAIGNS @@ -26,7 +26,7 @@ def get_campaigns(): 'erpc': { 'system_tag': CampaignSourceTags.ErpChallenge.value, 'redirect_url': furl(DOMAIN).add(path='erpc/').url, - 'confirmation_email_template': NotificationType.Type.USER_CAMPAIGN_CONFIRM_EMAIL_ERPC, + 'confirmation_email_template': NotificationTypeEnum.USER_CAMPAIGN_CONFIRM_EMAIL_ERPC, 'login_type': 'native', }, } @@ -44,12 +44,12 @@ def get_campaigns(): preprint_providers = PreprintProvider.objects.all() for provider in preprint_providers: if provider._id == 'osf': - confirmation_email_template = NotificationType.Type.USER_CAMPAIGN_CONFIRM_PREPRINTS_OSF + confirmation_email_template = NotificationTypeEnum.USER_CONFIRM_EMAIL # added as a placeholder as removed NotificationType name = 'OSF' url_path = 'preprints/' external_url = None else: - confirmation_email_template = NotificationType.Type.USER_CAMPAIGN_CONFIRM_PREPRINTS_BRANDED + confirmation_email_template = NotificationTypeEnum.USER_CONFIRM_EMAIL # added as a placeholder as removed NotificationType name = provider.name url_path = f'preprints/{provider._id}' @@ -85,7 +85,7 @@ def get_campaigns(): 'osf-registered-reports': { 'system_tag': CampaignSourceTags.OsfRegisteredReports.value, 'redirect_url': furl(DOMAIN).add(path='rr/').url, - 'confirmation_email_template': NotificationType.Type.USER_CAMPAIGN_CONFIRM_EMAIL_REGISTRIES_OSF, + 'confirmation_email_template': NotificationTypeEnum.USER_CAMPAIGN_CONFIRM_EMAIL_REGISTRIES_OSF, 'login_type': 'proxy', 'provider': 'osf', 'logo': settings.OSF_REGISTRIES_LOGO @@ -96,7 +96,7 @@ def get_campaigns(): 'agu_conference_2023': { 'system_tag': CampaignSourceTags.AguConference2023.value, 'redirect_url': furl(DOMAIN).add(path='my_projects/').url, - 'confirmation_email_template': NotificationType.Type.USER_CAMPAIGN_CONFIRM_EMAIL_AGU_CONFERENCE_2023, + 'confirmation_email_template': NotificationTypeEnum.USER_CONFIRM_EMAIL, # added as a placeholder as removed NotificationType 'login_type': 'native', } }) @@ -105,7 +105,7 @@ def get_campaigns(): 'agu_conference': { 'system_tag': CampaignSourceTags.AguConference.value, 'redirect_url': furl(DOMAIN).add(path='my_projects/').url, - 'confirmation_email_template': NotificationType.Type.USER_CAMPAIGN_CONFIRM_EMAIL_AGU_CONFERENCE, + 'confirmation_email_template': NotificationTypeEnum.USER_CAMPAIGN_CONFIRM_EMAIL_AGU_CONFERENCE, 'login_type': 'native', } }) diff --git a/framework/auth/decorators.py b/framework/auth/decorators.py index 5557c900be3..af56280b8fe 100644 --- a/framework/auth/decorators.py +++ b/framework/auth/decorators.py @@ -76,6 +76,29 @@ def wrapped(*args, **kwargs): return wrapped + +def is_contributor_or_public_resource(resource_kw='resource'): + """ + Require that user be contributor or resource be public. + """ + def decorator(func): + @wraps(func) + def wrapped(*args, **kwargs): + from osf.models import BaseFileNode, Guid + referent = kwargs.get(resource_kw) + if isinstance(referent, Guid): + referent = referent.referent + target_resource = referent.target if isinstance(referent, BaseFileNode) else referent + if target_resource.is_public: + return func(*args, **kwargs) + auth = Auth.from_kwargs(request.args.to_dict(), {}) + if auth.logged_in and target_resource.is_contributor(auth.user): + return func(*args, **kwargs) + raise HTTPError(http_status.HTTP_403_FORBIDDEN) + return wrapped + return decorator + + # TODO Can remove after Waterbutler is sending requests to V2 endpoints. # This decorator has been adapted for use in an APIv2 parser - HMACSignedParser def must_be_signed(func): diff --git a/framework/auth/views.py b/framework/auth/views.py index 3b5a4f20dea..f7450c42a47 100644 --- a/framework/auth/views.py +++ b/framework/auth/views.py @@ -26,7 +26,7 @@ from framework.sessions.utils import remove_sessions_for_user from framework.sessions import get_session from framework.utils import throttle_period_expired -from osf.models import OSFUser, NotificationType +from osf.models import OSFUser, NotificationTypeEnum from osf.utils.sanitize import strip_html from website import settings, language from website.util import web_url_for @@ -206,7 +206,7 @@ def forgot_password_post(): """Dispatches to ``_forgot_password_post`` passing non-institutional user mail template and reset action.""" return _forgot_password_post( - notificaton_type=NotificationType.Type.USER_FORGOT_PASSWORD, + notificaton_type=NotificationTypeEnum.USER_FORGOT_PASSWORD, reset_route='reset_password_get' ) @@ -215,7 +215,7 @@ def forgot_password_institution_post(): """Dispatches to `_forgot_password_post` passing institutional user mail template, reset action, and setting the ``institutional`` flag.""" return _forgot_password_post( - notificaton_type=NotificationType.Type.USER_FORGOT_PASSWORD_INSTITUTION, + notificaton_type=NotificationTypeEnum.USER_FORGOT_PASSWORD_INSTITUTION, reset_route='reset_password_institution_get', institutional=True ) @@ -278,8 +278,6 @@ def _forgot_password_post(notificaton_type, reset_route, institutional=False): user=user_obj, event_context={ 'reset_link': reset_link, - 'can_change_preferences': False, - 'osf_contact_email': settings.OSF_CONTACT_EMAIL, }, ) @@ -656,12 +654,11 @@ def external_login_confirm_email_get(auth, uid, token): if external_status == 'CREATE': service_url += '&{}'.format(urlencode({'new': 'true'})) elif external_status == 'LINK': - NotificationType.Type.USER_EXTERNAL_LOGIN_LINK_SUCCESS.instance.emit( + NotificationTypeEnum.USER_EXTERNAL_LOGIN_LINK_SUCCESS.instance.emit( user=user, event_context={ 'user_fullname': user.fullname, 'external_id_provider': provider, - 'can_change_preferences': False, 'osf_contact_email': settings.OSF_CONTACT_EMAIL, }, ) @@ -836,9 +833,9 @@ def send_confirm_email(user, email, renew=False, external_id_provider=None, exte if external_id_provider and external_id: # First time login through external identity provider, link or create an OSF account confirmation if user.external_identity[external_id_provider][external_id] == 'CREATE': - notification_type = NotificationType.Type.USER_EXTERNAL_LOGIN_CONFIRM_EMAIL_CREATE + notification_type = NotificationTypeEnum.USER_EXTERNAL_LOGIN_CONFIRM_EMAIL_CREATE elif user.external_identity[external_id_provider][external_id] == 'LINK': - notification_type = NotificationType.Type.USER_EXTERNAL_LOGIN_CONFIRM_EMAIL_LINK + notification_type = NotificationTypeEnum.USER_EXTERNAL_LOGIN_CONFIRM_EMAIL_LINK else: raise HTTPError(http_status.HTTP_400_BAD_REQUEST, data={}) elif merge_target: @@ -848,25 +845,24 @@ def send_confirm_email(user, email, renew=False, external_id_provider=None, exte 'user_username': user.username, 'email': merge_target.email, } - notification_type = NotificationType.Type.USER_CONFIRM_MERGE + notification_type = NotificationTypeEnum.USER_CONFIRM_MERGE logout_query = '?logout=1' elif user.is_active: # Add email confirmation - notification_type = NotificationType.Type.USER_CONFIRM_EMAIL + notification_type = NotificationTypeEnum.USER_CONFIRM_EMAIL logout_query = '?logout=1' elif campaign: # Account creation confirmation: from campaign notification_type = campaigns.email_template_for_campaign(campaign) else: # Account creation confirmation: from OSF - notification_type = NotificationType.Type.USER_INITIAL_CONFIRM_EMAIL + notification_type = NotificationTypeEnum.USER_INITIAL_CONFIRM_EMAIL notification_type.instance.emit( destination_address=email, event_context={ 'user_fullname': user.fullname, 'confirmation_url': f'{confirmation_url}{logout_query}', - 'can_change_preferences': False, 'external_id_provider': external_id_provider, 'osf_contact_email': settings.OSF_CONTACT_EMAIL, 'osf_support_email': settings.OSF_SUPPORT_EMAIL, diff --git a/notifications.yaml b/notifications.yaml index 29d896cdc89..b867c3a2d38 100644 --- a/notifications.yaml +++ b/notifications.yaml @@ -46,27 +46,6 @@ notification_types: tests: ['osf_tests/test_user.py', 'tests/test_auth.py'] template: 'website/templates/password_reset.html.mako' - - name: user_contributor_added_preprint_node_from_osf - subject: 'You have been added as a contributor to an OSF preprint' - __docs__: ... - object_content_type_model_name: osfuser - template: 'website/templates/contributor_added_preprint_node_from_osf.html.mako' - tests: [] - - - name: user_contributor_added_access_request - subject: 'You have been added as a contributor to an OSF project' - __docs__: ... - object_content_type_model_name: osfuser - tests: ['tests/test_claim_views.py', 'api_tests/requests/views/test_request_actions_create.py', 'api_tests/requests/mixins.py', 'osf_tests/test_institutional_admin_contributors.py'] - template: 'website/templates/contributor_added_access_request.html.mako' - - - name: user_contributor_added_osf_preprint - subject: 'You have been added as a contributor to an OSF preprint.' - __docs__: ... - object_content_type_model_name: osfuser - tests: [] - template: 'website/templates/contributor_added_preprint_node_from_osf.html.mako' - - name: user_external_login_link_success subject: 'OSF Verification Success' __docs__: ... @@ -81,13 +60,6 @@ notification_types: tests: ['tests/test_auth_views.py'] template: 'website/templates/confirm.html.mako' - - name: forgot_password - subject: 'Reset Password' - __docs__: ... - object_content_type_model_name: osfuser - tests: ['api_tests/users/views/test_user_settings_reset_password.py', 'tests/test_forgot_password.py'] - template: 'website/templates/forgot_password.html.mako' - - name: user_welcome subject: 'Welcome to OSF' __docs__: ... @@ -137,13 +109,6 @@ notification_types: tests: ['tests/test_adding_contributor_views.py', 'api_tests/users/views/test_user_claim.py', 'tests/test_claim_views.py'] template: 'website/templates/invite_default.html.mako' - - name: user_pending_invite - subject: 'You have been invited to contribute to an OSF project' - __docs__: ... - object_content_type_model_name: osfuser - tests: [] - template: 'website/templates/pending_invite.html.mako' - - name: user_forward_invite_registered subject: 'Please forward to {user_fullname}' __docs__: ... @@ -165,13 +130,6 @@ notification_types: template: 'website/templates/initial_confirm.html.mako' tests: ['tests/test_resend_confirmation.py', 'tests/test_auth.py'] - - name: user_export_data_request - subject: 'Data Export Request' - __docs__: ... - object_content_type_model_name: osfuser - template: 'website/templates/support_request.html.mako' - tests: [] - - name: user_request_deactivation subject: '[via OSF] Deactivation Request' __docs__: ... @@ -193,13 +151,6 @@ notification_types: template: 'website/templates/storage_cap_exceeded_announcement.html.mako' tests: [] - - name: user_duplicate_accounts_sso_osf4i - subject: 'Duplicate Account Detection' - __docs__: ... - object_content_type_model_name: osfuser - template: 'website/templates/duplicate_accounts_sso_osf4i.html.mako' - tests: [] - - name: user_duplicate_accounts_osf4i subject: 'Duplicate Account Detection' __docs__: ... @@ -242,14 +193,14 @@ notification_types: template: 'website/templates/registration_bulk_upload_success_partial.html.mako' tests: ['api_tests/providers/tasks/test_bulk_upload.py'] - - name: user_registration_bulk_upload_failure_duplicates + - name: registration_bulk_upload_failure_duplicates subject: 'Bulk Registration Upload Failed - Duplicates Found' __docs__: ... object_content_type_model_name: osfuser template: 'website/templates/registration_bulk_upload_failure_duplicates.html.mako' tests: [] - - name: registration_bulk_upload_unexpected_failure + - name: desk_user_registration_bulk_upload_unexpected_failure subject: 'Bulk Registration Upload Unexpected Failed' __docs__: ... object_content_type_model_name: osfuser @@ -319,30 +270,24 @@ notification_types: template: 'website/templates/archive_uncaught_error_user.html.mako' tests: [] - - name: user_confirm_email_erpc + - name: user_campaign_confirm_email_erpc subject: 'OSF Account Verification, Election Research Preacceptance Competition' object_content_type_model_name: osfuser template: 'website/templates/confirm_erpc.html.mako' tests: [] - - name: user_confirm_email_agu_conference + - name: user_campaign_confirm_email_agu_conference subject: 'OSF Account Verification, from the American Geophysical Union Conference' object_content_type_model_name: osfuser template: 'website/templates/confirm_erpc.html.mako' tests: [] - - name: user_confirm_email_registries_osf + - name: user_campaign_confirm_email_registries_osf # TODO: recheck subject: 'OSF Account Verification, OSF Registries' object_content_type_model_name: osfuser template: 'website/templates/confirm_registries_osf.html.mako' tests: [] - - name: user_confirm_email_preprints - subject: 'OSF Account Verification, Preprints' - object_content_type_model_name: osfuser - template: 'website/templates/confirm_preprints_osf.html.mako' - tests: [''] - - name: user_confirm_merge subject: 'Confirm account merge' object_content_type_model_name: osfuser @@ -373,7 +318,7 @@ notification_types: template: 'website/templates/tou_notif.html.mako' tests: [] - - name: user_registration_bulk_upload_product_owner + - name: desk_registration_bulk_upload_product_owner subject: 'Registry Could Not Bulk Upload Registrations' object_content_type_model_name: osfuser template: 'website/templates/registration_bulk_upload_product_owner.html.mako' @@ -412,13 +357,6 @@ notification_types: template: 'website/templates/new_pending_withdraw_requests.html.mako' tests: ['tests/test_registrations/test_review_flows.py'] - - name: provider_contributor_added_preprint - subject: 'Contributor Added to Preprint' - __docs__: ... - object_content_type_model_name: abstractprovider - template: 'website/templates/contributor_added_preprints.html.mako' - tests: [] - - name: provider_confirm_email_moderation subject: 'OSF Account Verification, {provider_name}' __docs__: ... @@ -447,23 +385,8 @@ notification_types: template: 'website/templates/reviews_resubmission_confirmation.html.mako' tests: ['osf_tests/test_reviewable.py'] - #### NODE - - name: node_wiki_updated - subject: 'Wiki Updated' - __docs__: ... - object_content_type_model_name: abstractnode - template: 'website/templates/file_updated.html.mako' - tests: ['tests/test_events.py'] - - - name: node_files_updated - subject: 'Files Updated' - __docs__: ... - object_content_type_model_name: abstractnode - template: 'website/templates/file_updated.html.mako' - tests: ['tests/test_events.py'] - - name: node_file_updated - subject: 'File Updated' + subject: 'Files Updated' __docs__: ... object_content_type_model_name: abstractnode template: 'website/templates/file_updated.html.mako' @@ -488,7 +411,7 @@ notification_types: __docs__: ... object_content_type_model_name: abstractnode template: 'website/templates/contributor_added_access_request.html.mako' - tests: [] + tests: ['tests/test_claim_views.py', 'api_tests/requests/views/test_request_actions_create.py', 'api_tests/requests/mixins.py', 'osf_tests/test_institutional_admin_contributors.py'] - name: node_pending_registration_admin subject: 'Pending Registration - Admin Notification' @@ -610,26 +533,13 @@ notification_types: template: 'website/templates/updates_rejected.html.mako' tests: ['osf_tests/test_schema_responses.py'] - - name: node_archive_file_not_found_desk - subject: 'Problem registering {src_title}' - __docs__: ... - object_content_type_model_name: abstractnode - template: 'website/templates/archive_file_not_found_desk.html.mako' - tests: [] - - - name: node_archive_file_not_found_user + - name: user_archive_job_file_not_found subject: 'Registration failed because of altered files' object_content_type_model_name: abstractnode template: 'website/templates/archive_file_not_found_user.html.mako' tests: [] - - name: node_archive_uncaught_error_desk - subject: 'Problem registering {src_title}' - object_content_type_model_name: abstractnode - template: 'website/templates/archive_uncaught_error_desk.html.mako' - tests: [] - - - name: node_archive_registration_stuck_desk + - name: desk_archive_registration_stuck subject: '[auto] Stuck registrations audit' object_content_type_model_name: abstractnode template: 'website/templates/archive_registration_stuck_desk.html.mako' @@ -641,18 +551,10 @@ notification_types: template: 'website/templates/archive_success.html.mako' tests: [] - - name: node_withdraw_registration_approved - object_content_type_model_name: abstractnode - template: 'website/templates/withdrawal_request_granted.html.mako' - - name: node_withdrawal_request_approved object_content_type_model_name: abstractnode template: 'website/templates/withdrawal_request_granted.html.mako' - - name: node_withdraw_registration_declined - object_content_type_model_name: abstractnode - template: 'website/templates/withdrawal_request_declined.html.mako' - - name: node_new_public_project subject: 'Now, public. Next, impact.' __docs__: ... @@ -690,18 +592,6 @@ notification_types: template: 'website/templates/contributor_added_preprints.html.mako' tests: ['api_tests/preprints/views/test_preprint_contributors_list.py'] - - name: preprint_withdrawal_request_granted - subject: 'Your {document_type} has been withdrawn' - object_content_type_model_name: preprint - template: 'website/templates/withdrawal_request_granted.html.mako' - tests: [] - - - name: preprint_withdrawal_request_declined - subject: 'Your withdrawal request has been declined' - object_content_type_model_name: preprint - template: 'website/templates/withdrawal_request_declined.html.mako' - tests: [] - #### SUPPORT #### Collection Submissions - name: collection_submission_removed_moderator @@ -796,13 +686,6 @@ notification_types: template: 'website/templates/archive_uncaught_error_desk.html.mako' tests: [] - - name: desk_osf_support_email - subject: 'OSF Support Email' - __docs__: ... - object_content_type_model_name: desk - template: 'website/templates/crossref_doi_error.html.mako' - tests: [] - - name: desk_request_deactivation subject: 'Deactivation Request' __docs__: ... diff --git a/notifications/file_event_notifications.py b/notifications/file_event_notifications.py index 6d0fc3605bf..d57d4d8e9cf 100644 --- a/notifications/file_event_notifications.py +++ b/notifications/file_event_notifications.py @@ -15,6 +15,7 @@ from osf.models import ( NotificationType, + NotificationTypeEnum, AbstractNode, NodeLog, Preprint, @@ -96,13 +97,13 @@ def file_updated(self, target=None, user=None, event_type=None, payload=None): return event = { - NodeLog.FILE_RENAMED: NotificationType.Type.ADDON_FILE_RENAMED, - NodeLog.FILE_COPIED: NotificationType.Type.ADDON_FILE_COPIED, - NodeLog.FILE_ADDED: NotificationType.Type.FILE_ADDED, - NodeLog.FILE_MOVED: NotificationType.Type.ADDON_FILE_MOVED, - NodeLog.FILE_REMOVED: NotificationType.Type.FILE_REMOVED, - NodeLog.FILE_UPDATED: NotificationType.Type.FILE_UPDATED, - NodeLog.FOLDER_CREATED: NotificationType.Type.FOLDER_CREATED, + NodeLog.FILE_RENAMED: NotificationTypeEnum.ADDON_FILE_RENAMED, + NodeLog.FILE_COPIED: NotificationTypeEnum.ADDON_FILE_COPIED, + NodeLog.FILE_ADDED: NotificationTypeEnum.FILE_ADDED, + NodeLog.FILE_MOVED: NotificationTypeEnum.ADDON_FILE_MOVED, + NodeLog.FILE_REMOVED: NotificationTypeEnum.FILE_REMOVED, + NodeLog.FILE_UPDATED: NotificationTypeEnum.FILE_UPDATED, + NodeLog.FOLDER_CREATED: NotificationTypeEnum.FOLDER_CREATED, }[event_type] if event not in event_registry: @@ -268,7 +269,7 @@ def perform(self): super().perform() return - NotificationType.Type.ADDON_FILE_RENAMED.instance.emit( + NotificationTypeEnum.ADDON_FILE_RENAMED.instance.emit( user=self.user, event_context={ 'user_fullname': self.user.fullname, @@ -305,7 +306,7 @@ def perform(self): super().perform() return - NotificationType.Type.ADDON_FILE_MOVED.instance.emit( + NotificationTypeEnum.ADDON_FILE_MOVED.instance.emit( user=self.user, event_context={ 'user_fullname': self.user.fullname, @@ -325,7 +326,7 @@ def perform(self): super().perform() return - NotificationType.Type.ADDON_FILE_COPIED.instance.emit( + NotificationTypeEnum.ADDON_FILE_COPIED.instance.emit( user=self.user, event_context={ 'user_fullname': self.user.fullname, diff --git a/notifications/listeners.py b/notifications/listeners.py index 62ad487b358..801690a976c 100644 --- a/notifications/listeners.py +++ b/notifications/listeners.py @@ -10,7 +10,7 @@ @project_created.connect def subscribe_creator(resource): - from osf.models import NotificationSubscription, NotificationType, Preprint + from osf.models import NotificationSubscription, NotificationTypeEnum, Preprint from django.contrib.contenttypes.models import ContentType @@ -21,7 +21,7 @@ def subscribe_creator(resource): try: NotificationSubscription.objects.get_or_create( user=user, - notification_type=NotificationType.Type.USER_FILE_UPDATED.instance, + notification_type=NotificationTypeEnum.USER_FILE_UPDATED.instance, object_id=user.id, content_type=ContentType.objects.get_for_model(user), _is_digest=True, @@ -35,7 +35,7 @@ def subscribe_creator(resource): try: NotificationSubscription.objects.get_or_create( user=user, - notification_type=NotificationType.Type.NODE_FILE_UPDATED.instance, + notification_type=NotificationTypeEnum.NODE_FILE_UPDATED.instance, object_id=resource.id, content_type=ContentType.objects.get_for_model(resource), _is_digest=True, @@ -49,7 +49,7 @@ def subscribe_creator(resource): @contributor_added.connect def subscribe_contributor(resource, contributor, auth=None, *args, **kwargs): from django.contrib.contenttypes.models import ContentType - from osf.models import NotificationSubscription, NotificationType, Preprint + from osf.models import NotificationSubscription, NotificationTypeEnum, Preprint from osf.models import Node if isinstance(resource, Node): @@ -59,7 +59,7 @@ def subscribe_contributor(resource, contributor, auth=None, *args, **kwargs): try: NotificationSubscription.objects.get_or_create( user=contributor, - notification_type=NotificationType.Type.USER_FILE_UPDATED.instance, + notification_type=NotificationTypeEnum.USER_FILE_UPDATED.instance, object_id=contributor.id, content_type=ContentType.objects.get_for_model(contributor), _is_digest=True, @@ -73,7 +73,7 @@ def subscribe_contributor(resource, contributor, auth=None, *args, **kwargs): try: NotificationSubscription.objects.get_or_create( user=contributor, - notification_type=NotificationType.Type.NODE_FILE_UPDATED.instance, + notification_type=NotificationTypeEnum.NODE_FILE_UPDATED.instance, object_id=resource.id, content_type=ContentType.objects.get_for_model(resource), _is_digest=True, @@ -89,7 +89,7 @@ def subscribe_contributor(resource, contributor, auth=None, *args, **kwargs): @reviews_signals.reviews_withdraw_requests_notification_moderators.connect def reviews_withdraw_requests_notification_moderators(self, timestamp, context, user, resource): from website.settings import DOMAIN - from osf.models import NotificationType + from osf.models import NotificationTypeEnum provider = resource.provider context['provider_id'] = provider.id @@ -99,10 +99,11 @@ def reviews_withdraw_requests_notification_moderators(self, timestamp, context, # Set submission url context['reviews_submission_url'] = f'{DOMAIN}{resource._id}?mode=moderator' context['localized_timestamp'] = str(timestamp) - NotificationType.Type.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.instance.emit( + NotificationTypeEnum.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.instance.emit( subscribed_object=provider, user=user, - event_context=context + event_context=context, + is_digest=True, ) @@ -153,9 +154,9 @@ def queue_no_addon_email(user): `settings.NO_ADDON_WAIT_TIME` months of signing up for the OSF. """ from website.settings import DOMAIN - from osf.models import NotificationType + from osf.models import NotificationTypeEnum - NotificationType.Type.USER_NO_ADDON.instance.emit( + NotificationTypeEnum.USER_NO_ADDON.instance.emit( subscribed_object=user, user=user, event_context={ diff --git a/notifications/tasks.py b/notifications/tasks.py index 84a825088f2..e9dc277d5b7 100644 --- a/notifications/tasks.py +++ b/notifications/tasks.py @@ -1,7 +1,6 @@ import itertools from calendar import monthrange -from datetime import date, datetime -from django.contrib.contenttypes.models import ContentType +from datetime import date from django.db import connection from django.utils import timezone from django.core.validators import EmailValidator @@ -11,7 +10,7 @@ from celery.utils.log import get_task_logger from framework.postcommit_tasks.handlers import run_postcommit -from osf.models import OSFUser, Notification, NotificationType, EmailTask, RegistrationProvider, \ +from osf.models import OSFUser, Notification, NotificationTypeEnum, EmailTask, RegistrationProvider, \ CollectionProvider, AbstractProvider from framework.sentry import log_message from osf.registrations.utils import get_registration_provider_submissions_url @@ -34,10 +33,8 @@ def safe_render_notification(notifications, email_task): email_task.save() failed_notifications.append(notification.id) # Mark notifications that failed to render as fake sent - # Use 1000/12/31 to distinguish itself from another type of fake sent 1000/1/1 + notification.mark_sent(fake_sent=True) log_message(f'Error rendering notification, mark as fake sent: [notification_id={notification.id}]') - notification.sent = datetime(1000, 12, 31) - notification.save() continue rendered_notifications.append(rendered) @@ -102,19 +99,18 @@ def send_user_email_task(self, user_id, notification_ids, **kwargs): notifications_qs = notifications_qs.exclude(id__in=failed_notifications) if not rendered_notifications: + email_task.status = 'SUCCESS' if email_task.error_message: logger.error(f'Partial success for send_user_email_task for user {user_id}. Task id: {self.request.id}. Errors: {email_task.error_message}') - email_task.status = 'SUCCESS' + email_task.status = 'PARTIAL_SUCCESS' email_task.save() return event_context = { 'notifications': rendered_notifications, - 'user_fullname': user.fullname, - 'can_change_preferences': False } - NotificationType.Type.USER_DIGEST.instance.emit( + NotificationTypeEnum.USER_DIGEST.instance.emit( user=user, event_context=event_context, save=False @@ -123,10 +119,10 @@ def send_user_email_task(self, user_id, notification_ids, **kwargs): notifications_qs.update(sent=timezone.now()) email_task.status = 'SUCCESS' - email_task.save() - if email_task.error_message: logger.error(f'Partial success for send_user_email_task for user {user_id}. Task id: {self.request.id}. Errors: {email_task.error_message}') + email_task.status = 'PARTIAL_SUCCESS' + email_task.save() except Exception as e: retry_count = self.request.retries @@ -177,32 +173,32 @@ def send_moderator_email_task(self, user_id, notification_ids, provider_content_ notifications_qs = notifications_qs.exclude(id__in=failed_notifications) if not rendered_notifications: + email_task.status = 'SUCCESS' if email_task.error_message: logger.error(f'Partial success for send_moderator_email_task for user {user_id}. Task id: {self.request.id}. Errors: {email_task.error_message}') - email_task.status = 'SUCCESS' + email_task.status = 'PARTIAL_SUCCESS' email_task.save() return - ProviderModel = ContentType.objects.get_for_id(provider_content_type_id).model_class() try: - provider = ProviderModel.objects.get(id=provider_id) + provider = AbstractProvider.objects.get(id=provider_id) except AbstractProvider.DoesNotExist: - log_message(f'Provider with id {provider_id} does not exist for model {ProviderModel.name}') + log_message(f'Provider with id {provider_id} does not exist for model {provider.type}') email_task.status = 'FAILURE' - email_task.error_message = f'Provider with id {provider_id} does not exist for model {ProviderModel.name}' + email_task.error_message = f'Provider with id {provider_id} does not exist for model {provider.type}' email_task.save() return except AttributeError as err: - log_message(f'Error retrieving provider with id {provider_id} for model {ProviderModel.name}: {err}') + log_message(f'Error retrieving provider with id {provider_id} for model {provider.type}: {err}') email_task.status = 'FAILURE' - email_task.error_message = f'Error retrieving provider with id {provider_id} for model {ProviderModel.name}: {err}' + email_task.error_message = f'Error retrieving provider with id {provider_id} for model {provider.type}: {err}' email_task.save() return if provider is None: - log_message(f'Provider with id {provider_id} does not exist for model {ProviderModel.name}') + log_message(f'Provider with id {provider_id} does not exist for model {provider.type}') email_task.status = 'FAILURE' - email_task.error_message = f'Provider with id {provider_id} does not exist for model {ProviderModel.name}' + email_task.error_message = f'Provider with id {provider_id} does not exist for model {provider.type}' email_task.save() return @@ -211,10 +207,10 @@ def send_moderator_email_task(self, user_id, notification_ids, provider_content_ current_admins = provider.get_group('admin') if current_admins is None or not current_admins.user_set.filter(id=user.id).exists(): log_message(f"User is not a moderator for provider {provider._id} - notifications will be marked as sent.") - email_task.status = 'FAILURE' + email_task.status = 'AUTO_FIXED' email_task.error_message = f'User is not a moderator for provider {provider._id}' email_task.save() - notifications_qs.update(sent=datetime(1000, 1, 1)) + notifications_qs.update(sent=timezone.now(), fake_sent=True) return additional_context = {} @@ -230,6 +226,10 @@ def send_moderator_email_task(self, user_id, notification_ids, provider_content_ 'logo_url': provider.brand.hero_logo_image, 'top_bar_color': provider.brand.primary_color } + elif logo_url := provider.get_asset_url('favicon'): + additional_context = { + 'logo_url': logo_url, + } else: logo = settings.OSF_REGISTRIES_LOGO elif isinstance(provider, CollectionProvider): @@ -242,8 +242,12 @@ def send_moderator_email_task(self, user_id, notification_ids, provider_content_ 'logo_url': provider.brand.hero_logo_image, 'top_bar_color': provider.brand.primary_color } + elif logo_url := provider.get_asset_url('favicon'): + additional_context = { + 'logo_url': logo_url, + } else: - logo = settings.OSF_REGISTRIES_LOGO + logo = settings.OSF_LOGO else: provider_type = 'preprint' submissions_url = f'{settings.DOMAIN}preprints/{provider._id}/moderation/submissions' @@ -254,7 +258,6 @@ def send_moderator_email_task(self, user_id, notification_ids, provider_content_ event_context = { 'notifications': rendered_notifications, 'user_fullname': user.fullname, - 'can_change_preferences': False, 'notification_settings_url': notification_settings_url, 'reviews_withdrawal_url': withdrawals_url, 'reviews_submissions_url': submissions_url, @@ -264,7 +267,7 @@ def send_moderator_email_task(self, user_id, notification_ids, provider_content_ **additional_context, } - NotificationType.Type.DIGEST_REVIEWS_MODERATORS.instance.emit( + NotificationTypeEnum.DIGEST_REVIEWS_MODERATORS.instance.emit( user=user, subscribed_object=user, event_context=event_context, @@ -274,10 +277,10 @@ def send_moderator_email_task(self, user_id, notification_ids, provider_content_ notifications_qs.update(sent=timezone.now()) email_task.status = 'SUCCESS' - email_task.save() - if email_task.error_message: logger.error(f'Partial success for send_moderator_email_task for user {user_id}. Task id: {self.request.id}. Errors: {email_task.error_message}') + email_task.status = 'PARTIAL_SUCCESS' + email_task.save() except Exception as e: retry_count = self.request.retries @@ -369,11 +372,11 @@ def get_moderators_emails(message_freq: str): cursor.execute(sql, [ message_freq, - NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS.value, - NotificationType.Type.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.value, - NotificationType.Type.DIGEST_REVIEWS_MODERATORS.value, - NotificationType.Type.USER_DIGEST.value, - NotificationType.Type.USER_NO_ADDON.value, + NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS.value, + NotificationTypeEnum.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.value, + NotificationTypeEnum.DIGEST_REVIEWS_MODERATORS.value, + NotificationTypeEnum.USER_DIGEST.value, + NotificationTypeEnum.USER_NO_ADDON.value, ] ) return itertools.chain.from_iterable(cursor.fetchall()) @@ -411,11 +414,11 @@ def get_users_emails(message_freq): cursor.execute(sql, [ message_freq, - NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS.value, - NotificationType.Type.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.value, - NotificationType.Type.DIGEST_REVIEWS_MODERATORS.value, - NotificationType.Type.USER_DIGEST.value, - NotificationType.Type.USER_NO_ADDON.value, + NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS.value, + NotificationTypeEnum.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.value, + NotificationTypeEnum.DIGEST_REVIEWS_MODERATORS.value, + NotificationTypeEnum.USER_DIGEST.value, + NotificationTypeEnum.USER_NO_ADDON.value, ] ) return itertools.chain.from_iterable(cursor.fetchall()) @@ -476,7 +479,7 @@ def send_no_addon_email(self, dry_run=False, **kwargs): """ notification_qs = Notification.objects.filter( sent__isnull=True, - subscription__notification_type__name=NotificationType.Type.USER_NO_ADDON.value, + subscription__notification_type__name=NotificationTypeEnum.USER_NO_ADDON.value, created__lte=timezone.now() - settings.NO_ADDON_WAIT_TIME ) for notification in notification_qs: @@ -490,3 +493,22 @@ def send_no_addon_email(self, dry_run=False, **kwargs): pass else: notification.mark_sent() + + +@celery_app.task(bind=True, name='notifications.tasks.notifications_cleanup_task') +def notifications_cleanup_task(self, dry_run=False, **kwargs): + """Remove old notifications and email tasks from the database.""" + + cutoff_date = timezone.now() - settings.NOTIFICATIONS_CLEANUP_AGE + old_notifications = Notification.objects.filter(sent__lt=cutoff_date) + old_email_tasks = EmailTask.objects.filter(created_at__lt=cutoff_date) + + if dry_run: + notifications_count = old_notifications.count() + email_tasks_count = old_email_tasks.count() + logger.info(f'[Dry Run] Notifications Cleanup Task: {notifications_count} notifications and {email_tasks_count} email tasks would be deleted.') + return + + deleted_notifications_count, _ = old_notifications.delete() + deleted_email_tasks_count, _ = old_email_tasks.delete() + logger.info(f'Notifications Cleanup Task: Deleted {deleted_notifications_count} notifications and {deleted_email_tasks_count} email tasks older than {cutoff_date}.') diff --git a/osf/admin.py b/osf/admin.py index 2f5698b2aca..d9fed50b7ff 100644 --- a/osf/admin.py +++ b/osf/admin.py @@ -367,7 +367,7 @@ class EmailTaskAdmin(admin.ModelAdmin): @admin.register(Notification) class NotificationAdmin(admin.ModelAdmin): - list_display = ('user', 'notification_type_name', 'sent', 'seen') + list_display = ('user', 'notification_type_name', 'sent', 'fake_sent') list_filter = ('sent',) search_fields = ('subscription__notification_type__name', 'subscription__user__username') list_per_page = 50 diff --git a/osf/management/commands/check_crossref_dois.py b/osf/management/commands/check_crossref_dois.py index 348a92d429a..3d7edbe2753 100644 --- a/osf/management/commands/check_crossref_dois.py +++ b/osf/management/commands/check_crossref_dois.py @@ -9,7 +9,7 @@ from framework import sentry from framework.celery_tasks import app as celery_app -from osf.models import Guid, Preprint, NotificationType +from osf.models import Guid, Preprint, NotificationTypeEnum from website import settings @@ -123,12 +123,12 @@ def report_stuck_dois(dry_run=True): if preprints_with_pending_dois: guids = ', '.join(preprints_with_pending_dois.values_list('guids___id', flat=True)) if not dry_run: - NotificationType.Type.USER_CROSSREF_DOI_PENDING.instance.emit( + NotificationTypeEnum.USER_CROSSREF_DOI_PENDING.instance.emit( destination_address=settings.OSF_SUPPORT_EMAIL, event_context={ - 'pending_doi_count': preprints_with_pending_dois.count(), 'time_since_published': time_since_published.days, 'guids': guids, + 'pending_doi_count': preprints_with_pending_dois.count(), } ) else: diff --git a/osf/management/commands/deactivate_requested_accounts.py b/osf/management/commands/deactivate_requested_accounts.py index 8a4eeaf9ad1..6f85296dec2 100644 --- a/osf/management/commands/deactivate_requested_accounts.py +++ b/osf/management/commands/deactivate_requested_accounts.py @@ -5,7 +5,7 @@ from framework.celery_tasks import app as celery_app from website.app import setup_django setup_django() -from osf.models import OSFUser, NotificationType +from osf.models import OSFUser, NotificationTypeEnum from django.core.management.base import BaseCommand from website.settings import OSF_SUPPORT_EMAIL @@ -20,14 +20,13 @@ def deactivate_requested_accounts(dry_run=True): if user.has_resources: logger.info(f'OSF support is being emailed about deactivating the account of user {user._id}.') if not dry_run: - NotificationType.Type.DESK_REQUEST_DEACTIVATION.instance.emit( + NotificationTypeEnum.DESK_REQUEST_DEACTIVATION.instance.emit( destination_address=OSF_SUPPORT_EMAIL, user=user, event_context={ 'user__id': user._id, 'user_absolute_url': user.absolute_url, 'user_username': user.username, - 'can_change_preferences': False, } ) else: @@ -35,12 +34,11 @@ def deactivate_requested_accounts(dry_run=True): if not dry_run: user.deactivate_account() user.is_registered = False - NotificationType.Type.USER_REQUEST_DEACTIVATION_COMPLETE.instance.emit( + NotificationTypeEnum.USER_REQUEST_DEACTIVATION_COMPLETE.instance.emit( user=user, event_context={ 'user_fullname': user.fullname, 'contact_email': OSF_SUPPORT_EMAIL, - 'can_change_preferences': False, } ) diff --git a/osf/management/commands/find_spammy_files.py b/osf/management/commands/find_spammy_files.py index 8c7202e21cf..5a8f18cd63a 100644 --- a/osf/management/commands/find_spammy_files.py +++ b/osf/management/commands/find_spammy_files.py @@ -8,7 +8,7 @@ from addons.osfstorage.models import OsfStorageFile from framework.celery_tasks import app -from osf.models import NotificationType +from osf.models import NotificationTypeEnum logger = logging.getLogger(__name__) @@ -60,7 +60,7 @@ def find_spammy_files(sniff_r=None, n=None, t=None, to_addrs=None): 'attachment_content': output.getvalue(), } for addr in to_addrs: - NotificationType.Type.USER_SPAM_FILES_DETECTED.instance.emit( + NotificationTypeEnum.USER_SPAM_FILES_DETECTED.instance.emit( destination_address=addr, event_context=event_context, email_context=email_context, diff --git a/osf/management/commands/migrate_funder_ids_to_ror.py b/osf/management/commands/migrate_funder_ids_to_ror.py new file mode 100644 index 00000000000..64eb1721d6e --- /dev/null +++ b/osf/management/commands/migrate_funder_ids_to_ror.py @@ -0,0 +1,349 @@ +#!/usr/bin/env python3 +""" +Management command to migrate Crossref Funder IDs to ROR IDs. + +This script reads a CSV mapping file and updates all GuidMetadataRecord entries +that have funding_info with Crossref Funder IDs, converting them to ROR IDs. + +Usage: + # Dry run (recommended first) + python manage.py migrate_funder_ids_to_ror --csv-file /path/to/mapping.csv --dry-run + + # Actual migration + python manage.py migrate_funder_ids_to_ror --csv-file /path/to/mapping.csv + +CSV Format Expected (tab or comma separated): + Funder Name, ror ID, ROR name, Crossref DOI, Funder ID + Example: + National Science Foundation, https://ror.org/021nxhr62, National Science Foundation, http://dx.doi.org/10.13039/100000001, 100000001 +""" +import csv +import logging +import re + +from django.core.management.base import BaseCommand +from django.db import transaction + +from osf.models import GuidMetadataRecord + + +logger = logging.getLogger(__name__) + + +class Command(BaseCommand): + help = 'Migrate Crossref Funder IDs to ROR IDs in GuidMetadataRecord.funding_info' + + def add_arguments(self, parser): + parser.add_argument( + '--csv-file', + type=str, + required=True, + help='Path to the CSV file containing the Crossref to ROR mapping.', + ) + parser.add_argument( + '--dry-run', + action='store_true', + dest='dry_run', + help='Run without making any changes to the database.', + ) + parser.add_argument( + '--batch-size', + type=int, + default=1000, + help='Number of records to process in each batch (default: 1000).', + ) + parser.add_argument( + '--update-funder-name', + action='store_true', + dest='update_funder_name', + help='Also update funder_name to the ROR name from the mapping.', + ) + parser.add_argument( + '--skip-reindex', + action='store_true', + dest='skip_reindex', + help='Skip triggering SHARE/DataCite re-indexing after migration. ' + 'Use this if you plan to run recatalog_metadata separately.', + ) + + def handle(self, *args, **options): + csv_file = options['csv_file'] + dry_run = options['dry_run'] + batch_size = options['batch_size'] + update_funder_name = options['update_funder_name'] + reindex = not options['skip_reindex'] + + if dry_run: + self.stdout.write(self.style.WARNING('[DRY RUN] No changes will be made to the database.')) + + if not reindex: + self.stdout.write(self.style.WARNING('Re-indexing is disabled. Run recatalog_metadata after migration.')) + + # Load the mapping + mapping = self.load_mapping(csv_file) + if not mapping: + self.stdout.write(self.style.ERROR('No valid mappings found in CSV file.')) + return + + self.stdout.write(f'Loaded {len(mapping)} Crossref to ROR mappings.') + + # Find and update records + stats = self.migrate_records(mapping, dry_run, batch_size, update_funder_name, reindex) + + # Print summary + self.stdout.write('\n' + '=' * 60) + self.stdout.write(self.style.SUCCESS('Migration Summary:')) + self.stdout.write(f" Records scanned: {stats['scanned']}") + self.stdout.write(f" Records updated: {stats['updated']}") + self.stdout.write(f" Records re-indexed: {stats['reindexed']}") + self.stdout.write(f" Funders migrated: {stats['funders_migrated']}") + self.stdout.write(f" Unmapped funders removed: {stats['not_in_mapping']}") + self.stdout.write(f" Unique funders not in mapping: {len(stats['unmapped_ids'])}") + if stats['errors']: + self.stdout.write(self.style.ERROR(f" Errors: {stats['errors']}")) + + if stats['unmapped_ids']: + self.stdout.write('\nUnmapped Crossref Funder IDs (not in CSV):') + for funder_id in sorted(stats['unmapped_ids'])[:50]: # Show first 50 + self.stdout.write(f' - {funder_id}') + if len(stats['unmapped_ids']) > 50: + self.stdout.write(f' ... and {len(stats["unmapped_ids"]) - 50} more') + + def load_mapping(self, csv_file): + """Load the Crossref to ROR mapping from CSV file. + + Returns a dict mapping various forms of Crossref ID to ROR info: + { + '100000001': {'ror_id': 'https://ror.org/021nxhr62', 'ror_name': 'National Science Foundation'}, + 'http://dx.doi.org/10.13039/100000001': {...}, + 'https://doi.org/10.13039/100000001': {...}, + ... + } + """ + mapping = {} + + try: + with open(csv_file, 'r', encoding='utf-8-sig') as f: + # Try to detect delimiter + sample = f.read(2048) + f.seek(0) + if '\t' in sample: + delimiter = '\t' + else: + delimiter = ',' + + reader = csv.DictReader(f, delimiter=delimiter) + + # Normalize column names (handle various formats) + for row in reader: + # Try to find the relevant columns + ror_id = None + ror_name = None + crossref_doi = None + funder_id = None + + for key, value in row.items(): + if not key: + continue + key_lower = key.lower().strip() + + if 'ror' in key_lower and 'id' in key_lower and 'ror_name' not in key_lower: + ror_id = value.strip() if value else None + elif 'ror' in key_lower and 'name' in key_lower: + ror_name = value.strip() if value else None + elif 'crossref' in key_lower and 'doi' in key_lower: + crossref_doi = value.strip() if value else None + elif key_lower == 'funder id' or key_lower == 'funder_id': + funder_id = value.strip() if value else None + + if not ror_id: + continue + + ror_info = { + 'ror_id': ror_id, + 'ror_name': ror_name, + } + + # Add mappings for various ID formats + if funder_id: + mapping[funder_id] = ror_info + # Also add with various DOI prefixes + mapping[f'http://dx.doi.org/10.13039/{funder_id}'] = ror_info + mapping[f'https://doi.org/10.13039/{funder_id}'] = ror_info + mapping[f'10.13039/{funder_id}'] = ror_info + + if crossref_doi: + mapping[crossref_doi] = ror_info + # Normalize the DOI URL + if crossref_doi.startswith('http://'): + mapping[crossref_doi.replace('http://', 'https://')] = ror_info + elif crossref_doi.startswith('https://'): + mapping[crossref_doi.replace('https://', 'http://')] = ror_info + + except FileNotFoundError: + self.stdout.write(self.style.ERROR(f'CSV file not found: {csv_file}')) + return None + except Exception as e: + self.stdout.write(self.style.ERROR(f'Error reading CSV file: {e}')) + return None + + return mapping + + def extract_funder_id(self, identifier): + """Extract the numeric funder ID from various identifier formats.""" + if not identifier: + return None + + # Already just a number + if re.match(r'^\d+$', identifier): + return identifier + + # Extract from DOI URL (e.g., http://dx.doi.org/10.13039/100000001) + match = re.search(r'10\.13039/(\d+)', identifier) + if match: + return match.group(1) + + return identifier + + def migrate_records(self, mapping, dry_run, batch_size, update_funder_name, reindex): + """Find and migrate all GuidMetadataRecord entries with Crossref Funder IDs.""" + stats = { + 'scanned': 0, + 'updated': 0, + 'reindexed': 0, + 'funders_migrated': 0, + 'not_in_mapping': 0, + 'errors': 0, + 'unmapped_ids': set(), + } + + # Query records that have non-empty funding_info + # We need to check if any funder has 'Crossref Funder ID' type + queryset = GuidMetadataRecord.objects.exclude(funding_info=[]).exclude(funding_info__isnull=True) + + total_count = queryset.count() + self.stdout.write(f'Found {total_count} records with funding_info to scan.') + + processed = 0 + for record in queryset.iterator(chunk_size=batch_size): + stats['scanned'] += 1 + processed += 1 + + if processed % 500 == 0: + self.stdout.write(f' Processed {processed}/{total_count} records...') + + try: + updated, funder_stats = self.migrate_record(record, mapping, dry_run, update_funder_name) + if updated: + stats['updated'] += 1 + if reindex and not dry_run: + try: + self.reindex_record(record) + stats['reindexed'] += 1 + except Exception as e: + logger.error(f'Error re-indexing record {record.guid._id}: {e}') + stats['funders_migrated'] += funder_stats['migrated'] + stats['not_in_mapping'] += funder_stats['not_found'] + stats['unmapped_ids'].update(funder_stats['unmapped_ids']) + except Exception as e: + stats['errors'] += 1 + logger.error(f'Error migrating record {record.guid._id}: {e}') + + return stats + + def migrate_record(self, record, mapping, dry_run, update_funder_name): + """Migrate a single GuidMetadataRecord's funding_info. + + Returns (was_updated, funder_stats) + """ + funder_stats = { + 'migrated': 0, + 'not_found': 0, + 'unmapped_ids': set(), + } + + if not record.funding_info: + return False, funder_stats + + updated_funding_info = [] + record_modified = False + + for funder in record.funding_info: + funder_type = funder.get('funder_identifier_type', '') + funder_identifier = funder.get('funder_identifier', '') + + # Only migrate Crossref Funder IDs (includes legacy 'Crossref Funder URI' type) + if funder_type not in ('Crossref Funder ID', 'Crossref Funder URI'): + updated_funding_info.append(funder) + continue + + # Try to find in mapping + ror_info = None + + # Try exact match first + if funder_identifier in mapping: + ror_info = mapping[funder_identifier] + else: + # Try to extract numeric ID and look up + numeric_id = self.extract_funder_id(funder_identifier) + if numeric_id and numeric_id in mapping: + ror_info = mapping[numeric_id] + + if ror_info: + # Create updated funder entry + updated_funder = funder.copy() + updated_funder['funder_identifier'] = ror_info['ror_id'] + updated_funder['funder_identifier_type'] = 'ROR' + + if update_funder_name and ror_info.get('ror_name'): + updated_funder['funder_name'] = ror_info['ror_name'] + + updated_funding_info.append(updated_funder) + record_modified = True + funder_stats['migrated'] += 1 + + logger.info( + f'{"[DRY RUN] " if dry_run else ""}' + f'Migrating funder in {record.guid._id}: ' + f'{funder_identifier} -> {ror_info["ror_id"]}' + ) + else: + # No mapping found, remove unmapped Crossref funder + record_modified = True + funder_stats['not_found'] += 1 + funder_stats['unmapped_ids'].add(funder_identifier) + + logger.warning( + f'{"[DRY RUN] " if dry_run else ""}' + f'Removing unmapped Crossref Funder ID: {funder_identifier} ' + f'from record {record.guid._id}' + ) + + # Warn about duplicate ROR IDs that would result from migration + if record_modified: + ror_identifiers = [ + f['funder_identifier'] + for f in updated_funding_info + if f.get('funder_identifier_type') == 'ROR' + ] + seen = set() + duplicates = {rid for rid in ror_identifiers if rid in seen or seen.add(rid)} + if duplicates: + logger.warning( + f'Record {record.guid._id} has duplicate ROR IDs after migration: {duplicates}' + ) + + if record_modified and not dry_run: + with transaction.atomic(): + record.funding_info = updated_funding_info + record.save(update_fields=['funding_info']) + + return record_modified, funder_stats + + def reindex_record(self, record): + """Trigger SHARE/ElasticSearch and DataCite re-indexing for the record's referent.""" + referent = record.guid.referent + if hasattr(referent, 'update_search'): + referent.update_search() + if hasattr(referent, 'request_identifier_update'): + referent.request_identifier_update('doi') diff --git a/osf/management/commands/migrate_funder_names_to_ror.py b/osf/management/commands/migrate_funder_names_to_ror.py new file mode 100644 index 00000000000..5c8b1e513e6 --- /dev/null +++ b/osf/management/commands/migrate_funder_names_to_ror.py @@ -0,0 +1,307 @@ +#!/usr/bin/env python3 +""" +Management command to migrate ROR funders to use ROR funder names. + +This script reads a CSV mapping file and updates all GuidMetadataRecord entries +that have funding_info with ROR funder IDs, converting them to ROR IDs. + +This has similar functionality to migrate_funder_ids_to_ror.py but is useful if +someone that definitely doesn't have the github id felliott forgot to include +name migrations when running the prior script. It's also useful for generally +updating a bunch of ROR funder names. + +Usage: + # Dry run (recommended first) + python manage.py migrate_funder_names_to_ror --csv-file /path/to/mapping.csv --dry-run + + # Actual migration + python manage.py migrate_funder_names_to_ror --csv-file /path/to/mapping.csv + +CSV Format Expected (tab or comma separated): + Funder Name, ror ID, ROR name, Crossref DOI, Funder ID + Example: + National Science Foundation, https://ror.org/021nxhr62, National Science Foundation, http://dx.doi.org/10.13039/100000001, 100000001 + +Only the "ror id" and "ror name" columns are used. The others may be omitted. + +""" +import csv +import logging + +from django.core.management.base import BaseCommand +from django.db import transaction + +from osf.models import GuidMetadataRecord + + +logger = logging.getLogger(__name__) + + +class Command(BaseCommand): + help = 'Migrate Crossref Funder IDs to ROR IDs in GuidMetadataRecord.funding_info' + + def add_arguments(self, parser): + parser.add_argument( + '--csv-file', + type=str, + required=True, + help='Path to the CSV file containing the Crossref to ROR mapping.', + ) + parser.add_argument( + '--dry-run', + action='store_true', + dest='dry_run', + help='Run without making any changes to the database.', + ) + parser.add_argument( + '--batch-size', + type=int, + default=1000, + help='Number of records to process in each batch (default: 1000).', + ) + parser.add_argument( + '--skip-reindex', + action='store_true', + dest='skip_reindex', + help='Skip triggering SHARE/DataCite re-indexing after migration. ' + 'Use this if you plan to run recatalog_metadata separately.', + ) + + def handle(self, *args, **options): + csv_file = options['csv_file'] + dry_run = options['dry_run'] + batch_size = options['batch_size'] + reindex = not options['skip_reindex'] + + if dry_run: + self.stdout.write(self.style.WARNING('[DRY RUN] No changes will be made to the database.')) + + if not reindex: + self.stdout.write(self.style.WARNING('Re-indexing is disabled. Run recatalog_metadata after migration.')) + + # Load the mapping + mapping = self.load_mapping(csv_file) + if not mapping: + self.stdout.write(self.style.ERROR('No valid mappings found in CSV file.')) + return + + self.stdout.write(f'Loaded {len(mapping)} ROR id to name mappings.') + + # Find and update records + stats = self.migrate_records(mapping, dry_run, batch_size, reindex) + + # Print summary + self.stdout.write('\n' + '=' * 60) + self.stdout.write(self.style.SUCCESS('Migration Summary:')) + self.stdout.write(f" Records scanned: {stats['scanned']}") + self.stdout.write(f" Records updated: {stats['updated']}") + self.stdout.write(f" Records re-indexed: {stats['reindexed']}") + self.stdout.write(f" Funder names updated: {stats['funders_migrated']}") + self.stdout.write(f" Unmapped funders removed: {stats['not_in_mapping']}") + self.stdout.write(f" Unique funders not in mapping: {len(stats['unmapped_ids'])}") + if stats['errors']: + self.stdout.write(self.style.ERROR(f" Errors: {stats['errors']}")) + + if stats['unmapped_ids']: + self.stdout.write('\nUnmapped ROR Funder IDs (not in CSV):') + for funder_id in sorted(stats['unmapped_ids'])[:50]: # Show first 50 + self.stdout.write(f' - {funder_id}') + if len(stats['unmapped_ids']) > 50: + self.stdout.write(f' ... and {len(stats["unmapped_ids"]) - 50} more') + + def load_mapping(self, csv_file): + """Load the ROR ID to ROR info mapping from CSV file. + + Returns a dict mapping ROR IDs to ROR info: + { + 'https://ror.org/021nxhr62': { + 'ror_id': 'https://ror.org/021nxhr62', + 'ror_name': 'National Science Foundation' + }, + ... + } + """ + mapping = {} + + try: + with open(csv_file, 'r', encoding='utf-8-sig') as f: + # Try to detect delimiter + sample = f.read(2048) + f.seek(0) + if '\t' in sample: + delimiter = '\t' + else: + delimiter = ',' + + reader = csv.DictReader(f, delimiter=delimiter) + + # Normalize column names (handle various formats) + for row in reader: + # Try to find the relevant columns + ror_id = None + ror_name = None + + for key, value in row.items(): + if not key: + continue + key_lower = key.lower().strip() + + if 'ror' in key_lower and 'id' in key_lower and 'ror_name' not in key_lower: + ror_id = value.strip() if value else None + elif 'ror' in key_lower and 'name' in key_lower: + ror_name = value.strip() if value else None + + if not ror_id: + continue + + ror_info = { + 'ror_id': ror_id, + 'ror_name': ror_name, + } + + # Add mappings for various ID formats + mapping[ror_id] = ror_info + + except FileNotFoundError: + self.stdout.write(self.style.ERROR(f'CSV file not found: {csv_file}')) + return None + except Exception as e: + self.stdout.write(self.style.ERROR(f'Error reading CSV file: {e}')) + return None + + return mapping + + def migrate_records(self, mapping, dry_run, batch_size, reindex): + """Find and migrate all GuidMetadataRecord entries with Crossref Funder IDs.""" + stats = { + 'scanned': 0, + 'updated': 0, + 'reindexed': 0, + 'funders_migrated': 0, + 'not_in_mapping': 0, + 'errors': 0, + 'unmapped_ids': set(), + } + + # Query records that have non-empty funding_info + # We need to check if any funder has 'Crossref Funder ID' type + queryset = GuidMetadataRecord.objects.exclude(funding_info=[]).exclude(funding_info__isnull=True) + + total_count = queryset.count() + self.stdout.write(f'Found {total_count} records with funding_info to scan.') + + processed = 0 + for record in queryset.iterator(chunk_size=batch_size): + stats['scanned'] += 1 + processed += 1 + + if processed % 500 == 0: + self.stdout.write(f' Processed {processed}/{total_count} records...') + + try: + updated, funder_stats = self.migrate_record(record, mapping, dry_run) + if updated: + stats['updated'] += 1 + if reindex and not dry_run: + try: + self.reindex_record(record) + stats['reindexed'] += 1 + except Exception as e: + logger.error(f'Error re-indexing record {record.guid._id}: {e}') + stats['funders_migrated'] += funder_stats['migrated'] + stats['not_in_mapping'] += funder_stats['not_found'] + stats['unmapped_ids'].update(funder_stats['unmapped_ids']) + except Exception as e: + stats['errors'] += 1 + logger.error(f'Error migrating record {record.guid._id}: {e}') + + return stats + + def migrate_record(self, record, mapping, dry_run): + """Migrate a single GuidMetadataRecord's funding_info. + + Returns (was_updated, funder_stats) + """ + funder_stats = { + 'migrated': 0, + 'not_found': 0, + 'unmapped_ids': set(), + } + + if not record.funding_info: + return False, funder_stats + + updated_funding_info = [] + record_modified = False + + for funder in record.funding_info: + funder_type = funder.get('funder_identifier_type', '') + funder_identifier = funder.get('funder_identifier', '') + + # Only update ROR funder records + if funder_type != 'ROR': + updated_funding_info.append(funder) + continue + + # Try to find in mapping + ror_info = mapping.get(funder_identifier, None) + if ror_info is None: + logger.info( + f'{"[DRY RUN] " if dry_run else ""}' + f'Unrecognized ror id for {record.guid._id}: ' + f'{funder_identifier}' + ) + updated_funding_info.append(funder) + continue + + # Has name changed? + if funder.get('funder_name') == ror_info['ror_name']: + logger.info( + f'{"[DRY RUN] " if dry_run else ""}' + f'ROR name unchanged for {record.guid._id}: ' + f'{funder_identifier} -> {funder.get("funder_name")}' + ) + updated_funding_info.append(funder) + continue + + # Create updated funder entry + logger.info( + f'{"[DRY RUN] " if dry_run else ""}' + f'Updating name for {record.guid._id}: ' + f'id {funder_identifier} from {funder["funder_name"]} to {ror_info["ror_name"]}' + ) + updated_funder = funder.copy() + updated_funder['funder_name'] = ror_info['ror_name'] + updated_funding_info.append(updated_funder) + record_modified = True + funder_stats['migrated'] += 1 + + # Warn about duplicate ROR IDs that would result from migration + # THIS SHOULDN'T HAPPEN + if record_modified: + ror_identifiers = [ + f['funder_identifier'] + for f in updated_funding_info + if f.get('funder_identifier_type') == 'ROR' + ] + seen = set() + duplicates = {rid for rid in ror_identifiers if rid in seen or seen.add(rid)} + if duplicates: + logger.warning( + f'Record {record.guid._id} has duplicate ROR IDs after migration: {duplicates}' + ) + + if record_modified and not dry_run: + with transaction.atomic(): + record.funding_info = updated_funding_info + record.save(update_fields=['funding_info']) + + return record_modified, funder_stats + + def reindex_record(self, record): + """Trigger SHARE/ElasticSearch and DataCite re-indexing for the record's referent.""" + referent = record.guid.referent + if hasattr(referent, 'update_search'): + referent.update_search() + if hasattr(referent, 'request_identifier_update'): + referent.request_identifier_update('doi') diff --git a/osf/management/commands/migrate_notifications.py b/osf/management/commands/migrate_notifications.py index 10fd397c09d..dbd95f77cef 100644 --- a/osf/management/commands/migrate_notifications.py +++ b/osf/management/commands/migrate_notifications.py @@ -7,7 +7,7 @@ from django.core.management.base import BaseCommand, CommandError from django.db import transaction, connection -from osf.models import NotificationType, NotificationSubscription +from osf.models import NotificationType, NotificationTypeEnum, NotificationSubscription from osf.models.notifications import NotificationSubscriptionLegacy from osf.management.commands.populate_notification_types import populate_notification_types from tqdm import tqdm @@ -25,13 +25,13 @@ EVENT_NAME_TO_NOTIFICATION_TYPE = { # Provider notifications - 'global_reviews': NotificationType.Type.REVIEWS_SUBMISSION_STATUS, + 'global_reviews': NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS, # Node notifications - 'file_updated': NotificationType.Type.NODE_FILE_UPDATED, + 'file_updated': NotificationTypeEnum.NODE_FILE_UPDATED, # User notifications - 'global_file_updated': NotificationType.Type.USER_FILE_UPDATED, + 'global_file_updated': NotificationTypeEnum.USER_FILE_UPDATED, } @@ -152,7 +152,7 @@ def migrate_legacy_notification_subscriptions( notif_enum = EVENT_NAME_TO_NOTIFICATION_TYPE.get(event_name) if subscribed_object == legacy.user and event_name == 'global_file_updated': - notif_enum = NotificationType.Type.USER_FILE_UPDATED + notif_enum = NotificationTypeEnum.USER_FILE_UPDATED if not notif_enum: skipped += 1 continue diff --git a/osf/management/commands/remove_duplicate_notification_subscriptions_v2.py b/osf/management/commands/remove_duplicate_notification_subscriptions_v2.py new file mode 100644 index 00000000000..2c7aec2a2fa --- /dev/null +++ b/osf/management/commands/remove_duplicate_notification_subscriptions_v2.py @@ -0,0 +1,94 @@ +from django.core.management.base import BaseCommand +from django.db import transaction +from django.db.models import OuterRef, Exists, Q + +from osf.models import NotificationSubscription, NotificationType, NotificationTypeEnum + + +class Command(BaseCommand): + help = ( + 'Remove duplicate NotificationSubscription records, keeping only the highest-id record: ' + 'Default uniqueness: (user, content_type, object_id, notification_type, is_digest); ' + ) + + def add_arguments(self, parser): + parser.add_argument( + '--dry', + action='store_true', + help='Show how many rows would be deleted without deleting anything.', + ) + + def handle(self, *args, **options): + + self.stdout.write('Finding duplicate NotificationSubscription records…') + digest_type_names = { + # User types + NotificationTypeEnum.USER_NO_ADDON.value, + # File types + NotificationTypeEnum.ADDON_FILE_COPIED.value, + NotificationTypeEnum.ADDON_FILE_MOVED.value, + NotificationTypeEnum.ADDON_FILE_RENAMED.value, + NotificationTypeEnum.FILE_ADDED.value, + NotificationTypeEnum.FILE_REMOVED.value, + NotificationTypeEnum.FILE_UPDATED.value, + NotificationTypeEnum.FOLDER_CREATED.value, + NotificationTypeEnum.NODE_FILE_UPDATED.value, + NotificationTypeEnum.USER_FILE_UPDATED.value, + # Review types + NotificationTypeEnum.COLLECTION_SUBMISSION_SUBMITTED.value, + NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS.value, + NotificationTypeEnum.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.value, + NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS.value, + } + + digest_type_ids = NotificationType.objects.filter( + name__in=digest_type_names + ).values_list('id', flat=True) + + invalid_non_digest = NotificationSubscription.objects.filter( + notification_type_id__in=digest_type_ids, + _is_digest=False, + ) + invalid_non_digest_count = invalid_non_digest.count() + + invalid_digest = NotificationSubscription.objects.filter( + ~Q(notification_type_id__in=digest_type_ids), + _is_digest=True, + ) + invalid_digest_count = invalid_digest.count() + + if not options['dry']: + invalid_non_digest.update(_is_digest=True) + invalid_digest.update(_is_digest=False) + + to_remove = NotificationSubscription.objects.filter( + Exists( + NotificationSubscription.objects.filter( + user_id=OuterRef('user_id'), + content_type_id=OuterRef('content_type_id'), + object_id=OuterRef('object_id'), + notification_type_id=OuterRef('notification_type_id'), + _is_digest=OuterRef('_is_digest'), + id__gt=OuterRef('id'), # keep most recent record + ) + ) + ) + + count = to_remove.count() + self.stdout.write(f"Duplicates to remove: {count}") + self.stdout.write(f"Invalid non-digest records: {invalid_non_digest_count}") + self.stdout.write(f"Invalid digest records: {invalid_digest_count}") + + if count == 0 and invalid_non_digest_count == 0 and invalid_digest_count == 0: + self.stdout.write(self.style.SUCCESS('No duplicates or invalid records found.')) + return + + if options['dry']: + self.stdout.write(self.style.WARNING('Dry run enabled — no records were deleted.')) + return + + with transaction.atomic(): + deleted, _ = to_remove.delete() + self.stdout.write(self.style.SUCCESS(f"Successfully removed {deleted} duplicate records.")) + self.stdout.write(self.style.SUCCESS(f"Successfully updated {invalid_non_digest_count} non-digest records.")) + self.stdout.write(self.style.SUCCESS(f"Successfully updated {invalid_digest_count} digest records.")) diff --git a/osf/management/commands/send_storage_exceeded_announcement.py b/osf/management/commands/send_storage_exceeded_announcement.py index 8c4a687f3ce..cc84414ed4d 100644 --- a/osf/management/commands/send_storage_exceeded_announcement.py +++ b/osf/management/commands/send_storage_exceeded_announcement.py @@ -4,7 +4,7 @@ from django.core.management.base import BaseCommand -from osf.models import Node, OSFUser, NotificationType +from osf.models import Node, OSFUser, NotificationType, NotificationTypeEnum logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) @@ -40,13 +40,12 @@ def main(json_file, dry=False): if not dry: try: NotificationType.objects.get( - name=NotificationType.Type.USER_STORAGE_CAP_EXCEEDED_ANNOUNCEMENT + name=NotificationTypeEnum.USER_STORAGE_CAP_EXCEEDED_ANNOUNCEMENT ).emit( user=user, event_context={ 'public_nodes': public_nodes, 'private_nodes': private_nodes, - 'can_change_preferences': False, } ) except Exception: diff --git a/osf/metadata/osf_gathering.py b/osf/metadata/osf_gathering.py index f1da7e7e39d..240e5c96561 100644 --- a/osf/metadata/osf_gathering.py +++ b/osf/metadata/osf_gathering.py @@ -6,6 +6,7 @@ from django.contrib.contenttypes.models import ContentType from django import db +from mimetypes import MimeTypes import rdflib from api.caching.tasks import get_storage_usage_total @@ -44,6 +45,8 @@ logger = logging.getLogger(__name__) +mime = MimeTypes() + ##### BEGIN "public" api ##### @@ -373,7 +376,7 @@ def osf_iri(guid_or_model): return OSFIO[guid._id] -def osfguid_from_iri(iri): +def osfguid_from_iri(iri: str) -> str: if iri.startswith(OSFIO): return without_namespace(iri, OSFIO) raise ValueError(f'expected iri starting with "{OSFIO}" (got "{iri}")') @@ -704,6 +707,16 @@ def gather_files(focus): yield (DCTERMS.requires, file_focus) +@gather.er(DCAT.mediaType) +def gather_file_mediatype(focus): + (mime_type, _) = mime.guess_type(focus.dbmodel.name) + yield (DCAT.mediaType, ( + 'application/octet-stream' + if mime_type is None + else mime_type + )) + + @gather.er(DCTERMS.hasPart, DCTERMS.isPartOf) def gather_parts(focus): if isinstance(focus.dbmodel, osfdb.AbstractNode): diff --git a/osf/metadata/rdfutils.py b/osf/metadata/rdfutils.py index d2596ad344e..7528bb390a3 100644 --- a/osf/metadata/rdfutils.py +++ b/osf/metadata/rdfutils.py @@ -26,7 +26,7 @@ PROV = rdflib.Namespace('http://www.w3.org/ns/prov#') # "provenance" # non-standard namespace for datacite terms (resolves to datacite docs) DATACITE = rdflib.Namespace('https://schema.datacite.org/meta/kernel-4/#') - +SCHEMA = rdflib.Namespace('https://schema.org/') # namespace prefixes that will be shortened by default # when serialized, instead of displaying the full iri @@ -43,6 +43,49 @@ } +DATACITE_SCHEMA_RESOURCE_TYPE_GENERAL_MAPPING = { + DATACITE.Audiovisual: SCHEMA.MediaObject, + DATACITE.Book: SCHEMA.Book, + DATACITE.BookChapter: SCHEMA.Chapter, + DATACITE.Collection: SCHEMA.Collection, + DATACITE.ComputationalNotebook: SCHEMA.SoftwareSourceCode, + DATACITE.ConferencePaper: SCHEMA.Article, + DATACITE.ConferenceProceeding: SCHEMA.Periodical, + DATACITE.DataPaper: SCHEMA.Article, + DATACITE.Dataset: SCHEMA.Dataset, + DATACITE.Dissertation: SCHEMA.Thesis, + DATACITE.Event: SCHEMA.Event, + DATACITE.Image: SCHEMA.ImageObject, + DATACITE.InteractiveResource: SCHEMA.CreativeWork, + DATACITE.Journal: SCHEMA.Periodical, + DATACITE.JournalArticle: SCHEMA.ScholarlyArticle, + DATACITE.Model: SCHEMA.CreativeWork, + DATACITE.OutputManagementPlan: SCHEMA.HowTo, + DATACITE.PeerReview: SCHEMA.Review, + DATACITE.PhysicalObject: SCHEMA.Thing, + DATACITE.Preprint: SCHEMA.ScholarlyArticle, + DATACITE.Report: SCHEMA.Report, + DATACITE.Service: SCHEMA.Service, + DATACITE.Software: SCHEMA.SoftwareSourceCode, + DATACITE.Sound: SCHEMA.AudioObject, + DATACITE.Standard: SCHEMA.CreativeWork, + DATACITE.Text: SCHEMA.Text, + DATACITE.Workflow: SCHEMA.HowTo, + DATACITE.Other: SCHEMA.CreativeWork, + DATACITE.Instrument: SCHEMA.MeasurementMethodEnum, + DATACITE.StudyRegistration: SCHEMA.Text, + OSF.Project: SCHEMA.CreativeWork, + OSF.Preprint: SCHEMA.ScholarlyArticle, + OSF.Registration: SCHEMA.Text, + OSF.File: SCHEMA.DigitalDocument, + OSF.ProjectComponent: SCHEMA.CreativeWork, + OSF.RegistrationComponent: SCHEMA.Text, +} + + +DEFAULT_SCHEMADOTORG_RESOURCE_TYPE = SCHEMA.CreativeWork + + def contextualized_graph(graph=None) -> rdflib.Graph: '''bind default namespace prefixes to a new (or given) rdf graph ''' @@ -147,3 +190,6 @@ def smells_like_iri(maybe_iri: str) -> bool: isinstance(maybe_iri, str) and '://' in maybe_iri ) + +def map_resource_type_general_datacite_to_scheme(_type_iri: rdflib.URIRef, resource_rdftype: rdflib.URIRef) -> str: + return DATACITE_SCHEMA_RESOURCE_TYPE_GENERAL_MAPPING.get(_type_iri) or DATACITE_SCHEMA_RESOURCE_TYPE_GENERAL_MAPPING.get(resource_rdftype, DEFAULT_SCHEMADOTORG_RESOURCE_TYPE) diff --git a/osf/metadata/schemas/datacite.json b/osf/metadata/schemas/datacite.json index 650598b8ee4..555c9e56e9a 100644 --- a/osf/metadata/schemas/datacite.json +++ b/osf/metadata/schemas/datacite.json @@ -470,8 +470,12 @@ "ISNI", "GRID", "Crossref Funder ID", + "ROR", "Other" ] + }, + "schemeURI": { + "$ref": "#/definitions/uri" } }, "additionalProperties": false, diff --git a/osf/metadata/serializers/__init__.py b/osf/metadata/serializers/__init__.py index 0a2bf995e11..6dc44b87c93 100644 --- a/osf/metadata/serializers/__init__.py +++ b/osf/metadata/serializers/__init__.py @@ -9,6 +9,7 @@ from .datacite import DataciteJsonMetadataSerializer, DataciteXmlMetadataSerializer from .google_dataset_json_ld import GoogleDatasetJsonLdSerializer from .turtle import TurtleMetadataSerializer +from .linkset import SignpostLinkset, SignpostLinksetJSON METADATA_SERIALIZER_REGISTRY = { @@ -16,6 +17,8 @@ 'datacite-json': DataciteJsonMetadataSerializer, 'datacite-xml': DataciteXmlMetadataSerializer, 'google-dataset-json-ld': GoogleDatasetJsonLdSerializer, + 'linkset': SignpostLinkset, + 'linkset-json': SignpostLinksetJSON } diff --git a/osf/metadata/serializers/datacite/datacite_tree_walker.py b/osf/metadata/serializers/datacite/datacite_tree_walker.py index 5f0a283d450..950ac3b50dd 100644 --- a/osf/metadata/serializers/datacite/datacite_tree_walker.py +++ b/osf/metadata/serializers/datacite/datacite_tree_walker.py @@ -195,12 +195,12 @@ def _identifier_type_and_value(self, identifier: str): return ('URL', identifier) logger.warning('skipping non-IRI-shaped identifier "%s"', identifier) - def _funder_identifier_type(self, identifier: str): + def _funder_identifier_type_and_scheme(self, identifier: str): if identifier.startswith(DxDOI) or identifier.startswith(DOI): - return 'Crossref Funder ID' + return ('Crossref Funder ID', 'https://www.crossref.org/services/funder-registry/') if identifier.startswith(ROR): - return 'ROR' - return 'Other' + return ('ROR', str(ROR)) + return ('Other', '') def _get_name_type(self, agent_iri): if (agent_iri, RDF.type, FOAF.Person) in self.basket: @@ -312,13 +312,15 @@ def _funding_reference(self, fundrefs_el, funder, funding_award=None): _fundref_el = self.visit(fundrefs_el, 'fundingReference') self.visit(_fundref_el, 'funderName', text=next(self.basket[funder:FOAF.name], '')) _funder_identifier = next(self.basket[funder:DCTERMS.identifier], '') + _funder_id_type, _funder_scheme_uri = self._funder_identifier_type_and_scheme(_funder_identifier) + _funder_id_attrib = {'funderIdentifierType': _funder_id_type} + if _funder_scheme_uri: + _funder_id_attrib['schemeURI'] = _funder_scheme_uri self.visit( _fundref_el, 'funderIdentifier', text=_funder_identifier, - attrib={ - 'funderIdentifierType': self._funder_identifier_type(_funder_identifier), - }, + attrib=_funder_id_attrib, ) if funding_award is not None: self.visit( diff --git a/osf/metadata/serializers/linkset.py b/osf/metadata/serializers/linkset.py new file mode 100644 index 00000000000..f83dad00ebd --- /dev/null +++ b/osf/metadata/serializers/linkset.py @@ -0,0 +1,153 @@ +"""osf.metadata.serializers.signpost_linkset: FAIR signposting with osf metadata +FAIR signposting: https://signposting.org/FAIR/ +definition of linkset mediatypes: https://www.rfc-editor.org/rfc/rfc9264.html +""" +from __future__ import annotations +import abc +from collections.abc import ( + Iterable, + Iterator +) +from collections import defaultdict +import dataclasses +import json +from urllib.parse import urljoin, urlsplit, urlencode, urlunsplit + +import rdflib + +from ._base import MetadataSerializer +from osf.metadata.osf_gathering import osfguid_from_iri +from osf.metadata.rdfutils import (DOI, DATACITE, DCTERMS, OWL, RDF, OSF, DCAT, SCHEMA, DATACITE_SCHEMA_RESOURCE_TYPE_GENERAL_MAPPING, map_resource_type_general_datacite_to_scheme) +from website.settings import DOMAIN +from website.util import web_url_for + + +@dataclasses.dataclass +class SignpostLink: + anchor_uri: str + relation: str + target_uri: str + target_attrs: Iterable[tuple[str, str]] = () + + +class BaseSignpostLinkset(MetadataSerializer, abc.ABC): + def _each_link(self) -> Iterator[SignpostLink]: + focus_iri = self.basket.focus.iri + resource_rdftype = self.basket.focus.rdftype + if resource_rdftype == OSF.File: + # collection (file's containing obj) + for _collection_uri in self.basket[OSF.isContainedBy]: + yield SignpostLink(focus_iri, 'collection', str(_collection_uri)) + + # author + for _creator_iri in self.basket[DCTERMS.creator]: + yield SignpostLink(focus_iri, 'author', str(_creator_iri)) + + # type + if resource_rdftype == OSF.File: + parent_types = set(self.basket[OSF.isContainedBy / (DCTERMS.type | RDF.type)]) + # get either datacite or osf type + _type_iris = list(self.basket[DCTERMS.type]) or list(self.basket[RDF.type]) + for _type_iri in _type_iris: + # check the type differs from parent project / registry / preprint + if _type_iri not in parent_types: + schema_type = map_resource_type_general_datacite_to_scheme(_type_iri, resource_rdftype) + yield SignpostLink(focus_iri, 'type', schema_type) + else: + # get either datacite or osf type + _type_iris = list(self.basket[DCTERMS.type]) or list(self.basket[RDF.type]) + for _type_iri in _type_iris: + if isinstance(_type_iri, rdflib.URIRef) and _type_iri.startswith(DATACITE): + schema_type = map_resource_type_general_datacite_to_scheme(_type_iri, resource_rdftype) + yield SignpostLink(focus_iri, 'type', schema_type) + else: + schema_type = DATACITE_SCHEMA_RESOURCE_TYPE_GENERAL_MAPPING.get(resource_rdftype) + yield SignpostLink(focus_iri, 'type', schema_type) + yield SignpostLink(focus_iri, 'type', SCHEMA.AboutPage) + + # cite-as + yield SignpostLink(focus_iri, 'cite-as', next(( + _sameas_iri + for _sameas_iri in self.basket[OWL.sameAs] + if _sameas_iri.startswith(DOI) + ), focus_iri)) + + base_metadata_url = urljoin(DOMAIN, web_url_for( + 'metadata_download', # name of a view function mapped in website/routes.py + guid=osfguid_from_iri(self.basket.focus.iri), + )) + split_base_metadata_url = urlsplit(base_metadata_url) + + from osf.metadata.serializers import METADATA_SERIALIZER_REGISTRY + # describedby + for _format_key, _serializer in METADATA_SERIALIZER_REGISTRY.items(): + _metadata_url = urlunsplit(split_base_metadata_url._replace( + query=urlencode({'format': _format_key}), + )) + yield SignpostLink( + focus_iri, + 'describedby', + _metadata_url, + [('type', _serializer.mediatype)] + ) + + # license + for _license_uri in self.basket[DCTERMS.rights]: + if not isinstance(_license_uri, rdflib.BNode): + yield SignpostLink(focus_iri, 'license', str(_license_uri)) + + # item + for _file_iri in self.basket[OSF.contains]: + for mime_type in self.basket[_file_iri:DCAT.mediaType]: + yield SignpostLink(focus_iri, 'item', str(_file_iri), [('type', mime_type)]) + + +class SignpostLinkset(BaseSignpostLinkset): + mediatype = 'application/linkset' + + def filename_for_itemid(self, itemid: str): + return f'{itemid}-metadata.linkset' + + def serialize(self) -> str | bytes: + """serialize a linkset for FAIR signposting + see example https://www.rfc-editor.org/rfc/rfc9264.html#section-7.1 + FAIR signposting: https://signposting.org/FAIR/ + """ + result = ',\n'.join(self._serialize_link(link) for link in self._each_link()) + return '{}\n'.format(result) + + def _serialize_link(self, link: SignpostLink) -> str: + segments = [ + f'<{link.target_uri}>', + f'rel="{link.relation}"', + f'anchor="{link.anchor_uri}"' + ] + for key, value in link.target_attrs: + segments.append(f'{key}="{value}"') + return ' ; '.join(segments) + +class SignpostLinksetJSON(BaseSignpostLinkset): + mediatype = 'application/linkset+json' + + def filename_for_itemid(self, itemid: str): + return f'{itemid}-metadata.linkset.json' + + def serialize(self) -> str | bytes: + """serialize linkset json + definition: https://www.rfc-editor.org/rfc/rfc9264.html#section-4.2 + example: https://www.rfc-editor.org/rfc/rfc9264.html#section-7.2 + """ + grouped_links = defaultdict(lambda: defaultdict(list)) + + for link in self._each_link(): + link_entry = {'href': link.target_uri} + link_entry.update(link.target_attrs) + grouped_links[link.anchor_uri][link.relation].append(link_entry) + + linkset = [] + for anchor, relations in grouped_links.items(): + anchor_entry = {'anchor': anchor} + anchor_entry.update(relations) + linkset.append(anchor_entry) + + return json.dumps({'linkset': linkset}, indent=2) diff --git a/osf/migrations/0036_remove_duplicate_notification_subscriptions_v2.py b/osf/migrations/0036_remove_duplicate_notification_subscriptions_v2.py new file mode 100644 index 00000000000..d4f308fedd8 --- /dev/null +++ b/osf/migrations/0036_remove_duplicate_notification_subscriptions_v2.py @@ -0,0 +1,27 @@ +# Generated by Django 4.2.17 on 2026-01-27 21:03 + +from django.db import migrations + +from django.core.management import call_command + + +def run_deduplication_command(apps, schema_editor): + call_command('remove_duplicate_notification_subscriptions_v2') + + +def reverse(apps, schema_editor): + """ + This is a no-op since we can't restore deleted records. + """ + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('osf', '0035_merge_20251215_1451'), + ] + + operations = [ + migrations.RunPython(run_deduplication_command, reverse), + ] diff --git a/osf/migrations/0037_notification_refactor_post_release.py b/osf/migrations/0037_notification_refactor_post_release.py new file mode 100644 index 00000000000..67ffafb600c --- /dev/null +++ b/osf/migrations/0037_notification_refactor_post_release.py @@ -0,0 +1,37 @@ +# Generated by Django 4.2.17 on 2026-03-03 11:29 + +from django.db import migrations, models +import osf.utils.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('osf', '0036_remove_duplicate_notification_subscriptions_v2'), + ] + + operations = [ + migrations.RemoveField( + model_name='notification', + name='seen', + ), + migrations.AddField( + model_name='notification', + name='fake_sent', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='osfuser', + name='no_login_email_last_sent', + field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), + ), + migrations.AlterField( + model_name='emailtask', + name='status', + field=models.CharField(choices=[('PENDING', 'Pending'), ('NO_USER_FOUND', 'No User Found'), ('USER_DISABLED', 'User Disabled'), ('STARTED', 'Started'), ('SUCCESS', 'Success'), ('FAILURE', 'Failure'), ('RETRY', 'Retry'), ('PARTIAL_SUCCESS', 'Partial Success'), ('AUTO_FIXED', 'Auto Fixed')], default='PENDING', max_length=20), + ), + migrations.AlterUniqueTogether( + name='notificationsubscription', + unique_together={('notification_type', 'user', 'content_type', 'object_id', '_is_digest')}, + ), + ] diff --git a/osf/models/__init__.py b/osf/models/__init__.py index ccf0544f777..7f334a357cc 100644 --- a/osf/models/__init__.py +++ b/osf/models/__init__.py @@ -65,7 +65,7 @@ from .notable_domain import NotableDomain, DomainReference from .notifications import NotificationSubscriptionLegacy from .notification_subscription import NotificationSubscription -from .notification_type import NotificationType +from .notification_type import NotificationType, NotificationTypeEnum from .notification import Notification from .oauth import ( diff --git a/osf/models/collection_submission.py b/osf/models/collection_submission.py index 1e646745dc4..f2de5ba6610 100644 --- a/osf/models/collection_submission.py +++ b/osf/models/collection_submission.py @@ -16,7 +16,7 @@ from website import settings from osf.utils.machines import CollectionSubmissionMachine -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from django.db.models.signals import post_save from django.dispatch import receiver @@ -103,7 +103,7 @@ def _notify_contributors_pending(self, event_data): assert str(e) == f'No unclaimed record for user {contributor._id} on node {self.guid.referent._id}' claim_url = None - NotificationType.Type.COLLECTION_SUBMISSION_SUBMITTED.instance.emit( + NotificationTypeEnum.COLLECTION_SUBMISSION_SUBMITTED.instance.emit( is_digest=True, user=contributor, subscribed_object=self, @@ -135,22 +135,23 @@ def _notify_contributors_pending(self, event_data): def _notify_moderators_pending(self, event_data): user = event_data.kwargs.get('user', None) - NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS.instance.emit( + logo_context = {} + if self.collection.provider and not self.collection.provider.is_default: + logo_context['logo_url'] = self.collection.provider.get_asset_url('favicon') + else: + logo_context['logo'] = settings.OSF_PREPRINTS_LOGO + NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS.instance.emit( user=user, subscribed_object=self.collection.provider, event_context={ - 'provider_id': self.collection.provider.id, - 'submitter_fullname': self.creator.fullname, 'requester_fullname': event_data.kwargs.get('user').fullname, 'requester_contributor_names': ''.join(self.guid.referent.contributors.values_list('fullname', flat=True)), 'localized_timestamp': str(timezone.now()), 'message': f'submitted "{self.guid.referent.title}".', 'reviews_submission_url': f'{DOMAIN}reviews/registries/{self.guid.referent._id}/{self.guid.referent._id}', 'is_request_email': False, - 'is_initiator': self.creator == user, 'profile_image_url': user.profile_image_url(), - 'logo': self.collection.provider._id if - self.collection.provider and not self.collection.provider.is_default else settings.OSF_PREPRINTS_LOGO, + **logo_context, }, is_digest=True, ) @@ -166,8 +167,13 @@ def _validate_accept(self, event_data): def _notify_accepted(self, event_data): if self.collection.provider: + logo_context = {} + if not self.collection.provider.is_default: + logo_context['logo_url'] = self.collection.provider.get_asset_url('favicon') + else: + logo_context['logo'] = settings.OSF_PREPRINTS_LOGO for contributor in self.guid.referent.contributors: - NotificationType.Type.COLLECTION_SUBMISSION_ACCEPTED.instance.emit( + NotificationTypeEnum.COLLECTION_SUBMISSION_ACCEPTED.instance.emit( user=contributor, subscribed_object=self, event_context={ @@ -191,8 +197,7 @@ def _notify_accepted(self, event_data): 'domain': settings.DOMAIN, 'osf_contact_email': settings.OSF_CONTACT_EMAIL, 'is_initiator': self.creator == contributor, - 'logo': self.collection.provider._id if - self.collection.provider and not self.collection.provider.is_default else settings.OSF_PREPRINTS_LOGO, + **logo_context, }, ) @@ -210,8 +215,13 @@ def _validate_reject(self, event_data): raise PermissionsError(f'{user} must have moderator permissions.') def _notify_moderated_rejected(self, event_data): + logo_context = {} + if self.collection.provider and not self.collection.provider.is_default: + logo_context['logo_url'] = self.collection.provider.get_asset_url('favicon') + else: + logo_context['logo'] = settings.OSF_PREPRINTS_LOGO for contributor in self.guid.referent.contributors: - NotificationType.Type.COLLECTION_SUBMISSION_REJECTED.instance.emit( + NotificationTypeEnum.COLLECTION_SUBMISSION_REJECTED.instance.emit( user=contributor, subscribed_object=self, event_context={ @@ -224,7 +234,7 @@ def _notify_moderated_rejected(self, event_data): 'collection_title': self.collection.title, 'collection_provider_name': self.collection.provider.name, 'collections_link': DOMAIN + 'collections/' + self.collection.provider._id, - 'node_absolute_url': self.guid.referent.get_absolute_url(), + 'node_absolute_url': self.guid.referent.absolute_url, 'profile_image_url': contributor.profile_image_url(), 'message': f'submission of "{self.collection.title} was rejected', 'node_title': self.guid.referent.title, @@ -232,8 +242,7 @@ def _notify_moderated_rejected(self, event_data): 'reviews_submission_url': f'{DOMAIN}reviews/registries/{self.guid.referent._id}/{self.guid.referent._id}', 'rejection_justification': event_data.kwargs.get('comment'), 'osf_contact_email': settings.OSF_CONTACT_EMAIL, - 'logo': self.collection.provider._id if - self.collection.provider and not self.collection.provider.is_default else settings.OSF_PREPRINTS_LOGO, + **logo_context, }, ) @@ -261,10 +270,15 @@ def _notify_removed(self, event_data): is_moderator = user.has_perm('withdraw_submissions', self.collection.provider) is_admin = self.guid.referent.has_permission(user, ADMIN) node = self.guid.referent + logo_context = {} + if self.collection.provider and not self.collection.provider.is_default: + logo_context['logo_url'] = self.collection.provider.get_asset_url('favicon') + else: + logo_context['logo'] = settings.OSF_PREPRINTS_LOGO event_context_base = { 'remover_fullname': user.fullname, - 'remover_absolute_url': user.get_absolute_url(), + 'remover_absolute_url': user.absolute_url if user else None, 'requester_fullname': user.fullname, 'collections_link': DOMAIN + 'collections/' + self.collection.provider._id if self.collection.provider else None, 'collection_id': self.collection.id, @@ -277,14 +291,13 @@ def _notify_removed(self, event_data): 'profile_image_url': user.profile_image_url(), 'domain': settings.DOMAIN, 'osf_contact_email': settings.OSF_CONTACT_EMAIL, - 'logo': self.collection.provider._id if - self.collection.provider and not self.collection.provider.is_default else settings.OSF_PREPRINTS_LOGO, + **logo_context, } if removed_due_to_privacy and self.collection.provider: if self.is_moderated: for moderator in self.collection.moderators: - NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_PRIVATE.instance.emit( + NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_PRIVATE.instance.emit( user=moderator, event_context={ **event_context_base, @@ -293,7 +306,7 @@ def _notify_removed(self, event_data): }, ) for contributor in node.contributors.all(): - NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_PRIVATE.instance.emit( + NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_PRIVATE.instance.emit( user=contributor, event_context={ **event_context_base, @@ -303,50 +316,34 @@ def _notify_removed(self, event_data): ) elif is_moderator and self.collection.provider: for contributor in node.contributors.all(): - NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_MODERATOR.instance.emit( + NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_MODERATOR.instance.emit( user=contributor, event_context={ **event_context_base, 'requester_contributor_names': ''.join( self.guid.referent.contributors.values_list('fullname', flat=True)), - 'is_admin': node.has_permission(contributor, ADMIN), 'rejection_justification': event_data.kwargs.get('comment'), - 'collections_title': self.collection.title, 'collection_provider_name': self.collection.provider.name, 'collection_provider__id': self.collection.provider._id, - 'remover_absolute_url': user.get_absolute_url() if user is not None else None, 'node_absolute_url': node.absolute_url, 'collection_provider': self.collection.provider.name, 'collections_link': DOMAIN + 'collections/' + self.collection.provider._id, 'user_fullname': contributor.fullname, - 'is_request_email': False, - 'message': '', - 'localized_timestamp': str(timezone.now()), - 'reviews_submission_url': f'{DOMAIN}reviews/registries/{self.guid.referent._id}/{self.guid.referent._id}', }, ) elif is_admin and self.collection.provider: for contributor in node.contributors.all(): - NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_ADMIN.instance.emit( + NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_ADMIN.instance.emit( user=contributor, event_context={ **event_context_base, - 'requester_contributor_names': ''.join( - self.guid.referent.contributors.values_list('fullname', flat=True)), - 'localized_timestamp': str(timezone.now()), 'user_fullname': contributor.fullname, - 'collections_title': self.collection.title, 'collection_provider_name': self.collection.provider.name, - 'collection_provider__id': self.collection.provider._id, 'collection_provider': self.collection.provider.name, 'collections_link': DOMAIN + 'collections/' + self.collection.provider._id, - 'node_absolute_url': node.get_absolute_url(), - 'is_request_email': False, - 'message': '', + 'node_absolute_url': node.absolute_url, 'is_admin': node.has_permission(contributor, ADMIN), - 'reviews_submission_url': f'{DOMAIN}reviews/registries/{self.guid.referent._id}/{self.guid.referent._id}', - }, ) @@ -388,33 +385,21 @@ def _notify_cancel(self, event_data): collection_provider_name = self.collection.title for contributor in node.contributors.all(): - NotificationType.Type.COLLECTION_SUBMISSION_CANCEL.instance.emit( + NotificationTypeEnum.COLLECTION_SUBMISSION_CANCEL.instance.emit( user=contributor, subscribed_object=self.collection, event_context={ - 'requester_contributor_names': ''.join( - node.contributors.values_list('fullname', flat=True)), - 'profile_image_url': user.profile_image_url(), 'user_fullname': contributor.fullname, - 'requester_fullname': self.creator.fullname, 'is_admin': node.has_permission(contributor, ADMIN), 'node_title': node.title, - 'node_absolute_url': node.get_absolute_url(), + 'node_absolute_url': node.absolute_url, 'remover_fullname': user.fullname if user else '', - 'remover_absolute_url': user.get_absolute_url() if user else '', - 'localized_timestamp': str(timezone.now()), + 'remover_absolute_url': user.absolute_url if user else '', 'collections_link': collections_link, - 'collection_title': self.collection.title, 'collection_provider_name': collection_provider_name, - 'node_absolute_url"': node.get_absolute_url(), 'collection_provider': collection_provider_name, 'domain': settings.DOMAIN, - 'is_request_email': False, - 'message': '', 'osf_contact_email': settings.OSF_CONTACT_EMAIL, - 'reviews_submission_url': f'{DOMAIN}reviews/registries/{self.guid.referent._id}/{self.guid.referent._id}', - 'logo': self.collection.provider._id if - self.collection.provider and not self.collection.provider.is_default else settings.OSF_PREPRINTS_LOGO, }, ) diff --git a/osf/models/email_task.py b/osf/models/email_task.py index f89f2285e5c..12def4c8c12 100644 --- a/osf/models/email_task.py +++ b/osf/models/email_task.py @@ -9,6 +9,8 @@ class EmailTask(models.Model): ('SUCCESS', 'Success'), ('FAILURE', 'Failure'), ('RETRY', 'Retry'), + ('PARTIAL_SUCCESS', 'Partial Success'), + ('AUTO_FIXED', 'Auto Fixed'), ) task_id = models.CharField(max_length=255, unique=True) diff --git a/osf/models/institution.py b/osf/models/institution.py index 39d57637da5..3671e7bef1f 100644 --- a/osf/models/institution.py +++ b/osf/models/institution.py @@ -14,7 +14,7 @@ from django.utils import timezone from framework import sentry -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from .base import BaseModel, ObjectIDMixin from .contributor import InstitutionalContributor from .institution_affiliation import InstitutionAffiliation @@ -220,7 +220,7 @@ def _send_deactivation_email(self): success = 0 for user in self.get_institution_users(): attempts += 1 - NotificationType.Type.USER_INSTITUTION_DEACTIVATION.instance.emit( + NotificationTypeEnum.USER_INSTITUTION_DEACTIVATION.instance.emit( user=user, event_context={ 'user_fullname': user.fullname, diff --git a/osf/models/mixins.py b/osf/models/mixins.py index 66fc73c94fb..689ffe817df 100644 --- a/osf/models/mixins.py +++ b/osf/models/mixins.py @@ -27,7 +27,7 @@ InvalidTagError, BlockedEmailError, ) -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from osf.models.notification_subscription import NotificationSubscription from .node_relation import NodeRelation from .nodelog import NodeLog @@ -312,7 +312,7 @@ def add_affiliated_institution(self, inst, user, log=True, ignore_user_affiliati if notify and getattr(self, 'type', False) == 'osf.node': for user, _ in self.get_admin_contributors_recursive(unique_users=True): - NotificationType.Type.NODE_AFFILIATION_CHANGED.instance.emit( + NotificationTypeEnum.NODE_AFFILIATION_CHANGED.instance.emit( user=user, subscribed_object=self, event_context={ @@ -354,7 +354,7 @@ def remove_affiliated_institution(self, inst, user, save=False, log=True, notify self.update_search() if notify and getattr(self, 'type', False) == 'osf.node': for user, _ in self.get_admin_contributors_recursive(unique_users=True): - NotificationType.Type.NODE_AFFILIATION_CHANGED.instance.emit( + NotificationTypeEnum.NODE_AFFILIATION_CHANGED.instance.emit( user=user, subscribed_object=self, event_context={ @@ -1035,7 +1035,7 @@ class Meta: reviews_comments_anonymous = models.BooleanField(null=True, blank=True) DEFAULT_SUBSCRIPTIONS = [ - NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS + NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS ] @property @@ -1084,7 +1084,7 @@ def add_to_group(self, user, group): for subscription in self.DEFAULT_SUBSCRIPTIONS: NotificationSubscription.objects.get_or_create( user=user, - content_type=ContentType.objects.get_for_model(self, for_concrete_model=False), + content_type=ContentType.objects.get_for_model(self), object_id=self.id, notification_type=subscription.instance, message_frequency='instantly', @@ -1102,7 +1102,7 @@ def remove_from_group(self, user, group, unsubscribe=True): NotificationSubscription.objects.filter( notification_type=subscription.instance, user=user, - content_type=ContentType.objects.get_for_model(self, for_concrete_model=False), + content_type=ContentType.objects.get_for_model(self), object_id=self.id, ).delete() @@ -1422,14 +1422,14 @@ def add_contributor( from osf.models import AbstractNode, Preprint, DraftRegistration if isinstance(self, AbstractNode): - notification_type = NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT + notification_type = NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT elif isinstance(self, Preprint): if self.is_published: - notification_type = NotificationType.Type.PREPRINT_CONTRIBUTOR_ADDED_DEFAULT + notification_type = NotificationTypeEnum.PREPRINT_CONTRIBUTOR_ADDED_DEFAULT else: notification_type = False elif isinstance(self, DraftRegistration): - notification_type = NotificationType.Type.DRAFT_REGISTRATION_CONTRIBUTOR_ADDED_DEFAULT + notification_type = NotificationTypeEnum.DRAFT_REGISTRATION_CONTRIBUTOR_ADDED_DEFAULT if contrib_to_add.is_disabled: raise ValidationValueError('Deactivated users cannot be added as contributors.') @@ -1603,14 +1603,14 @@ def add_unregistered_contributor( from osf.models import AbstractNode, Preprint, DraftRegistration if isinstance(self, AbstractNode): - notification_type = NotificationType.Type.USER_INVITE_DEFAULT + notification_type = NotificationTypeEnum.USER_INVITE_DEFAULT elif isinstance(self, Preprint): if self.provider.is_default: - notification_type = NotificationType.Type.USER_INVITE_OSF_PREPRINT + notification_type = NotificationTypeEnum.USER_INVITE_OSF_PREPRINT else: - notification_type = NotificationType.Type.PROVIDER_USER_INVITE_PREPRINT + notification_type = NotificationTypeEnum.PROVIDER_USER_INVITE_PREPRINT elif isinstance(self, DraftRegistration): - notification_type = NotificationType.Type.USER_INVITE_DRAFT_REGISTRATION + notification_type = NotificationTypeEnum.USER_INVITE_DRAFT_REGISTRATION self.add_contributor( contributor, @@ -2393,12 +2393,11 @@ def suspend_spam_user(self, user, domains=None, self_spam=False): # Suspend the flagged user for spam. if not user.is_disabled: user.deactivate_account() - NotificationType.Type.USER_SPAM_BANNED.instance.emit( + NotificationTypeEnum.USER_SPAM_BANNED.instance.emit( user, event_context={ 'user_fullname': user.fullname, 'osf_support_email': settings.OSF_SUPPORT_EMAIL, - 'can_change_preferences': False } ) diff --git a/osf/models/node.py b/osf/models/node.py index 6bb91c62611..083ccd6edfa 100644 --- a/osf/models/node.py +++ b/osf/models/node.py @@ -35,7 +35,7 @@ from framework.exceptions import PermissionsError, HTTPError from framework.sentry import log_exception from osf.exceptions import InvalidTagError, NodeStateError, TagNotFoundError, ValidationError -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from .contributor import Contributor from .collection_submission import CollectionSubmission @@ -1297,7 +1297,7 @@ def set_privacy(self, permissions, auth=None, log=True, save=True, meeting_creat self.save() if auth and permissions == 'public': for contributor in self.contributors: - NotificationType.Type.NODE_NEW_PUBLIC_PROJECT.instance.emit( + NotificationTypeEnum.NODE_NEW_PUBLIC_PROJECT.instance.emit( user=contributor, subscribed_object=self, event_context={ @@ -1611,7 +1611,7 @@ def fork_node( :return: Forked node """ if notification_type is None: - notification_type = NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT + notification_type = NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT Registration = apps.get_model('osf.Registration') PREFIX = 'Fork of ' user = auth.user @@ -1839,7 +1839,7 @@ def use_as_template(self, auth, changes=None, top_level=True, parent=None): new, contributor=auth.user, auth=auth, - notification_type=NotificationType.Type.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST + notification_type=NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST ) # Log the creation diff --git a/osf/models/notification.py b/osf/models/notification.py index aab9f2b0f0e..533a05a4e97 100644 --- a/osf/models/notification.py +++ b/osf/models/notification.py @@ -16,8 +16,8 @@ class Notification(models.Model): ) event_context: dict = models.JSONField() sent = models.DateTimeField(null=True, blank=True) - seen = models.DateTimeField(null=True, blank=True) created = models.DateTimeField(auto_now_add=True) + fake_sent = models.BooleanField(default=False) def send( self, @@ -56,14 +56,13 @@ def send( if save: self.mark_sent() - def mark_sent(self) -> None: + def mark_sent(self, fake_sent=False) -> None: + update_fields = ['sent'] self.sent = timezone.now() - self.save(update_fields=['sent']) - - def mark_seen(self) -> None: - raise NotImplementedError('mark_seen must be implemented by subclasses.') - # self.seen = timezone.now() - # self.save(update_fields=['seen']) + if fake_sent: + update_fields.append('fake_sent') + self.fake_sent = True + self.save(update_fields=update_fields) def render(self) -> str: """Render the notification message using the event context.""" diff --git a/osf/models/notification_subscription.py b/osf/models/notification_subscription.py index 6a4a27533b5..1a812639ee6 100644 --- a/osf/models/notification_subscription.py +++ b/osf/models/notification_subscription.py @@ -1,10 +1,10 @@ import logging -from datetime import datetime +from django.utils import timezone from django.db import models from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError -from osf.models.notification_type import get_default_frequency_choices, NotificationType +from osf.models.notification_type import get_default_frequency_choices, NotificationTypeEnum from osf.models.notification import Notification from api.base import settings from api.base.utils import absolute_reverse @@ -59,6 +59,7 @@ class Meta: verbose_name = 'Notification Subscription' verbose_name_plural = 'Notification Subscriptions' db_table = 'osf_notificationsubscription_v2' + unique_together = ('notification_type', 'user', 'content_type', 'object_id', '_is_digest') def emit( self, @@ -126,7 +127,8 @@ def emit( Notification.objects.create( subscription=self, event_context=event_context, - sent=None if self.message_frequency != 'none' else datetime(1000, 1, 1), + sent=timezone.now() if self.message_frequency == 'none' else None, + fake_sent=True if self.message_frequency == 'none' else False, ) @property @@ -144,32 +146,32 @@ def _id(self): Legacy subscription id for API compatibility. """ _global_file_updated = [ - NotificationType.Type.USER_FILE_UPDATED.value, - NotificationType.Type.FILE_UPDATED.value, - NotificationType.Type.FILE_ADDED.value, - NotificationType.Type.FILE_REMOVED.value, - NotificationType.Type.ADDON_FILE_COPIED.value, - NotificationType.Type.ADDON_FILE_RENAMED.value, - NotificationType.Type.ADDON_FILE_MOVED.value, - NotificationType.Type.ADDON_FILE_REMOVED.value, - NotificationType.Type.FOLDER_CREATED.value, + NotificationTypeEnum.USER_FILE_UPDATED.value, + NotificationTypeEnum.FILE_UPDATED.value, + NotificationTypeEnum.FILE_ADDED.value, + NotificationTypeEnum.FILE_REMOVED.value, + NotificationTypeEnum.ADDON_FILE_COPIED.value, + NotificationTypeEnum.ADDON_FILE_RENAMED.value, + NotificationTypeEnum.ADDON_FILE_MOVED.value, + NotificationTypeEnum.ADDON_FILE_REMOVED.value, + NotificationTypeEnum.FOLDER_CREATED.value, ] _global_reviews = [ - NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS.value, - NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION.value, - NotificationType.Type.PROVIDER_REVIEWS_RESUBMISSION_CONFIRMATION.value, - NotificationType.Type.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.value, - NotificationType.Type.REVIEWS_SUBMISSION_STATUS.value, + NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS.value, + NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION.value, + NotificationTypeEnum.PROVIDER_REVIEWS_RESUBMISSION_CONFIRMATION.value, + NotificationTypeEnum.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.value, + NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS.value, ] _node_file_updated = [ - NotificationType.Type.NODE_FILE_UPDATED.value, - NotificationType.Type.FILE_ADDED.value, - NotificationType.Type.FILE_REMOVED.value, - NotificationType.Type.ADDON_FILE_COPIED.value, - NotificationType.Type.ADDON_FILE_RENAMED.value, - NotificationType.Type.ADDON_FILE_MOVED.value, - NotificationType.Type.ADDON_FILE_REMOVED.value, - NotificationType.Type.FOLDER_CREATED.value, + NotificationTypeEnum.NODE_FILE_UPDATED.value, + NotificationTypeEnum.FILE_ADDED.value, + NotificationTypeEnum.FILE_REMOVED.value, + NotificationTypeEnum.ADDON_FILE_COPIED.value, + NotificationTypeEnum.ADDON_FILE_RENAMED.value, + NotificationTypeEnum.ADDON_FILE_MOVED.value, + NotificationTypeEnum.ADDON_FILE_REMOVED.value, + NotificationTypeEnum.FOLDER_CREATED.value, ] if self.notification_type.name in _global_file_updated: return f'{self.user._id}_file_updated' diff --git a/osf/models/notification_type.py b/osf/models/notification_type.py index fbbe2524f99..538dfa969df 100644 --- a/osf/models/notification_type.py +++ b/osf/models/notification_type.py @@ -12,144 +12,167 @@ def get_default_frequency_choices(): DEFAULT_FREQUENCY_CHOICES = ['none', 'instantly', 'daily', 'weekly', 'monthly'] return DEFAULT_FREQUENCY_CHOICES.copy() +class NotificationTypeEnum(str, Enum): + EMPTY = 'empty' + # Desk notifications + REVIEWS_SUBMISSION_STATUS = 'reviews_submission_status' + ADDONS_BOA_JOB_FAILURE = 'addon_boa_job_failure' + ADDONS_BOA_JOB_COMPLETE = 'addon_boa_job_complete' + + DESK_ARCHIVE_REGISTRATION_STUCK = 'desk_archive_registration_stuck' + DESK_REQUEST_EXPORT = 'desk_request_export' + DESK_REQUEST_DEACTIVATION = 'desk_request_deactivation' + DESK_REGISTRATION_BULK_UPLOAD_PRODUCT_OWNER = 'desk_registration_bulk_upload_product_owner' + DESK_USER_REGISTRATION_BULK_UPLOAD_UNEXPECTED_FAILURE = 'desk_user_registration_bulk_upload_unexpected_failure' + DESK_ARCHIVE_JOB_EXCEEDED = 'desk_archive_job_exceeded' + DESK_ARCHIVE_JOB_COPY_ERROR = 'desk_archive_job_copy_error' + DESK_ARCHIVE_JOB_FILE_NOT_FOUND = 'desk_archive_job_file_not_found' + DESK_ARCHIVE_JOB_UNCAUGHT_ERROR = 'desk_archive_job_uncaught_error' + DESK_CROSSREF_ERROR = 'desk_crossref_error' + + # User notifications + USER_PENDING_VERIFICATION = 'user_pending_verification' + USER_PENDING_VERIFICATION_REGISTERED = 'user_pending_verification_registered' + USER_STORAGE_CAP_EXCEEDED_ANNOUNCEMENT = 'user_storage_cap_exceeded_announcement' + USER_SPAM_BANNED = 'user_spam_banned' + USER_REQUEST_DEACTIVATION = 'user_request_deactivation' # added as a placeholder + USER_REQUEST_DEACTIVATION_COMPLETE = 'user_request_deactivation_complete' + USER_PRIMARY_EMAIL_CHANGED = 'user_primary_email_changed' + USER_INSTITUTION_DEACTIVATION = 'user_institution_deactivation' + USER_FORGOT_PASSWORD = 'user_forgot_password' + USER_FORGOT_PASSWORD_INSTITUTION = 'user_forgot_password_institution' + USER_DUPLICATE_ACCOUNTS_OSF4I = 'user_duplicate_accounts_osf4i' + USER_EXTERNAL_LOGIN_LINK_SUCCESS = 'user_external_login_link_success' + USER_REGISTRATION_BULK_UPLOAD_FAILURE_ALL = 'user_registration_bulk_upload_failure_all' + USER_REGISTRATION_BULK_UPLOAD_SUCCESS_PARTIAL = 'user_registration_bulk_upload_success_partial' + USER_REGISTRATION_BULK_UPLOAD_SUCCESS_ALL = 'user_registration_bulk_upload_success_all' + USER_ADD_SSO_EMAIL_OSF4I = 'user_add_sso_email_osf4i' + USER_WELCOME = 'user_welcome' # waiting for the language from the PO + USER_WELCOME_OSF4I = 'user_welcome_osf4i' + USER_ARCHIVE_JOB_EXCEEDED = 'user_archive_job_exceeded' + USER_ARCHIVE_JOB_COPY_ERROR = 'user_archive_job_copy_error' + USER_ARCHIVE_JOB_FILE_NOT_FOUND = 'user_archive_job_file_not_found' + USER_FILE_UPDATED = 'user_file_updated' + USER_FILE_OPERATION_SUCCESS = 'user_file_operation_success' + USER_FILE_OPERATION_FAILED = 'user_file_operation_failed' + USER_PASSWORD_RESET = 'user_password_reset' + USER_EXTERNAL_LOGIN_CONFIRM_EMAIL_CREATE = 'user_external_login_confirm_email_create' + USER_EXTERNAL_LOGIN_CONFIRM_EMAIL_LINK = 'user_external_login_email_confirm_link' + USER_CONFIRM_MERGE = 'user_confirm_merge' + USER_CONFIRM_EMAIL = 'user_confirm_email' + USER_INITIAL_CONFIRM_EMAIL = 'user_initial_confirm_email' + USER_INVITE_DEFAULT = 'user_invite_default' + USER_FORWARD_INVITE = 'user_forward_invite' + USER_FORWARD_INVITE_REGISTERED = 'user_forward_invite_registered' + USER_INVITE_DRAFT_REGISTRATION = 'user_invite_draft_registration' + USER_INVITE_OSF_PREPRINT = 'user_invite_osf_preprint' + USER_ARCHIVE_JOB_UNCAUGHT_ERROR = 'user_archive_job_uncaught_error' + USER_INSTITUTIONAL_ACCESS_REQUEST = 'user_institutional_access_request' + USER_CAMPAIGN_CONFIRM_EMAIL_AGU_CONFERENCE = 'user_campaign_confirm_email_agu_conference' + USER_CAMPAIGN_CONFIRM_EMAIL_REGISTRIES_OSF = 'user_campaign_confirm_email_registries_osf' + USER_CAMPAIGN_CONFIRM_EMAIL_ERPC = 'user_campaign_confirm_email_erpc' + USER_DIGEST = 'user_digest' + USER_NO_LOGIN = 'user_no_login' + DIGEST_REVIEWS_MODERATORS = 'digest_reviews_moderators' + USER_NO_ADDON = 'user_no_addon' + USER_SPAM_FILES_DETECTED = 'user_spam_files_detected' + USER_CROSSREF_DOI_PENDING = 'user_crossref_doi_pending' + USER_TERMS_OF_USE_UPDATED = 'user_terms_of_use_updated' # added as a placeholder + + # Node notifications + NODE_FILE_UPDATED = 'node_file_updated' + NODE_AFFILIATION_CHANGED = 'node_affiliation_changed' + NODE_ARCHIVE_SUCCESS = 'node_archive_success' # added as a placeholder + NODE_REQUEST_ACCESS_SUBMITTED = 'node_request_access_submitted' + NODE_REQUEST_ACCESS_DENIED = 'node_request_access_denied' + NODE_FORK_COMPLETED = 'node_fork_completed' + NODE_FORK_FAILED = 'node_fork_failed' + NODE_INSTITUTIONAL_ACCESS_REQUEST = 'node_institutional_access_request' + NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST = 'node_contributor_added_access_request' + NODE_CONTRIBUTOR_ADDED_DEFAULT = 'node_contributor_added_default' + NODE_PENDING_EMBARGO_ADMIN = 'node_pending_embargo_admin' + NODE_PENDING_EMBARGO_NON_ADMIN = 'node_pending_embargo_non_admin' + NODE_PENDING_RETRACTION_NON_ADMIN = 'node_pending_retraction_non_admin' + NODE_PENDING_RETRACTION_ADMIN = 'node_pending_retraction_admin' + NODE_PENDING_REGISTRATION_NON_ADMIN = 'node_pending_registration_non_admin' + NODE_PENDING_REGISTRATION_ADMIN = 'node_pending_registration_admin' + NODE_PENDING_EMBARGO_TERMINATION_NON_ADMIN = 'node_pending_embargo_termination_non_admin' + NODE_PENDING_EMBARGO_TERMINATION_ADMIN = 'node_pending_embargo_termination_admin' + NODE_SCHEMA_RESPONSE_REJECTED = 'node_schema_response_rejected' + NODE_SCHEMA_RESPONSE_APPROVED = 'node_schema_response_approved' + NODE_SCHEMA_RESPONSE_SUBMITTED = 'node_schema_response_submitted' + NODE_SCHEMA_RESPONSE_INITIATED = 'node_schema_response_initiated' + NODE_WITHDRAWAl_REQUEST_APPROVED = 'node_withdrawal_request_approved' + NODE_WITHDRAWAl_REQUEST_REJECTED = 'node_withdrawal_request_rejected' + NODE_NEW_PUBLIC_PROJECT = 'node_new_public_project' + + FILE_UPDATED = 'file_updated' + FILE_ADDED = 'file_added' + FILE_REMOVED = 'file_removed' + ADDON_FILE_COPIED = 'addon_file_copied' + ADDON_FILE_RENAMED = 'addon_file_renamed' + ADDON_FILE_MOVED = 'addon_file_moved' + ADDON_FILE_REMOVED = 'addon_file_removed' + FOLDER_CREATED = 'folder_created' + + # Provider notifications + PROVIDER_NEW_PENDING_SUBMISSIONS = 'provider_new_pending_submissions' + PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS = 'provider_new_pending_withdraw_requests' + PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION = 'provider_reviews_submission_confirmation' + PROVIDER_REVIEWS_RESUBMISSION_CONFIRMATION = 'provider_reviews_resubmission_confirmation' + PROVIDER_CONFIRM_EMAIL_MODERATION = 'provider_confirm_email_moderation' + PROVIDER_MODERATOR_ADDED = 'provider_moderator_added' + PROVIDER_USER_INVITE_PREPRINT = 'provider_user_invite_preprint' + + # Preprint notifications + PREPRINT_REQUEST_WITHDRAWAL_APPROVED = 'preprint_request_withdrawal_approved' + PREPRINT_REQUEST_WITHDRAWAL_DECLINED = 'preprint_request_withdrawal_declined' + PREPRINT_CONTRIBUTOR_ADDED_PREPRINT_NODE_FROM_OSF = 'preprint_contributor_added_preprint_node_from_osf' + PREPRINT_CONTRIBUTOR_ADDED_DEFAULT = 'preprint_contributor_added_default' + + # Collections Submission notifications + COLLECTION_SUBMISSION_REMOVED_ADMIN = 'collection_submission_removed_admin' + COLLECTION_SUBMISSION_REMOVED_MODERATOR = 'collection_submission_removed_moderator' + COLLECTION_SUBMISSION_REMOVED_PRIVATE = 'collection_submission_removed_private' + COLLECTION_SUBMISSION_SUBMITTED = 'collection_submission_submitted' + COLLECTION_SUBMISSION_ACCEPTED = 'collection_submission_accepted' + COLLECTION_SUBMISSION_REJECTED = 'collection_submission_rejected' + COLLECTION_SUBMISSION_CANCEL = 'collection_submission_cancel' + + REGISTRATION_BULK_UPLOAD_FAILURE_DUPLICATES = 'registration_bulk_upload_failure_duplicates' + + DRAFT_REGISTRATION_CONTRIBUTOR_ADDED_DEFAULT = 'draft_registration_contributor_added_default' + + @ttl_cached_property(ttl=settings.TTL_CACHE_LIFETIME) + def instance(self): + obj, created = NotificationType.objects.get_or_create(name=self.value) + return obj class NotificationType(models.Model): - class Type(str, Enum): - EMPTY = 'empty' - # Desk notifications - REVIEWS_SUBMISSION_STATUS = 'reviews_submission_status' - ADDONS_BOA_JOB_FAILURE = 'addon_boa_job_failure' - ADDONS_BOA_JOB_COMPLETE = 'addon_boa_job_complete' - - DESK_ARCHIVE_REGISTRATION_STUCK = 'desk_archive_registration_stuck' - DESK_REQUEST_EXPORT = 'desk_request_export' - DESK_REQUEST_DEACTIVATION = 'desk_request_deactivation' - DESK_REGISTRATION_BULK_UPLOAD_PRODUCT_OWNER = 'desk_registration_bulk_upload_product_owner' - DESK_USER_REGISTRATION_BULK_UPLOAD_UNEXPECTED_FAILURE = 'desk_user_registration_bulk_upload_unexpected_failure' - DESK_ARCHIVE_JOB_EXCEEDED = 'desk_archive_job_exceeded' - DESK_ARCHIVE_JOB_COPY_ERROR = 'desk_archive_job_copy_error' - DESK_ARCHIVE_JOB_FILE_NOT_FOUND = 'desk_archive_job_file_not_found' - DESK_ARCHIVE_JOB_UNCAUGHT_ERROR = 'desk_archive_job_uncaught_error' - DESK_CROSSREF_ERROR = 'desk_crossref_error' - - # User notifications - USER_PENDING_VERIFICATION = 'user_pending_verification' - USER_PENDING_VERIFICATION_REGISTERED = 'user_pending_verification_registered' - USER_STORAGE_CAP_EXCEEDED_ANNOUNCEMENT = 'user_storage_cap_exceeded_announcement' - USER_SPAM_BANNED = 'user_spam_banned' - USER_REQUEST_DEACTIVATION_COMPLETE = 'user_request_deactivation_complete' - USER_PRIMARY_EMAIL_CHANGED = 'user_primary_email_changed' - USER_INSTITUTION_DEACTIVATION = 'user_institution_deactivation' - USER_FORGOT_PASSWORD = 'user_forgot_password' - USER_FORGOT_PASSWORD_INSTITUTION = 'user_forgot_password_institution' - USER_DUPLICATE_ACCOUNTS_OSF4I = 'user_duplicate_accounts_osf4i' - USER_EXTERNAL_LOGIN_LINK_SUCCESS = 'user_external_login_link_success' - USER_REGISTRATION_BULK_UPLOAD_FAILURE_ALL = 'user_registration_bulk_upload_failure_all' - USER_REGISTRATION_BULK_UPLOAD_SUCCESS_PARTIAL = 'user_registration_bulk_upload_success_partial' - USER_REGISTRATION_BULK_UPLOAD_SUCCESS_ALL = 'user_registration_bulk_upload_success_all' - USER_ADD_SSO_EMAIL_OSF4I = 'user_add_sso_email_osf4i' - USER_WELCOME_OSF4I = 'user_welcome_osf4i' - USER_ARCHIVE_JOB_EXCEEDED = 'user_archive_job_exceeded' - USER_ARCHIVE_JOB_COPY_ERROR = 'user_archive_job_copy_error' - USER_ARCHIVE_JOB_FILE_NOT_FOUND = 'user_archive_job_file_not_found' - USER_FILE_UPDATED = 'user_file_updated' - USER_FILE_OPERATION_SUCCESS = 'user_file_operation_success' - USER_FILE_OPERATION_FAILED = 'user_file_operation_failed' - USER_PASSWORD_RESET = 'user_password_reset' - USER_EXTERNAL_LOGIN_CONFIRM_EMAIL_CREATE = 'user_external_login_confirm_email_create' - USER_EXTERNAL_LOGIN_CONFIRM_EMAIL_LINK = 'user_external_login_email_confirm_link' - USER_CONFIRM_MERGE = 'user_confirm_merge' - USER_CONFIRM_EMAIL = 'user_confirm_email' - USER_INITIAL_CONFIRM_EMAIL = 'user_initial_confirm_email' - USER_INVITE_DEFAULT = 'user_invite_default' - USER_FORWARD_INVITE = 'user_forward_invite' - USER_FORWARD_INVITE_REGISTERED = 'user_forward_invite_registered' - USER_INVITE_DRAFT_REGISTRATION = 'user_invite_draft_registration' - USER_INVITE_OSF_PREPRINT = 'user_invite_osf_preprint' - USER_ARCHIVE_JOB_UNCAUGHT_ERROR = 'user_archive_job_uncaught_error' - USER_INSTITUTIONAL_ACCESS_REQUEST = 'user_institutional_access_request' - USER_CAMPAIGN_CONFIRM_PREPRINTS_BRANDED = 'user_campaign_confirm_preprint_branded' - USER_CAMPAIGN_CONFIRM_PREPRINTS_OSF = 'user_campaign_confirm_preprint_osf' - USER_CAMPAIGN_CONFIRM_EMAIL_AGU_CONFERENCE = 'user_campaign_confirm_email_agu_conference' - USER_CAMPAIGN_CONFIRM_EMAIL_AGU_CONFERENCE_2023 = 'user_campaign_confirm_email_agu_conference_2023' - USER_CAMPAIGN_CONFIRM_EMAIL_REGISTRIES_OSF = 'user_campaign_confirm_email_registries_osf' - USER_CAMPAIGN_CONFIRM_EMAIL_ERPC = 'user_campaign_confirm_email_erpc' - USER_DIGEST = 'user_digest' - USER_NO_LOGIN = 'user_no_login' - DIGEST_REVIEWS_MODERATORS = 'digest_reviews_moderators' - USER_NO_ADDON = 'user_no_addon' - USER_SPAM_FILES_DETECTED = 'user_spam_files_detected' - USER_CROSSREF_DOI_PENDING = 'user_crossref_doi_pending' - - # Node notifications - NODE_FILE_UPDATED = 'node_file_updated' - NODE_FILES_UPDATED = 'node_files_updated' - NODE_AFFILIATION_CHANGED = 'node_affiliation_changed' - NODE_REQUEST_ACCESS_SUBMITTED = 'node_request_access_submitted' - NODE_REQUEST_ACCESS_DENIED = 'node_request_access_denied' - NODE_FORK_COMPLETED = 'node_fork_completed' - NODE_FORK_FAILED = 'node_fork_failed' - NODE_INSTITUTIONAL_ACCESS_REQUEST = 'node_institutional_access_request' - NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST = 'node_contributor_added_access_request' - NODE_CONTRIBUTOR_ADDED_DEFAULT = 'node_contributor_added_default' - NODE_PENDING_EMBARGO_ADMIN = 'node_pending_embargo_admin' - NODE_PENDING_EMBARGO_NON_ADMIN = 'node_pending_embargo_non_admin' - NODE_PENDING_RETRACTION_NON_ADMIN = 'node_pending_retraction_non_admin' - NODE_PENDING_RETRACTION_ADMIN = 'node_pending_retraction_admin' - NODE_PENDING_REGISTRATION_NON_ADMIN = 'node_pending_registration_non_admin' - NODE_PENDING_REGISTRATION_ADMIN = 'node_pending_registration_admin' - NODE_PENDING_EMBARGO_TERMINATION_NON_ADMIN = 'node_pending_embargo_termination_non_admin' - NODE_PENDING_EMBARGO_TERMINATION_ADMIN = 'node_pending_embargo_termination_admin' - NODE_SCHEMA_RESPONSE_REJECTED = 'node_schema_response_rejected' - NODE_SCHEMA_RESPONSE_APPROVED = 'node_schema_response_approved' - NODE_SCHEMA_RESPONSE_SUBMITTED = 'node_schema_response_submitted' - NODE_SCHEMA_RESPONSE_INITIATED = 'node_schema_response_initiated' - NODE_WITHDRAWAl_REQUEST_APPROVED = 'node_withdrawal_request_approved' - NODE_WITHDRAWAl_REQUEST_REJECTED = 'node_withdrawal_request_rejected' - NODE_NEW_PUBLIC_PROJECT = 'node_new_public_project' - - FILE_UPDATED = 'file_updated' - FILE_ADDED = 'file_added' - FILE_REMOVED = 'file_removed' - ADDON_FILE_COPIED = 'addon_file_copied' - ADDON_FILE_RENAMED = 'addon_file_renamed' - ADDON_FILE_MOVED = 'addon_file_moved' - ADDON_FILE_REMOVED = 'addon_file_removed' - FOLDER_CREATED = 'folder_created' - - # Provider notifications - PROVIDER_NEW_PENDING_SUBMISSIONS = 'provider_new_pending_submissions' - PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS = 'provider_new_pending_withdraw_requests' - PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION = 'provider_reviews_submission_confirmation' - PROVIDER_REVIEWS_RESUBMISSION_CONFIRMATION = 'provider_reviews_resubmission_confirmation' - PROVIDER_CONFIRM_EMAIL_MODERATION = 'provider_confirm_email_moderation' - PROVIDER_MODERATOR_ADDED = 'provider_moderator_added' - PROVIDER_USER_INVITE_PREPRINT = 'provider_user_invite_preprint' - - # Preprint notifications - PREPRINT_REQUEST_WITHDRAWAL_APPROVED = 'preprint_request_withdrawal_approved' - PREPRINT_REQUEST_WITHDRAWAL_DECLINED = 'preprint_request_withdrawal_declined' - PREPRINT_CONTRIBUTOR_ADDED_PREPRINT_NODE_FROM_OSF = 'preprint_contributor_added_preprint_node_from_osf' - PREPRINT_CONTRIBUTOR_ADDED_DEFAULT = 'preprint_contributor_added_default' - - # Collections Submission notifications - COLLECTION_SUBMISSION_REMOVED_ADMIN = 'collection_submission_removed_admin' - COLLECTION_SUBMISSION_REMOVED_MODERATOR = 'collection_submission_removed_moderator' - COLLECTION_SUBMISSION_REMOVED_PRIVATE = 'collection_submission_removed_private' - COLLECTION_SUBMISSION_SUBMITTED = 'collection_submission_submitted' - COLLECTION_SUBMISSION_ACCEPTED = 'collection_submission_accepted' - COLLECTION_SUBMISSION_REJECTED = 'collection_submission_rejected' - COLLECTION_SUBMISSION_CANCEL = 'collection_submission_cancel' - - REGISTRATION_BULK_UPLOAD_FAILURE_DUPLICATES = 'registration_bulk_upload_failure_duplicates' - - DRAFT_REGISTRATION_CONTRIBUTOR_ADDED_DEFAULT = 'draft_registration_contributor_added_default' - - @ttl_cached_property(ttl=settings.TTL_CACHE_LIFETIME) - def instance(self): - obj, created = NotificationType.objects.get_or_create(name=self.value) - return obj + @property + def is_digest_type(self): + digest_types = { + # User types + NotificationTypeEnum.USER_NO_ADDON.value, + # File types + NotificationTypeEnum.ADDON_FILE_COPIED.value, + NotificationTypeEnum.ADDON_FILE_MOVED.value, + NotificationTypeEnum.ADDON_FILE_RENAMED.value, + NotificationTypeEnum.FILE_ADDED.value, + NotificationTypeEnum.FILE_REMOVED.value, + NotificationTypeEnum.FILE_UPDATED.value, + NotificationTypeEnum.FOLDER_CREATED.value, + NotificationTypeEnum.NODE_FILE_UPDATED.value, + NotificationTypeEnum.USER_FILE_UPDATED.value, + + # Review types + NotificationTypeEnum.COLLECTION_SUBMISSION_SUBMITTED.value, + NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS.value, + NotificationTypeEnum.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.value, + NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS.value, + } + return self.name in digest_types notification_interval_choices = ArrayField( base_field=models.CharField(max_length=32), @@ -202,13 +225,14 @@ def emit( used. """ from osf.models.notification_subscription import NotificationSubscription - from osf.models.provider import AbstractProvider - # use concrete model for AbstractProvider to specifically get the provider content type - if isinstance(subscribed_object, AbstractProvider): - content_type = ContentType.objects.get_for_model(subscribed_object, for_concrete_model=False) if subscribed_object else None - else: - content_type = ContentType.objects.get_for_model(subscribed_object) if subscribed_object else None + if is_digest != self.is_digest_type: + sentry.log_message(f'NotificationType.emit called with is_digest={is_digest} for ' + f'NotificationType {self.name} which has is_digest_type={self.is_digest_type}' + 'is_digest value will be overridden.') + is_digest = self.is_digest_type + + content_type = ContentType.objects.get_for_model(subscribed_object) if subscribed_object else None if message_frequency is None: message_frequency = self.get_group_frequency_or_default(user, subscribed_object, content_type) @@ -266,33 +290,33 @@ def get_group_frequency_or_default(self, user, subscribed_object, content_type): from osf.models import NotificationSubscription, AbstractNode _global_file_updated = [ - NotificationType.Type.USER_FILE_UPDATED.value, - NotificationType.Type.FILE_UPDATED.value, - NotificationType.Type.FILE_ADDED.value, - NotificationType.Type.FILE_REMOVED.value, - NotificationType.Type.ADDON_FILE_COPIED.value, - NotificationType.Type.ADDON_FILE_RENAMED.value, - NotificationType.Type.ADDON_FILE_MOVED.value, - NotificationType.Type.ADDON_FILE_REMOVED.value, - NotificationType.Type.FOLDER_CREATED.value, + NotificationTypeEnum.USER_FILE_UPDATED.value, + NotificationTypeEnum.FILE_UPDATED.value, + NotificationTypeEnum.FILE_ADDED.value, + NotificationTypeEnum.FILE_REMOVED.value, + NotificationTypeEnum.ADDON_FILE_COPIED.value, + NotificationTypeEnum.ADDON_FILE_RENAMED.value, + NotificationTypeEnum.ADDON_FILE_MOVED.value, + NotificationTypeEnum.ADDON_FILE_REMOVED.value, + NotificationTypeEnum.FOLDER_CREATED.value, ] _global_reviews = [ - NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS.value, - NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION.value, - NotificationType.Type.PROVIDER_REVIEWS_RESUBMISSION_CONFIRMATION.value, - NotificationType.Type.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.value, - NotificationType.Type.REVIEWS_SUBMISSION_STATUS.value, + NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS.value, + NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION.value, + NotificationTypeEnum.PROVIDER_REVIEWS_RESUBMISSION_CONFIRMATION.value, + NotificationTypeEnum.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.value, + NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS.value, ] _node_file_updated = [ - NotificationType.Type.NODE_FILE_UPDATED.value, - NotificationType.Type.FILE_UPDATED.value, - NotificationType.Type.FILE_ADDED.value, - NotificationType.Type.FILE_REMOVED.value, - NotificationType.Type.ADDON_FILE_COPIED.value, - NotificationType.Type.ADDON_FILE_RENAMED.value, - NotificationType.Type.ADDON_FILE_MOVED.value, - NotificationType.Type.ADDON_FILE_REMOVED.value, - NotificationType.Type.FOLDER_CREATED.value, + NotificationTypeEnum.NODE_FILE_UPDATED.value, + NotificationTypeEnum.FILE_UPDATED.value, + NotificationTypeEnum.FILE_ADDED.value, + NotificationTypeEnum.FILE_REMOVED.value, + NotificationTypeEnum.ADDON_FILE_COPIED.value, + NotificationTypeEnum.ADDON_FILE_RENAMED.value, + NotificationTypeEnum.ADDON_FILE_MOVED.value, + NotificationTypeEnum.ADDON_FILE_REMOVED.value, + NotificationTypeEnum.FOLDER_CREATED.value, ] if self.name in _global_file_updated and content_type != ContentType.objects.get_for_model(AbstractNode): diff --git a/osf/models/preprint.py b/osf/models/preprint.py index 7a61b31db06..ccf48331ea9 100644 --- a/osf/models/preprint.py +++ b/osf/models/preprint.py @@ -20,7 +20,7 @@ from framework.auth import Auth from framework.exceptions import PermissionsError, UnpublishedPendingPreprintVersionExists from framework.auth import oauth_scopes -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from .subject import Subject from .tag import Tag @@ -1071,30 +1071,23 @@ def _add_creator_as_contributor(self): def _send_preprint_confirmation(self, auth): # Send creator confirmation email recipient = self.creator - NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION.instance.emit( + NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION.instance.emit( subscribed_object=self.provider, user=recipient, event_context={ - 'domain': settings.DOMAIN, 'user_fullname': recipient.fullname, 'referrer_fullname': recipient.fullname, 'reviewable_title': self.title, 'no_future_emails': self.provider.allow_submissions, 'reviewable_absolute_url': self.absolute_url, 'reviewable_provider_name': self.provider.name, - 'reviewable_provider__id': self.provider._id, 'workflow': self.provider.reviews_workflow, 'provider_url': f'{self.provider.domain or settings.DOMAIN}preprints/' f'{(self.provider._id if not self.provider.domain else '').strip('/')}', - 'provider_contact_email': self.provider.email_contact or settings.OSF_CONTACT_EMAIL, - 'provider_support_email': self.provider.email_support or settings.OSF_SUPPORT_EMAIL, 'is_creator': True, 'provider_name': 'OSF Preprints' if self.provider.name == 'Open Science Framework' else self.provider.name, - 'logo': settings.OSF_PREPRINTS_LOGO if self.provider._id == 'osf' else self.provider._id, 'document_type': self.provider.preprint_word, - 'notify_comment': not self.provider.reviews_comments_private }, - is_digest=True ) # FOLLOWING BEHAVIOR NOT SPECIFIC TO PREPRINTS diff --git a/osf/models/provider.py b/osf/models/provider.py index 977ff662b42..92681173240 100644 --- a/osf/models/provider.py +++ b/osf/models/provider.py @@ -14,7 +14,7 @@ from guardian.models import GroupObjectPermissionBase, UserObjectPermissionBase from framework import sentry -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from .base import BaseModel, TypedObjectIDMixin from .mixins import ReviewProviderMixin from .brand import Brand @@ -253,7 +253,7 @@ def setup_share_source(self, provider_home_page): class CollectionProvider(AbstractProvider): DEFAULT_SUBSCRIPTIONS = [ - NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS + NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS ] class Meta: @@ -295,8 +295,8 @@ class RegistrationProvider(AbstractProvider): STATE_FIELD_NAME = 'moderation_state' DEFAULT_SUBSCRIPTIONS = [ - NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS, - NotificationType.Type.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS, + NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS, + NotificationTypeEnum.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS, ] diff --git a/osf/models/registrations.py b/osf/models/registrations.py index 7426121de98..e1d819b43bf 100644 --- a/osf/models/registrations.py +++ b/osf/models/registrations.py @@ -23,7 +23,7 @@ from osf.exceptions import NodeStateError, DraftRegistrationStateError from osf.external.internet_archive.tasks import archive_to_ia, update_ia_metadata from osf.metrics import RegistriesModerationMetrics -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from .action import RegistrationAction from .archive import ArchiveJob from .contributor import DraftRegistrationContributor @@ -1336,7 +1336,7 @@ def create_from_node( node=None, data=None, provider=None, - notification_type=NotificationType.Type.DRAFT_REGISTRATION_CONTRIBUTOR_ADDED_DEFAULT + notification_type=NotificationTypeEnum.DRAFT_REGISTRATION_CONTRIBUTOR_ADDED_DEFAULT ): if not provider: provider = RegistrationProvider.get_default() @@ -1381,7 +1381,7 @@ def create_from_node( draft, contributor=contributor.user, auth=Auth(user) if user != contributor.user else None, - notification_type=notification_type if contributor.user.is_confirmed else NotificationType.Type.USER_INVITE_DRAFT_REGISTRATION, + notification_type=notification_type if contributor.user.is_confirmed else NotificationTypeEnum.USER_INVITE_DRAFT_REGISTRATION, permissions=contributor.permission ) diff --git a/osf/models/sanctions.py b/osf/models/sanctions.py index 8855852f1a1..5fa5d304d22 100644 --- a/osf/models/sanctions.py +++ b/osf/models/sanctions.py @@ -19,7 +19,7 @@ from osf.utils import tokens from osf.utils.machines import ApprovalsMachine from osf.utils.workflows import ApprovalStates, SanctionTypes -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum VIEW_PROJECT_URL_TEMPLATE = osf_settings.DOMAIN + '{node_id}/' @@ -462,8 +462,8 @@ class Embargo(SanctionCallbackMixin, EmailApprovableSanction): DISPLAY_NAME = 'Embargo' SHORT_NAME = 'embargo' - AUTHORIZER_NOTIFY_EMAIL_TYPE = NotificationType.Type.NODE_PENDING_EMBARGO_ADMIN - NON_AUTHORIZER_NOTIFY_EMAIL_TYPE = NotificationType.Type.NODE_PENDING_EMBARGO_NON_ADMIN + AUTHORIZER_NOTIFY_EMAIL_TYPE = NotificationTypeEnum.NODE_PENDING_EMBARGO_ADMIN + NON_AUTHORIZER_NOTIFY_EMAIL_TYPE = NotificationTypeEnum.NODE_PENDING_EMBARGO_NON_ADMIN VIEW_URL_TEMPLATE = VIEW_PROJECT_URL_TEMPLATE APPROVE_URL_TEMPLATE = osf_settings.DOMAIN + 'token_action/{node_id}/?token={token}' @@ -662,8 +662,8 @@ class Retraction(EmailApprovableSanction): DISPLAY_NAME = 'Retraction' SHORT_NAME = 'retraction' - AUTHORIZER_NOTIFY_EMAIL_TYPE = NotificationType.Type.NODE_PENDING_RETRACTION_ADMIN - NON_AUTHORIZER_NOTIFY_EMAIL_TYPE = NotificationType.Type.NODE_PENDING_RETRACTION_NON_ADMIN + AUTHORIZER_NOTIFY_EMAIL_TYPE = NotificationTypeEnum.NODE_PENDING_RETRACTION_ADMIN + NON_AUTHORIZER_NOTIFY_EMAIL_TYPE = NotificationTypeEnum.NODE_PENDING_RETRACTION_NON_ADMIN VIEW_URL_TEMPLATE = VIEW_PROJECT_URL_TEMPLATE APPROVE_URL_TEMPLATE = osf_settings.DOMAIN + 'token_action/{node_id}/?token={token}' @@ -800,8 +800,8 @@ class RegistrationApproval(SanctionCallbackMixin, EmailApprovableSanction): DISPLAY_NAME = 'Approval' SHORT_NAME = 'registration_approval' - AUTHORIZER_NOTIFY_EMAIL_TYPE = NotificationType.Type.NODE_PENDING_REGISTRATION_ADMIN - NON_AUTHORIZER_NOTIFY_EMAIL_TYPE = NotificationType.Type.NODE_PENDING_REGISTRATION_NON_ADMIN + AUTHORIZER_NOTIFY_EMAIL_TYPE = NotificationTypeEnum.NODE_PENDING_REGISTRATION_ADMIN + NON_AUTHORIZER_NOTIFY_EMAIL_TYPE = NotificationTypeEnum.NODE_PENDING_REGISTRATION_NON_ADMIN VIEW_URL_TEMPLATE = VIEW_PROJECT_URL_TEMPLATE APPROVE_URL_TEMPLATE = osf_settings.DOMAIN + 'token_action/{node_id}/?token={token}' @@ -980,8 +980,8 @@ class EmbargoTerminationApproval(EmailApprovableSanction): DISPLAY_NAME = 'Embargo Termination Request' SHORT_NAME = 'embargo_termination_approval' - AUTHORIZER_NOTIFY_EMAIL_TYPE = NotificationType.Type.NODE_PENDING_EMBARGO_TERMINATION_ADMIN - NON_AUTHORIZER_NOTIFY_EMAIL_TYPE = NotificationType.Type.NODE_PENDING_EMBARGO_TERMINATION_NON_ADMIN + AUTHORIZER_NOTIFY_EMAIL_TYPE = NotificationTypeEnum.NODE_PENDING_EMBARGO_TERMINATION_ADMIN + NON_AUTHORIZER_NOTIFY_EMAIL_TYPE = NotificationTypeEnum.NODE_PENDING_EMBARGO_TERMINATION_NON_ADMIN VIEW_URL_TEMPLATE = VIEW_PROJECT_URL_TEMPLATE APPROVE_URL_TEMPLATE = osf_settings.DOMAIN + 'token_action/{node_id}/?token={token}' diff --git a/osf/models/schema_response.py b/osf/models/schema_response.py index 0ea5239ee5d..c68084f1601 100644 --- a/osf/models/schema_response.py +++ b/osf/models/schema_response.py @@ -9,7 +9,7 @@ from framework.exceptions import PermissionsError from osf.exceptions import PreviousSchemaResponseError, SchemaResponseStateError, SchemaResponseUpdateError -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from .base import BaseModel, ObjectIDMixin from .metaschema import RegistrationSchemaBlock from .schema_response_block import SchemaResponseBlock @@ -488,10 +488,10 @@ def _notify_users(self, event, event_initiator): ) notification_type = { - 'create': NotificationType.Type.NODE_SCHEMA_RESPONSE_INITIATED.instance, - 'submit': NotificationType.Type.NODE_SCHEMA_RESPONSE_SUBMITTED.instance, - 'accept': NotificationType.Type.NODE_SCHEMA_RESPONSE_APPROVED.instance, - 'reject': NotificationType.Type.NODE_SCHEMA_RESPONSE_REJECTED.instance, + 'create': NotificationTypeEnum.NODE_SCHEMA_RESPONSE_INITIATED.instance, + 'submit': NotificationTypeEnum.NODE_SCHEMA_RESPONSE_SUBMITTED.instance, + 'accept': NotificationTypeEnum.NODE_SCHEMA_RESPONSE_APPROVED.instance, + 'reject': NotificationTypeEnum.NODE_SCHEMA_RESPONSE_REJECTED.instance, }.get(event) if not notification_type: return diff --git a/osf/models/user.py b/osf/models/user.py index 5c8d7f165ed..6b19a5e6f8d 100644 --- a/osf/models/user.py +++ b/osf/models/user.py @@ -68,7 +68,7 @@ from website.project import new_bookmark_collection from website.util.metrics import OsfSourceTags, unregistered_created_source_tag from importlib import import_module -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from osf.utils.requests import string_type_request_headers @@ -250,6 +250,7 @@ class OSFUser(DirtyFieldsMixin, GuidMixin, BaseModel, AbstractBaseUser, Permissi # } email_last_sent = NonNaiveDateTimeField(null=True, blank=True) + no_login_email_last_sent = NonNaiveDateTimeField(null=True, blank=True) change_password_last_attempt = NonNaiveDateTimeField(null=True, blank=True) # Logs number of times user attempted to change their password where their # old password was invalid @@ -1097,14 +1098,13 @@ def set_password(self, raw_password, notify=True): raise ChangePasswordError(['Password cannot be the same as your email address']) super().set_password(raw_password) if had_existing_password and notify: - NotificationType.Type.USER_PASSWORD_RESET.instance.emit( + NotificationTypeEnum.USER_PASSWORD_RESET.instance.emit( subscribed_object=self, user=self, message_frequency='instantly', event_context={ 'domain': website_settings.DOMAIN, 'user_fullname': self.fullname, - 'can_change_preferences': False, 'osf_contact_email': website_settings.OSF_CONTACT_EMAIL } ) diff --git a/osf/models/user_message.py b/osf/models/user_message.py index 10ea735b61e..34ec44e6b72 100644 --- a/osf/models/user_message.py +++ b/osf/models/user_message.py @@ -3,7 +3,7 @@ from django.db.models.signals import post_save from django.dispatch import receiver -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from .base import BaseModel, ObjectIDMixin from website import settings @@ -32,7 +32,7 @@ def get_notification_type(cls: Type['MessageTypes'], message_type: str) -> str: str: The email template string for the specified message type. """ return { - cls.INSTITUTIONAL_REQUEST: NotificationType.Type.USER_INSTITUTIONAL_ACCESS_REQUEST + cls.INSTITUTIONAL_REQUEST: NotificationTypeEnum.USER_INSTITUTIONAL_ACCESS_REQUEST }[message_type] diff --git a/osf/utils/machines.py b/osf/utils/machines.py index d13d85075f4..eb7e93d450b 100644 --- a/osf/utils/machines.py +++ b/osf/utils/machines.py @@ -6,7 +6,7 @@ from framework.auth import Auth from osf.exceptions import InvalidTransitionError -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from osf.models.preprintlog import PreprintLog from osf.models.action import ReviewAction, NodeRequestAction, PreprintRequestAction from osf.utils import permissions @@ -192,7 +192,7 @@ def notify_withdraw(self, ev): if context.get('requester_fullname', None): context['is_requester'] = requester == contributor - NotificationType.Type.PREPRINT_REQUEST_WITHDRAWAL_APPROVED.instance.emit( + NotificationTypeEnum.PREPRINT_REQUEST_WITHDRAWAL_APPROVED.instance.emit( user=contributor, subscribed_object=self.machineable, event_context={ @@ -234,7 +234,7 @@ def save_changes(self, ev): make_curator = self.machineable.request_type == NodeRequestTypes.INSTITUTIONAL_REQUEST.value visible = False if make_curator else ev.kwargs.get('visible', True) if self.machineable.request_type in (NodeRequestTypes.ACCESS.value, NodeRequestTypes.INSTITUTIONAL_REQUEST.value): - notification_type = NotificationType.Type.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST + notification_type = NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST else: notification_type = None @@ -265,7 +265,7 @@ def notify_submit(self, ev): if not self.machineable.request_type == NodeRequestTypes.INSTITUTIONAL_REQUEST.value: for admin in self.machineable.target.get_users_with_perm(permissions.ADMIN): - NotificationType.Type.NODE_REQUEST_ACCESS_SUBMITTED.instance.emit( + NotificationTypeEnum.NODE_REQUEST_ACCESS_SUBMITTED.instance.emit( user=admin, subscribed_object=self.machineable, event_context={ @@ -286,7 +286,7 @@ def notify_accept_reject(self, ev): if ev.event.name == DefaultTriggers.REJECT.value: context = self.get_context() - NotificationType.Type.NODE_REQUEST_ACCESS_DENIED.instance.emit( + NotificationTypeEnum.NODE_REQUEST_ACCESS_DENIED.instance.emit( user=self.machineable.creator, subscribed_object=self.machineable, event_context=context @@ -345,7 +345,7 @@ def notify_accept_reject(self, ev): context['comment'] = self.action.comment context['contributor_fullname'] = self.machineable.creator.fullname - NotificationType.Type.PREPRINT_REQUEST_WITHDRAWAL_DECLINED.instance.emit( + NotificationTypeEnum.PREPRINT_REQUEST_WITHDRAWAL_DECLINED.instance.emit( user=self.machineable.creator, subscribed_object=self.machineable, event_context=context diff --git a/osf/utils/notifications.py b/osf/utils/notifications.py index 8808ef3b243..0d279479155 100644 --- a/osf/utils/notifications.py +++ b/osf/utils/notifications.py @@ -1,6 +1,6 @@ from django.utils import timezone -from osf.models.notification_type import NotificationType +from osf.models.notification_type import NotificationTypeEnum from website.reviews import signals as reviews_signals from website.settings import DOMAIN, OSF_SUPPORT_EMAIL, OSF_CONTACT_EMAIL from osf.utils.workflows import RegistrationModerationTriggers @@ -50,7 +50,7 @@ def notify_submit(resource, user, *args, **kwargs): context=context, recipients=recipients, resource=resource, - notification_type=NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION + notification_type=NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION ) reviews_signals.reviews_email_submit_moderators_notifications.send( timestamp=timezone.now(), @@ -71,7 +71,7 @@ def notify_resubmit(resource, user, *args, **kwargs): reviews_signals.reviews_email_submit.send( recipients=recipients, context=context, - notification_type=NotificationType.Type.PROVIDER_REVIEWS_RESUBMISSION_CONFIRMATION, + notification_type=NotificationTypeEnum.PROVIDER_REVIEWS_RESUBMISSION_CONFIRMATION, resource=resource, ) reviews_signals.reviews_email_submit_moderators_notifications.send( @@ -94,7 +94,7 @@ def notify_accept_reject(resource, user, action, states, *args, **kwargs): reviews_signals.reviews_email.send( creator=user, context=context, - template=NotificationType.Type.REVIEWS_SUBMISSION_STATUS, + template=NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS, action=action ) @@ -110,7 +110,7 @@ def notify_edit_comment(resource, user, action, states, *args, **kwargs): reviews_signals.reviews_email.send( creator=user, context=context, - template=NotificationType.Type.REVIEWS_SUBMISSION_STATUS, + template=NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS, action=action ) @@ -118,21 +118,14 @@ def notify_edit_comment(resource, user, action, states, *args, **kwargs): def notify_reject_withdraw_request(resource, action, *args, **kwargs): context = get_email_template_context(resource) context['requester_fullname'] = action.creator.fullname - context['referrer_fullname'] = action.creator.fullname - context['force_withdrawal'] = False context['notify_comment'] = not resource.provider.reviews_comments_private - context['reviewable_withdrawal_justification'] = resource.withdrawal_justification for contributor in resource.contributors.all(): - context['user_fullname'] = contributor.fullname context['contributor_fullname'] = contributor.fullname - context['is_requester'] = action.creator == contributor context['comment'] = action.comment - NotificationType.Type.NODE_WITHDRAWAl_REQUEST_REJECTED.instance.emit( + NotificationTypeEnum.NODE_WITHDRAWAl_REQUEST_REJECTED.instance.emit( user=contributor, event_context={ - 'is_requester': contributor == action.creator, - 'ever_public': getattr(resource, 'ever_public', resource.is_public), **context }, ) @@ -163,7 +156,7 @@ def notify_withdraw_registration(resource, action, *args, **kwargs): context['user_fullname'] = contributor.fullname context['is_requester'] = resource.retraction.initiated_by == contributor - NotificationType.Type.NODE_WITHDRAWAl_REQUEST_APPROVED.instance.emit( + NotificationTypeEnum.NODE_WITHDRAWAl_REQUEST_APPROVED.instance.emit( user=contributor, event_context=context ) diff --git a/osf_tests/management_commands/test_migrate_funder_ids_to_ror.py b/osf_tests/management_commands/test_migrate_funder_ids_to_ror.py new file mode 100644 index 00000000000..a7bec602e5f --- /dev/null +++ b/osf_tests/management_commands/test_migrate_funder_ids_to_ror.py @@ -0,0 +1,415 @@ +import os +import pytest +import tempfile +from unittest import mock + +from django.core.management import call_command + +from osf.models import GuidMetadataRecord +from osf.management.commands.migrate_funder_ids_to_ror import Command +from osf_tests import factories + + +@pytest.mark.django_db +class TestMigrateFunderIdsToRor: + + @pytest.fixture + def user(self): + return factories.UserFactory() + + @pytest.fixture + def project(self, user): + return factories.ProjectFactory(creator=user) + + @pytest.fixture + def csv_mapping_file(self): + """Create a temporary CSV file with test mapping data.""" + content = """Funder Name\tror ID\tROR name\tCrossref DOI\tFunder ID +National Institutes of Health\thttps://ror.org/01cwqze88\tNational Institutes of Health\thttp://dx.doi.org/10.13039/100000002\t100000002 +National Science Foundation\thttps://ror.org/021nxhr62\tNational Science Foundation\thttp://dx.doi.org/10.13039/100000001\t100000001 +European Research Council\thttps://ror.org/0472cxd90\tEuropean Research Council\thttp://dx.doi.org/10.13039/501100000781\t501100000781 +""" + with tempfile.NamedTemporaryFile(mode='w', suffix='.csv', delete=False) as f: + f.write(content) + temp_path = f.name + + yield temp_path + + # Cleanup + os.unlink(temp_path) + + @pytest.fixture + def mock_reindex(self): + """Mock update_search and request_identifier_update to avoid actual re-indexing in tests.""" + with mock.patch('osf.models.node.AbstractNode.update_search') as mock_search, \ + mock.patch('osf.models.node.AbstractNode.request_identifier_update') as mock_doi: + yield mock_search, mock_doi + + @pytest.fixture + def record_with_crossref_funder(self, project): + """Create a GuidMetadataRecord with Crossref Funder ID.""" + record = GuidMetadataRecord.objects.for_guid(project._id) + record.funding_info = [{ + 'funder_name': 'National Institutes of Health', + 'funder_identifier': 'http://dx.doi.org/10.13039/100000002', + 'funder_identifier_type': 'Crossref Funder ID', + 'award_number': 'R01-GM-123456', + 'award_title': 'Test Grant', + }] + record.save() + return record + + @pytest.fixture + def record_with_multiple_funders(self, user): + """Create a GuidMetadataRecord with multiple funders (mix of Crossref and ROR).""" + project = factories.ProjectFactory(creator=user) + record = GuidMetadataRecord.objects.for_guid(project._id) + record.funding_info = [ + { + 'funder_name': 'NIH', + 'funder_identifier': 'https://doi.org/10.13039/100000002', + 'funder_identifier_type': 'Crossref Funder ID', + 'award_number': 'R01-123', + }, + { + 'funder_name': 'Already ROR', + 'funder_identifier': 'https://ror.org/existing123', + 'funder_identifier_type': 'ROR', + }, + { + 'funder_name': 'NSF', + 'funder_identifier': '100000001', + 'funder_identifier_type': 'Crossref Funder ID', + }, + ] + record.save() + return record + + @pytest.fixture + def record_with_unmapped_funder(self, user): + """Create a GuidMetadataRecord with a funder not in the mapping.""" + project = factories.ProjectFactory(creator=user) + record = GuidMetadataRecord.objects.for_guid(project._id) + record.funding_info = [{ + 'funder_name': 'Unknown Funder', + 'funder_identifier': 'http://dx.doi.org/10.13039/999999999', + 'funder_identifier_type': 'Crossref Funder ID', + }] + record.save() + return record + + def test_migrate_single_crossref_funder(self, record_with_crossref_funder, csv_mapping_file): + """Test migrating a single Crossref Funder ID to ROR.""" + command = Command() + command.stdout = type('MockStdout', (), {'write': lambda self, x: None})() + + # Run migration (not dry run) + mapping = command.load_mapping(csv_mapping_file) + updated, stats = command.migrate_record( + record_with_crossref_funder, + mapping, + dry_run=False, + update_funder_name=False + ) + + assert updated is True + assert stats['migrated'] == 1 + assert stats['not_found'] == 0 + + record_with_crossref_funder.refresh_from_db() + funder = record_with_crossref_funder.funding_info[0] + + assert funder['funder_identifier'] == 'https://ror.org/01cwqze88' + assert funder['funder_identifier_type'] == 'ROR' + # Original name preserved (update_funder_name=False) + assert funder['funder_name'] == 'National Institutes of Health' + # Other fields preserved + assert funder['award_number'] == 'R01-GM-123456' + assert funder['award_title'] == 'Test Grant' + + def test_migrate_with_funder_name_update(self, record_with_crossref_funder, csv_mapping_file): + """Test migrating with funder name update enabled.""" + command = Command() + command.stdout = type('MockStdout', (), {'write': lambda self, x: None})() + + mapping = command.load_mapping(csv_mapping_file) + command.migrate_record( + record_with_crossref_funder, + mapping, + dry_run=False, + update_funder_name=True + ) + + record_with_crossref_funder.refresh_from_db() + funder = record_with_crossref_funder.funding_info[0] + + assert funder['funder_identifier'] == 'https://ror.org/01cwqze88' + assert funder['funder_identifier_type'] == 'ROR' + assert funder['funder_name'] == 'National Institutes of Health' + + def test_dry_run_does_not_modify(self, record_with_crossref_funder, csv_mapping_file): + """Test that dry run does not modify the database.""" + original_funding_info = record_with_crossref_funder.funding_info.copy() + + command = Command() + command.stdout = type('MockStdout', (), {'write': lambda self, x: None})() + + mapping = command.load_mapping(csv_mapping_file) + updated, stats = command.migrate_record( + record_with_crossref_funder, + mapping, + dry_run=True, + update_funder_name=False + ) + + assert updated is True # Would have updated + assert stats['migrated'] == 1 + + record_with_crossref_funder.refresh_from_db() + # Data should be unchanged + assert record_with_crossref_funder.funding_info == original_funding_info + + def test_migrate_multiple_funders(self, record_with_multiple_funders, csv_mapping_file): + """Test migrating record with multiple funders.""" + command = Command() + command.stdout = type('MockStdout', (), {'write': lambda self, x: None})() + + mapping = command.load_mapping(csv_mapping_file) + updated, stats = command.migrate_record( + record_with_multiple_funders, + mapping, + dry_run=False, + update_funder_name=False + ) + + assert updated is True + assert stats['migrated'] == 2 # NIH and NSF + assert stats['not_found'] == 0 + + record_with_multiple_funders.refresh_from_db() + funders = record_with_multiple_funders.funding_info + + # NIH should be migrated + assert funders[0]['funder_identifier'] == 'https://ror.org/01cwqze88' + assert funders[0]['funder_identifier_type'] == 'ROR' + + # Already ROR should be unchanged + assert funders[1]['funder_identifier'] == 'https://ror.org/existing123' + assert funders[1]['funder_identifier_type'] == 'ROR' + + # NSF should be migrated + assert funders[2]['funder_identifier'] == 'https://ror.org/021nxhr62' + assert funders[2]['funder_identifier_type'] == 'ROR' + + def test_unmapped_funder_removed(self, record_with_unmapped_funder, csv_mapping_file): + """Test that funders not in mapping are removed.""" + command = Command() + command.stdout = type('MockStdout', (), {'write': lambda self, x: None})() + + mapping = command.load_mapping(csv_mapping_file) + updated, stats = command.migrate_record( + record_with_unmapped_funder, + mapping, + dry_run=False, + update_funder_name=False + ) + + assert updated is True + assert stats['migrated'] == 0 + assert stats['not_found'] == 1 + assert 'http://dx.doi.org/10.13039/999999999' in stats['unmapped_ids'] + + record_with_unmapped_funder.refresh_from_db() + assert record_with_unmapped_funder.funding_info == [] + + def test_load_mapping_various_id_formats(self, csv_mapping_file): + """Test that mapping handles various ID formats.""" + command = Command() + command.stdout = type('MockStdout', (), {'write': lambda self, x: None})() + + mapping = command.load_mapping(csv_mapping_file) + + # All these formats should map to the same ROR ID + assert mapping['100000002']['ror_id'] == 'https://ror.org/01cwqze88' + assert mapping['http://dx.doi.org/10.13039/100000002']['ror_id'] == 'https://ror.org/01cwqze88' + assert mapping['https://doi.org/10.13039/100000002']['ror_id'] == 'https://ror.org/01cwqze88' + assert mapping['10.13039/100000002']['ror_id'] == 'https://ror.org/01cwqze88' + + def test_extract_funder_id(self): + """Test extraction of numeric funder ID from various formats.""" + command = Command() + + assert command.extract_funder_id('100000002') == '100000002' + assert command.extract_funder_id('http://dx.doi.org/10.13039/100000002') == '100000002' + assert command.extract_funder_id('https://doi.org/10.13039/100000002') == '100000002' + assert command.extract_funder_id('10.13039/100000002') == '100000002' + + def test_empty_funding_info_skipped(self, project, csv_mapping_file): + """Test that records with empty funding_info are skipped.""" + record = GuidMetadataRecord.objects.for_guid(project._id) + record.funding_info = [] + record.save() + + command = Command() + command.stdout = type('MockStdout', (), {'write': lambda self, x: None})() + + mapping = command.load_mapping(csv_mapping_file) + updated, stats = command.migrate_record( + record, + mapping, + dry_run=False, + update_funder_name=False + ) + + assert updated is False + assert stats['migrated'] == 0 + + def test_ror_funder_not_modified(self, user, csv_mapping_file): + """Test that funders already using ROR are not modified.""" + project = factories.ProjectFactory(creator=user) + record = GuidMetadataRecord.objects.for_guid(project._id) + record.funding_info = [{ + 'funder_name': 'Already ROR', + 'funder_identifier': 'https://ror.org/01cwqze88', + 'funder_identifier_type': 'ROR', + }] + record.save() + + command = Command() + command.stdout = type('MockStdout', (), {'write': lambda self, x: None})() + + mapping = command.load_mapping(csv_mapping_file) + updated, stats = command.migrate_record( + record, + mapping, + dry_run=False, + update_funder_name=False + ) + + assert updated is False + assert stats['migrated'] == 0 + + record.refresh_from_db() + assert record.funding_info[0]['funder_identifier'] == 'https://ror.org/01cwqze88' + + def test_reindex_triggered_after_migration(self, record_with_crossref_funder, csv_mapping_file, mock_reindex): + """Test that SHARE/DataCite re-indexing is triggered for migrated records.""" + mock_update_search, mock_request_identifier_update = mock_reindex + + call_command( + 'migrate_funder_ids_to_ror', + '--csv-file', csv_mapping_file, + ) + + # Verify re-indexing was triggered + mock_update_search.assert_called() + mock_request_identifier_update.assert_called_with('doi') + + # Verify data was actually migrated + record_with_crossref_funder.refresh_from_db() + funder = record_with_crossref_funder.funding_info[0] + assert funder['funder_identifier'] == 'https://ror.org/01cwqze88' + assert funder['funder_identifier_type'] == 'ROR' + + def test_reindex_not_triggered_on_dry_run(self, record_with_crossref_funder, csv_mapping_file, mock_reindex): + """Test that re-indexing is NOT triggered during dry run.""" + mock_update_search, mock_request_identifier_update = mock_reindex + + call_command( + 'migrate_funder_ids_to_ror', + '--csv-file', csv_mapping_file, + '--dry-run', + ) + + mock_update_search.assert_not_called() + mock_request_identifier_update.assert_not_called() + + def test_reindex_not_triggered_with_skip_flag(self, record_with_crossref_funder, csv_mapping_file, mock_reindex): + """Test that re-indexing is NOT triggered when --skip-reindex is used.""" + mock_update_search, mock_request_identifier_update = mock_reindex + + call_command( + 'migrate_funder_ids_to_ror', + '--csv-file', csv_mapping_file, + '--skip-reindex', + ) + + mock_update_search.assert_not_called() + mock_request_identifier_update.assert_not_called() + + # But data should still be migrated + record_with_crossref_funder.refresh_from_db() + funder = record_with_crossref_funder.funding_info[0] + assert funder['funder_identifier'] == 'https://ror.org/01cwqze88' + assert funder['funder_identifier_type'] == 'ROR' + + def test_reindex_triggered_for_unmapped_records(self, record_with_unmapped_funder, csv_mapping_file, mock_reindex): + """Test that re-indexing IS triggered when unmapped funders are removed.""" + mock_update_search, mock_request_identifier_update = mock_reindex + + call_command( + 'migrate_funder_ids_to_ror', + '--csv-file', csv_mapping_file, + ) + + mock_update_search.assert_called() + mock_request_identifier_update.assert_called_with('doi') + + def test_end_to_end_call_command(self, record_with_crossref_funder, record_with_multiple_funders, csv_mapping_file, mock_reindex): + """Test the full management command end-to-end via call_command.""" + mock_update_search, mock_request_identifier_update = mock_reindex + + call_command( + 'migrate_funder_ids_to_ror', + '--csv-file', csv_mapping_file, + ) + + # Record with single crossref funder should be migrated + record_with_crossref_funder.refresh_from_db() + funder = record_with_crossref_funder.funding_info[0] + assert funder['funder_identifier'] == 'https://ror.org/01cwqze88' + assert funder['funder_identifier_type'] == 'ROR' + assert funder['award_number'] == 'R01-GM-123456' + + # Record with multiple funders should have Crossref ones migrated + record_with_multiple_funders.refresh_from_db() + funders = record_with_multiple_funders.funding_info + assert funders[0]['funder_identifier'] == 'https://ror.org/01cwqze88' + assert funders[0]['funder_identifier_type'] == 'ROR' + assert funders[1]['funder_identifier'] == 'https://ror.org/existing123' + assert funders[1]['funder_identifier_type'] == 'ROR' + assert funders[2]['funder_identifier'] == 'https://ror.org/021nxhr62' + assert funders[2]['funder_identifier_type'] == 'ROR' + + # Re-indexing should have been triggered for both updated records + assert mock_update_search.call_count == 2 + assert mock_request_identifier_update.call_count == 2 + + def test_crossref_funder_uri_type_also_migrated(self, user, csv_mapping_file): + """Test that legacy 'Crossref Funder URI' type is also migrated (found in staging data).""" + project = factories.ProjectFactory(creator=user) + record = GuidMetadataRecord.objects.for_guid(project._id) + record.funding_info = [{ + 'funder_name': 'National Institutes of Health', + 'funder_identifier': 'http://dx.doi.org/10.13039/100000002', + 'funder_identifier_type': 'Crossref Funder URI', + 'award_number': '', + 'award_title': '', + }] + record.save() + + command = Command() + command.stdout = type('MockStdout', (), {'write': lambda self, x: None})() + + mapping = command.load_mapping(csv_mapping_file) + updated, stats = command.migrate_record( + record, mapping, dry_run=False, update_funder_name=False + ) + + assert updated is True + assert stats['migrated'] == 1 + + record.refresh_from_db() + funder = record.funding_info[0] + assert funder['funder_identifier'] == 'https://ror.org/01cwqze88' + assert funder['funder_identifier_type'] == 'ROR' diff --git a/osf_tests/management_commands/test_migrate_notifications.py b/osf_tests/management_commands/test_migrate_notifications.py index 1ea906d0d17..0bcecbdd37f 100644 --- a/osf_tests/management_commands/test_migrate_notifications.py +++ b/osf_tests/management_commands/test_migrate_notifications.py @@ -11,6 +11,7 @@ ) from osf.models import ( NotificationType, + NotificationTypeEnum, NotificationSubscription, ) from osf.management.commands.migrate_notifications import ( @@ -99,7 +100,7 @@ def test_migrate_provider_subscription(self, users, provider, provider2): self.create_legacy_sub(event_name='global_reviews', users=users, provider=RegistrationProvider.get_default()) migrate_legacy_notification_subscriptions() subs = NotificationSubscription.objects.filter( - notification_type__name=NotificationType.Type.REVIEWS_SUBMISSION_STATUS + notification_type__name=NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS ) assert subs.count() == 9 for obj in [provider, provider2, RegistrationProvider.get_default()]: @@ -108,7 +109,7 @@ def test_migrate_provider_subscription(self, users, provider, provider2): def test_migrate_node_subscription(self, users, user, node): migrate_legacy_notification_subscriptions() - nt = NotificationType.objects.get(name=NotificationType.Type.NODE_FILE_UPDATED) + nt = NotificationType.objects.get(name=NotificationTypeEnum.NODE_FILE_UPDATED) assert nt.object_content_type == ContentType.objects.get_for_model(Node) subs = NotificationSubscription.objects.filter(notification_type=nt) assert subs.count() == 1 @@ -130,7 +131,7 @@ def test_idempotent_migration(self, users, user, node, provider): user=user, object_id=node.id, content_type=ContentType.objects.get_for_model(node.__class__), - notification_type__name=NotificationType.Type.NODE_FILE_UPDATED + notification_type__name=NotificationTypeEnum.NODE_FILE_UPDATED ) def test_migrate_all_subscription_types(self, users, user, provider, provider2, node): @@ -158,7 +159,7 @@ def test_migrate_all_subscription_types(self, users, user, provider, provider2, node_ct = ContentType.objects.get_for_model(node.__class__) assert NotificationSubscription.objects.filter( - notification_type=NotificationType.Type.NODE_FILE_UPDATED.instance, + notification_type=NotificationTypeEnum.NODE_FILE_UPDATED.instance, content_type=node_ct, object_id=node.id ).exists() @@ -201,7 +202,7 @@ def test_migrate_batch_with_valid_and_invalid(self, users, user, node, provider) ) migrate_legacy_notification_subscriptions() assert NotificationSubscription.objects.filter( - notification_type__name=NotificationType.Type.REVIEWS_SUBMISSION_STATUS + notification_type__name=NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS ).count() == 3 def test_migrate_subscription_frequencies_none(self, user, django_db_blocker): @@ -214,7 +215,7 @@ def test_migrate_subscription_frequencies_none(self, user, django_db_blocker): migrate_legacy_notification_subscriptions() - nt = NotificationType.objects.get(name=NotificationType.Type.USER_FILE_UPDATED) + nt = NotificationType.objects.get(name=NotificationTypeEnum.USER_FILE_UPDATED) subs = NotificationSubscription.objects.filter(notification_type=nt) assert subs.count() == 1 assert subs.get().message_frequency == 'none' @@ -228,7 +229,7 @@ def test_migrate_subscription_frequencies_transactional(self, user, django_db_bl migrate_legacy_notification_subscriptions() - nt = NotificationType.objects.get(name=NotificationType.Type.USER_FILE_UPDATED) + nt = NotificationType.objects.get(name=NotificationTypeEnum.USER_FILE_UPDATED) subs = NotificationSubscription.objects.filter( notification_type=nt, content_type=ContentType.objects.get_for_model(user.__class__), @@ -246,7 +247,7 @@ def test_migrate_global_subscription_frequencies_daily(self, user, django_db_blo migrate_legacy_notification_subscriptions() - nt = NotificationType.objects.get(name=NotificationType.Type.USER_FILE_UPDATED) + nt = NotificationType.objects.get(name=NotificationTypeEnum.USER_FILE_UPDATED) subs = NotificationSubscription.objects.filter( notification_type=nt, content_type=ContentType.objects.get_for_model(user.__class__), @@ -264,7 +265,7 @@ def test_migrate_node_subscription_frequencies_daily(self, user, node, django_db migrate_legacy_notification_subscriptions() - nt = NotificationType.objects.get(name=NotificationType.Type.NODE_FILE_UPDATED) + nt = NotificationType.objects.get(name=NotificationTypeEnum.NODE_FILE_UPDATED) subs = NotificationSubscription.objects.filter( user=user, notification_type=nt, @@ -283,7 +284,7 @@ def test_node_subscription_copy_group_frequency(self, user, node, django_db_bloc migrate_legacy_notification_subscriptions() - NotificationType.Type.FILE_UPDATED.instance.emit( + NotificationTypeEnum.FILE_UPDATED.instance.emit( user=user, subscribed_object=node, event_context={ @@ -294,7 +295,7 @@ def test_node_subscription_copy_group_frequency(self, user, node, django_db_bloc nt = NotificationSubscription.objects.get( user=user, - notification_type__name=NotificationType.Type.FILE_UPDATED, + notification_type__name=NotificationTypeEnum.FILE_UPDATED, content_type=ContentType.objects.get_for_model(node), object_id=node.id, ) @@ -309,7 +310,7 @@ def test_user_subscription_copy_group_frequency(self, user, node, django_db_bloc migrate_legacy_notification_subscriptions() - NotificationType.Type.FILE_UPDATED.instance.emit( + NotificationTypeEnum.FILE_UPDATED.instance.emit( user=user, subscribed_object=user, event_context={ @@ -320,7 +321,7 @@ def test_user_subscription_copy_group_frequency(self, user, node, django_db_bloc nt = NotificationSubscription.objects.get( user=user, - notification_type__name=NotificationType.Type.FILE_UPDATED, + notification_type__name=NotificationTypeEnum.FILE_UPDATED, content_type=ContentType.objects.get_for_model(user), object_id=user.id, ) @@ -335,7 +336,7 @@ def test_provider_subscription_copy_group_frequency(self, user, node, provider): migrate_legacy_notification_subscriptions() - NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS.instance.emit( + NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS.instance.emit( user=user, subscribed_object=provider, event_context={ @@ -346,8 +347,8 @@ def test_provider_subscription_copy_group_frequency(self, user, node, provider): nt = NotificationSubscription.objects.get( user=user, - notification_type__name=NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS, - content_type=ContentType.objects.get_for_model(provider, for_concrete_model=False), + notification_type__name=NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS, + content_type=ContentType.objects.get_for_model(provider), object_id=provider.id, ) assert nt.message_frequency == 'none' diff --git a/osf_tests/metadata/expected_metadata_files/file_basic.linkset b/osf_tests/metadata/expected_metadata_files/file_basic.linkset new file mode 100644 index 00000000000..f4cc87d6a8f --- /dev/null +++ b/osf_tests/metadata/expected_metadata_files/file_basic.linkset @@ -0,0 +1,9 @@ + ; rel="collection" ; anchor="http://localhost:5000/w3ibb", + ; rel="type" ; anchor="http://localhost:5000/w3ibb", + ; rel="cite-as" ; anchor="http://localhost:5000/w3ibb", + ; rel="describedby" ; anchor="http://localhost:5000/w3ibb" ; type="text/turtle; charset=utf-8", + ; rel="describedby" ; anchor="http://localhost:5000/w3ibb" ; type="application/json", + ; rel="describedby" ; anchor="http://localhost:5000/w3ibb" ; type="application/xml", + ; rel="describedby" ; anchor="http://localhost:5000/w3ibb" ; type="application/ld+json", + ; rel="describedby" ; anchor="http://localhost:5000/w3ibb" ; type="application/linkset", + ; rel="describedby" ; anchor="http://localhost:5000/w3ibb" ; type="application/linkset+json" diff --git a/osf_tests/metadata/expected_metadata_files/file_basic.linkset.json b/osf_tests/metadata/expected_metadata_files/file_basic.linkset.json new file mode 100644 index 00000000000..25bdb466711 --- /dev/null +++ b/osf_tests/metadata/expected_metadata_files/file_basic.linkset.json @@ -0,0 +1,48 @@ +{ + "linkset": [ + { + "anchor": "http://localhost:5000/w3ibb", + "collection": [ + { + "href": "http://localhost:5000/w2ibb" + } + ], + "type": [ + { + "href": "https://schema.org/DigitalDocument" + } + ], + "cite-as": [ + { + "href": "http://localhost:5000/w3ibb" + } + ], + "describedby": [ + { + "href": "http://localhost:5000/metadata/w3ibb/?format=turtle", + "type": "text/turtle; charset=utf-8" + }, + { + "href": "http://localhost:5000/metadata/w3ibb/?format=datacite-json", + "type": "application/json" + }, + { + "href": "http://localhost:5000/metadata/w3ibb/?format=datacite-xml", + "type": "application/xml" + }, + { + "href": "http://localhost:5000/metadata/w3ibb/?format=google-dataset-json-ld", + "type": "application/ld+json" + }, + { + "href": "http://localhost:5000/metadata/w3ibb/?format=linkset", + "type": "application/linkset" + }, + { + "href": "http://localhost:5000/metadata/w3ibb/?format=linkset-json", + "type": "application/linkset+json" + } + ] + } + ] +} \ No newline at end of file diff --git a/osf_tests/metadata/expected_metadata_files/file_full.linkset b/osf_tests/metadata/expected_metadata_files/file_full.linkset new file mode 100644 index 00000000000..f4cc87d6a8f --- /dev/null +++ b/osf_tests/metadata/expected_metadata_files/file_full.linkset @@ -0,0 +1,9 @@ + ; rel="collection" ; anchor="http://localhost:5000/w3ibb", + ; rel="type" ; anchor="http://localhost:5000/w3ibb", + ; rel="cite-as" ; anchor="http://localhost:5000/w3ibb", + ; rel="describedby" ; anchor="http://localhost:5000/w3ibb" ; type="text/turtle; charset=utf-8", + ; rel="describedby" ; anchor="http://localhost:5000/w3ibb" ; type="application/json", + ; rel="describedby" ; anchor="http://localhost:5000/w3ibb" ; type="application/xml", + ; rel="describedby" ; anchor="http://localhost:5000/w3ibb" ; type="application/ld+json", + ; rel="describedby" ; anchor="http://localhost:5000/w3ibb" ; type="application/linkset", + ; rel="describedby" ; anchor="http://localhost:5000/w3ibb" ; type="application/linkset+json" diff --git a/osf_tests/metadata/expected_metadata_files/file_full.linkset.json b/osf_tests/metadata/expected_metadata_files/file_full.linkset.json new file mode 100644 index 00000000000..25bdb466711 --- /dev/null +++ b/osf_tests/metadata/expected_metadata_files/file_full.linkset.json @@ -0,0 +1,48 @@ +{ + "linkset": [ + { + "anchor": "http://localhost:5000/w3ibb", + "collection": [ + { + "href": "http://localhost:5000/w2ibb" + } + ], + "type": [ + { + "href": "https://schema.org/DigitalDocument" + } + ], + "cite-as": [ + { + "href": "http://localhost:5000/w3ibb" + } + ], + "describedby": [ + { + "href": "http://localhost:5000/metadata/w3ibb/?format=turtle", + "type": "text/turtle; charset=utf-8" + }, + { + "href": "http://localhost:5000/metadata/w3ibb/?format=datacite-json", + "type": "application/json" + }, + { + "href": "http://localhost:5000/metadata/w3ibb/?format=datacite-xml", + "type": "application/xml" + }, + { + "href": "http://localhost:5000/metadata/w3ibb/?format=google-dataset-json-ld", + "type": "application/ld+json" + }, + { + "href": "http://localhost:5000/metadata/w3ibb/?format=linkset", + "type": "application/linkset" + }, + { + "href": "http://localhost:5000/metadata/w3ibb/?format=linkset-json", + "type": "application/linkset+json" + } + ] + } + ] +} \ No newline at end of file diff --git a/osf_tests/metadata/expected_metadata_files/file_full.turtle b/osf_tests/metadata/expected_metadata_files/file_full.turtle index 492adf41375..4f529ed037f 100644 --- a/osf_tests/metadata/expected_metadata_files/file_full.turtle +++ b/osf_tests/metadata/expected_metadata_files/file_full.turtle @@ -29,8 +29,8 @@ dcterms:title "this is a project title!"@en ; dcterms:type ; owl:sameAs ; - osf:funder , - ; + osf:funder , + ; osf:hasFunding , . @@ -63,8 +63,8 @@ dcterms:identifier "https://doi.org/10.$$$$" ; foaf:name "Mx. Moneypockets" . - a dcterms:Agent ; - dcterms:identifier "https://doi.org/10.$" ; + a dcterms:Agent ; + dcterms:identifier "https://ror.org/0example" ; foaf:name "Caring Fan" . a dcterms:Agent, diff --git a/osf_tests/metadata/expected_metadata_files/preprint_basic.linkset b/osf_tests/metadata/expected_metadata_files/preprint_basic.linkset new file mode 100644 index 00000000000..fb09d81e132 --- /dev/null +++ b/osf_tests/metadata/expected_metadata_files/preprint_basic.linkset @@ -0,0 +1,10 @@ + ; rel="author" ; anchor="http://localhost:5000/w4ibb", + ; rel="type" ; anchor="http://localhost:5000/w4ibb", + ; rel="type" ; anchor="http://localhost:5000/w4ibb", + ; rel="cite-as" ; anchor="http://localhost:5000/w4ibb", + ; rel="describedby" ; anchor="http://localhost:5000/w4ibb" ; type="text/turtle; charset=utf-8", + ; rel="describedby" ; anchor="http://localhost:5000/w4ibb" ; type="application/json", + ; rel="describedby" ; anchor="http://localhost:5000/w4ibb" ; type="application/xml", + ; rel="describedby" ; anchor="http://localhost:5000/w4ibb" ; type="application/ld+json", + ; rel="describedby" ; anchor="http://localhost:5000/w4ibb" ; type="application/linkset", + ; rel="describedby" ; anchor="http://localhost:5000/w4ibb" ; type="application/linkset+json" \ No newline at end of file diff --git a/osf_tests/metadata/expected_metadata_files/preprint_basic.linkset.json b/osf_tests/metadata/expected_metadata_files/preprint_basic.linkset.json new file mode 100644 index 00000000000..85db01da76b --- /dev/null +++ b/osf_tests/metadata/expected_metadata_files/preprint_basic.linkset.json @@ -0,0 +1,51 @@ +{ + "linkset": [ + { + "anchor": "http://localhost:5000/w4ibb", + "author": [ + { + "href": "http://localhost:5000/w1ibb" + } + ], + "type": [ + { + "href": "https://schema.org/ScholarlyArticle" + }, + { + "href": "https://schema.org/AboutPage" + } + ], + "cite-as": [ + { + "href": "https://doi.org/11.pp/FK2osf.io/w4ibb_v1" + } + ], + "describedby": [ + { + "href": "http://localhost:5000/metadata/w4ibb/?format=turtle", + "type": "text/turtle; charset=utf-8" + }, + { + "href": "http://localhost:5000/metadata/w4ibb/?format=datacite-json", + "type": "application/json" + }, + { + "href": "http://localhost:5000/metadata/w4ibb/?format=datacite-xml", + "type": "application/xml" + }, + { + "href": "http://localhost:5000/metadata/w4ibb/?format=google-dataset-json-ld", + "type": "application/ld+json" + }, + { + "href": "http://localhost:5000/metadata/w4ibb/?format=linkset", + "type": "application/linkset" + }, + { + "href": "http://localhost:5000/metadata/w4ibb/?format=linkset-json", + "type": "application/linkset+json" + } + ] + } + ] +} \ No newline at end of file diff --git a/osf_tests/metadata/expected_metadata_files/preprint_full.linkset b/osf_tests/metadata/expected_metadata_files/preprint_full.linkset new file mode 100644 index 00000000000..a6acad9d317 --- /dev/null +++ b/osf_tests/metadata/expected_metadata_files/preprint_full.linkset @@ -0,0 +1,12 @@ + ; rel="author" ; anchor="http://localhost:5000/w4ibb", + ; rel="type" ; anchor="http://localhost:5000/w4ibb", + ; rel="type" ; anchor="http://localhost:5000/w4ibb", + ; rel="cite-as" ; anchor="http://localhost:5000/w4ibb", + ; rel="describedby" ; anchor="http://localhost:5000/w4ibb" ; type="text/turtle; charset=utf-8", + ; rel="describedby" ; anchor="http://localhost:5000/w4ibb" ; type="application/json", + ; rel="describedby" ; anchor="http://localhost:5000/w4ibb" ; type="application/xml", + ; rel="describedby" ; anchor="http://localhost:5000/w4ibb" ; type="application/ld+json", + ; rel="describedby" ; anchor="http://localhost:5000/w4ibb" ; type="application/linkset", + ; rel="describedby" ; anchor="http://localhost:5000/w4ibb" ; type="application/linkset+json" + + diff --git a/osf_tests/metadata/expected_metadata_files/preprint_full.linkset.json b/osf_tests/metadata/expected_metadata_files/preprint_full.linkset.json new file mode 100644 index 00000000000..85db01da76b --- /dev/null +++ b/osf_tests/metadata/expected_metadata_files/preprint_full.linkset.json @@ -0,0 +1,51 @@ +{ + "linkset": [ + { + "anchor": "http://localhost:5000/w4ibb", + "author": [ + { + "href": "http://localhost:5000/w1ibb" + } + ], + "type": [ + { + "href": "https://schema.org/ScholarlyArticle" + }, + { + "href": "https://schema.org/AboutPage" + } + ], + "cite-as": [ + { + "href": "https://doi.org/11.pp/FK2osf.io/w4ibb_v1" + } + ], + "describedby": [ + { + "href": "http://localhost:5000/metadata/w4ibb/?format=turtle", + "type": "text/turtle; charset=utf-8" + }, + { + "href": "http://localhost:5000/metadata/w4ibb/?format=datacite-json", + "type": "application/json" + }, + { + "href": "http://localhost:5000/metadata/w4ibb/?format=datacite-xml", + "type": "application/xml" + }, + { + "href": "http://localhost:5000/metadata/w4ibb/?format=google-dataset-json-ld", + "type": "application/ld+json" + }, + { + "href": "http://localhost:5000/metadata/w4ibb/?format=linkset", + "type": "application/linkset" + }, + { + "href": "http://localhost:5000/metadata/w4ibb/?format=linkset-json", + "type": "application/linkset+json" + } + ] + } + ] +} \ No newline at end of file diff --git a/osf_tests/metadata/expected_metadata_files/preprint_full.turtle b/osf_tests/metadata/expected_metadata_files/preprint_full.turtle index 6b28e0dfa3e..9e3f96bc09c 100644 --- a/osf_tests/metadata/expected_metadata_files/preprint_full.turtle +++ b/osf_tests/metadata/expected_metadata_files/preprint_full.turtle @@ -55,8 +55,8 @@ dcterms:title "this is a project title!"@en ; dcterms:type ; owl:sameAs ; - osf:funder , - ; + osf:funder , + ; osf:hasFunding , . @@ -121,8 +121,8 @@ dcterms:identifier "https://doi.org/10.$$$$" ; foaf:name "Mx. Moneypockets" . - a dcterms:Agent ; - dcterms:identifier "https://doi.org/10.$" ; + a dcterms:Agent ; + dcterms:identifier "https://ror.org/0example" ; foaf:name "Caring Fan" . a skos:Concept ; diff --git a/osf_tests/metadata/expected_metadata_files/project_basic.linkset b/osf_tests/metadata/expected_metadata_files/project_basic.linkset new file mode 100644 index 00000000000..aa22a299c7d --- /dev/null +++ b/osf_tests/metadata/expected_metadata_files/project_basic.linkset @@ -0,0 +1,11 @@ + ; rel="author" ; anchor="http://localhost:5000/w2ibb", + ; rel="type" ; anchor="http://localhost:5000/w2ibb", + ; rel="type" ; anchor="http://localhost:5000/w2ibb", + ; rel="cite-as" ; anchor="http://localhost:5000/w2ibb", + ; rel="describedby" ; anchor="http://localhost:5000/w2ibb" ; type="text/turtle; charset=utf-8", + ; rel="describedby" ; anchor="http://localhost:5000/w2ibb" ; type="application/json", + ; rel="describedby" ; anchor="http://localhost:5000/w2ibb" ; type="application/xml", + ; rel="describedby" ; anchor="http://localhost:5000/w2ibb" ; type="application/ld+json", + ; rel="describedby" ; anchor="http://localhost:5000/w2ibb" ; type="application/linkset", + ; rel="describedby" ; anchor="http://localhost:5000/w2ibb" ; type="application/linkset+json", + ; rel="item" ; anchor="http://localhost:5000/w2ibb" ; type="application/octet-stream" \ No newline at end of file diff --git a/osf_tests/metadata/expected_metadata_files/project_basic.linkset.json b/osf_tests/metadata/expected_metadata_files/project_basic.linkset.json new file mode 100644 index 00000000000..3d7c7fd63f6 --- /dev/null +++ b/osf_tests/metadata/expected_metadata_files/project_basic.linkset.json @@ -0,0 +1,57 @@ +{ + "linkset": [ + { + "anchor": "http://localhost:5000/w2ibb", + "author": [ + { + "href": "http://localhost:5000/w1ibb" + } + ], + "type": [ + { + "href": "https://schema.org/CreativeWork" + }, + { + "href": "https://schema.org/AboutPage" + } + ], + "cite-as": [ + { + "href": "https://doi.org/10.70102/FK2osf.io/w2ibb" + } + ], + "describedby": [ + { + "href": "http://localhost:5000/metadata/w2ibb/?format=turtle", + "type": "text/turtle; charset=utf-8" + }, + { + "href": "http://localhost:5000/metadata/w2ibb/?format=datacite-json", + "type": "application/json" + }, + { + "href": "http://localhost:5000/metadata/w2ibb/?format=datacite-xml", + "type": "application/xml" + }, + { + "href": "http://localhost:5000/metadata/w2ibb/?format=google-dataset-json-ld", + "type": "application/ld+json" + }, + { + "href": "http://localhost:5000/metadata/w2ibb/?format=linkset", + "type": "application/linkset" + }, + { + "href": "http://localhost:5000/metadata/w2ibb/?format=linkset-json", + "type": "application/linkset+json" + } + ], + "item": [ + { + "href": "http://localhost:5000/w3ibb", + "type": "application/octet-stream" + } + ] + } + ] +} \ No newline at end of file diff --git a/osf_tests/metadata/expected_metadata_files/project_full.datacite.json b/osf_tests/metadata/expected_metadata_files/project_full.datacite.json index 312e74b2388..3ff394455a1 100644 --- a/osf_tests/metadata/expected_metadata_files/project_full.datacite.json +++ b/osf_tests/metadata/expected_metadata_files/project_full.datacite.json @@ -56,7 +56,8 @@ "awardTitle": "because reasons", "funderIdentifier": { "funderIdentifier": "https://doi.org/10.$$$$", - "funderIdentifierType": "Crossref Funder ID" + "funderIdentifierType": "Crossref Funder ID", + "schemeURI": "https://www.crossref.org/services/funder-registry/" }, "funderName": "Mx. Moneypockets" }, @@ -68,14 +69,16 @@ "awardTitle": "because reasons!", "funderIdentifier": { "funderIdentifier": "https://doi.org/10.$$$$", - "funderIdentifierType": "Crossref Funder ID" + "funderIdentifierType": "Crossref Funder ID", + "schemeURI": "https://www.crossref.org/services/funder-registry/" }, "funderName": "Mx. Moneypockets" }, { "funderIdentifier": { - "funderIdentifier": "https://doi.org/10.$", - "funderIdentifierType": "Crossref Funder ID" + "funderIdentifier": "https://ror.org/0example", + "funderIdentifierType": "ROR", + "schemeURI": "https://ror.org/" }, "funderName": "Caring Fan" } diff --git a/osf_tests/metadata/expected_metadata_files/project_full.datacite.xml b/osf_tests/metadata/expected_metadata_files/project_full.datacite.xml index 524fbc33dd4..a161f7cad66 100644 --- a/osf_tests/metadata/expected_metadata_files/project_full.datacite.xml +++ b/osf_tests/metadata/expected_metadata_files/project_full.datacite.xml @@ -38,19 +38,19 @@ Mx. Moneypockets - https://doi.org/10.$$$$ + https://doi.org/10.$$$$ 10000000 because reasons Mx. Moneypockets - https://doi.org/10.$$$$ + https://doi.org/10.$$$$ 2000000 because reasons! Caring Fan - https://doi.org/10.$ + https://ror.org/0example diff --git a/osf_tests/metadata/expected_metadata_files/project_full.linkset b/osf_tests/metadata/expected_metadata_files/project_full.linkset new file mode 100644 index 00000000000..a7117e37879 --- /dev/null +++ b/osf_tests/metadata/expected_metadata_files/project_full.linkset @@ -0,0 +1,12 @@ + ; rel="author" ; anchor="http://localhost:5000/w2ibb", + ; rel="type" ; anchor="http://localhost:5000/w2ibb", + ; rel="type" ; anchor="http://localhost:5000/w2ibb", + ; rel="cite-as" ; anchor="http://localhost:5000/w2ibb", + ; rel="describedby" ; anchor="http://localhost:5000/w2ibb" ; type="text/turtle; charset=utf-8", + ; rel="describedby" ; anchor="http://localhost:5000/w2ibb" ; type="application/json", + ; rel="describedby" ; anchor="http://localhost:5000/w2ibb" ; type="application/xml", + ; rel="describedby" ; anchor="http://localhost:5000/w2ibb" ; type="application/ld+json", + ; rel="describedby" ; anchor="http://localhost:5000/w2ibb" ; type="application/linkset", + ; rel="describedby" ; anchor="http://localhost:5000/w2ibb" ; type="application/linkset+json", + ; rel="license" ; anchor="http://localhost:5000/w2ibb", + ; rel="item" ; anchor="http://localhost:5000/w2ibb" ; type="application/octet-stream" diff --git a/osf_tests/metadata/expected_metadata_files/project_full.linkset.json b/osf_tests/metadata/expected_metadata_files/project_full.linkset.json new file mode 100644 index 00000000000..c8f857561c2 --- /dev/null +++ b/osf_tests/metadata/expected_metadata_files/project_full.linkset.json @@ -0,0 +1,62 @@ +{ + "linkset": [ + { + "anchor": "http://localhost:5000/w2ibb", + "author": [ + { + "href": "http://localhost:5000/w1ibb" + } + ], + "type": [ + { + "href": "https://schema.org/Dataset" + }, + { + "href": "https://schema.org/AboutPage" + } + ], + "cite-as": [ + { + "href": "https://doi.org/10.70102/FK2osf.io/w2ibb" + } + ], + "describedby": [ + { + "href": "http://localhost:5000/metadata/w2ibb/?format=turtle", + "type": "text/turtle; charset=utf-8" + }, + { + "href": "http://localhost:5000/metadata/w2ibb/?format=datacite-json", + "type": "application/json" + }, + { + "href": "http://localhost:5000/metadata/w2ibb/?format=datacite-xml", + "type": "application/xml" + }, + { + "href": "http://localhost:5000/metadata/w2ibb/?format=google-dataset-json-ld", + "type": "application/ld+json" + }, + { + "href": "http://localhost:5000/metadata/w2ibb/?format=linkset", + "type": "application/linkset" + }, + { + "href": "http://localhost:5000/metadata/w2ibb/?format=linkset-json", + "type": "application/linkset+json" + } + ], + "license": [ + { + "href": "https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode" + } + ], + "item": [ + { + "href": "http://localhost:5000/w3ibb", + "type": "application/octet-stream" + } + ] + } + ] +} \ No newline at end of file diff --git a/osf_tests/metadata/expected_metadata_files/project_full.turtle b/osf_tests/metadata/expected_metadata_files/project_full.turtle index 0085e6164e3..5d3d78b761e 100644 --- a/osf_tests/metadata/expected_metadata_files/project_full.turtle +++ b/osf_tests/metadata/expected_metadata_files/project_full.turtle @@ -27,8 +27,8 @@ owl:sameAs ; dcat:accessService ; osf:contains ; - osf:funder , - ; + osf:funder , + ; osf:hasFunding , ; osf:hostingInstitution ; @@ -116,8 +116,8 @@ dcterms:identifier "https://doi.org/10.$$$$" ; foaf:name "Mx. Moneypockets" . - a dcterms:Agent ; - dcterms:identifier "https://doi.org/10.$" ; + a dcterms:Agent ; + dcterms:identifier "https://ror.org/0example" ; foaf:name "Caring Fan" . a dcterms:Agent, diff --git a/osf_tests/metadata/expected_metadata_files/registration_basic.linkset b/osf_tests/metadata/expected_metadata_files/registration_basic.linkset new file mode 100644 index 00000000000..76c314b85cc --- /dev/null +++ b/osf_tests/metadata/expected_metadata_files/registration_basic.linkset @@ -0,0 +1,11 @@ + ; rel="author" ; anchor="http://localhost:5000/w5ibb", + ; rel="type" ; anchor="http://localhost:5000/w5ibb", + ; rel="type" ; anchor="http://localhost:5000/w5ibb", + ; rel="cite-as" ; anchor="http://localhost:5000/w5ibb", + ; rel="describedby" ; anchor="http://localhost:5000/w5ibb" ; type="text/turtle; charset=utf-8", + ; rel="describedby" ; anchor="http://localhost:5000/w5ibb" ; type="application/json", + ; rel="describedby" ; anchor="http://localhost:5000/w5ibb" ; type="application/xml", + ; rel="describedby" ; anchor="http://localhost:5000/w5ibb" ; type="application/ld+json", + ; rel="describedby" ; anchor="http://localhost:5000/w5ibb" ; type="application/linkset", + ; rel="describedby" ; anchor="http://localhost:5000/w5ibb" ; type="application/linkset+json", + ; rel="item" ; anchor="http://localhost:5000/w5ibb" ; type="application/octet-stream" diff --git a/osf_tests/metadata/expected_metadata_files/registration_basic.linkset.json b/osf_tests/metadata/expected_metadata_files/registration_basic.linkset.json new file mode 100644 index 00000000000..b4a1d25234b --- /dev/null +++ b/osf_tests/metadata/expected_metadata_files/registration_basic.linkset.json @@ -0,0 +1,57 @@ +{ + "linkset": [ + { + "anchor": "http://localhost:5000/w5ibb", + "author": [ + { + "href": "http://localhost:5000/w1ibb" + } + ], + "type": [ + { + "href": "https://schema.org/Text" + }, + { + "href": "https://schema.org/AboutPage" + } + ], + "cite-as": [ + { + "href": "http://localhost:5000/w5ibb" + } + ], + "describedby": [ + { + "href": "http://localhost:5000/metadata/w5ibb/?format=turtle", + "type": "text/turtle; charset=utf-8" + }, + { + "href": "http://localhost:5000/metadata/w5ibb/?format=datacite-json", + "type": "application/json" + }, + { + "href": "http://localhost:5000/metadata/w5ibb/?format=datacite-xml", + "type": "application/xml" + }, + { + "href": "http://localhost:5000/metadata/w5ibb/?format=google-dataset-json-ld", + "type": "application/ld+json" + }, + { + "href": "http://localhost:5000/metadata/w5ibb/?format=linkset", + "type": "application/linkset" + }, + { + "href": "http://localhost:5000/metadata/w5ibb/?format=linkset-json", + "type": "application/linkset+json" + } + ], + "item": [ + { + "href": "http://localhost:5000/w6ibb", + "type": "application/octet-stream" + } + ] + } + ] +} \ No newline at end of file diff --git a/osf_tests/metadata/expected_metadata_files/registration_full.linkset b/osf_tests/metadata/expected_metadata_files/registration_full.linkset new file mode 100644 index 00000000000..4104a235897 --- /dev/null +++ b/osf_tests/metadata/expected_metadata_files/registration_full.linkset @@ -0,0 +1,12 @@ + ; rel="author" ; anchor="http://localhost:5000/w5ibb", + ; rel="type" ; anchor="http://localhost:5000/w5ibb", + ; rel="type" ; anchor="http://localhost:5000/w5ibb", + ; rel="cite-as" ; anchor="http://localhost:5000/w5ibb", + ; rel="describedby" ; anchor="http://localhost:5000/w5ibb" ; type="text/turtle; charset=utf-8", + ; rel="describedby" ; anchor="http://localhost:5000/w5ibb" ; type="application/json", + ; rel="describedby" ; anchor="http://localhost:5000/w5ibb" ; type="application/xml", + ; rel="describedby" ; anchor="http://localhost:5000/w5ibb" ; type="application/ld+json", + ; rel="describedby" ; anchor="http://localhost:5000/w5ibb" ; type="application/linkset", + ; rel="describedby" ; anchor="http://localhost:5000/w5ibb" ; type="application/linkset+json", + ; rel="license" ; anchor="http://localhost:5000/w5ibb", + ; rel="item" ; anchor="http://localhost:5000/w5ibb" ; type="application/octet-stream" diff --git a/osf_tests/metadata/expected_metadata_files/registration_full.linkset.json b/osf_tests/metadata/expected_metadata_files/registration_full.linkset.json new file mode 100644 index 00000000000..010441fd390 --- /dev/null +++ b/osf_tests/metadata/expected_metadata_files/registration_full.linkset.json @@ -0,0 +1,62 @@ +{ + "linkset": [ + { + "anchor": "http://localhost:5000/w5ibb", + "author": [ + { + "href": "http://localhost:5000/w1ibb" + } + ], + "type": [ + { + "href": "https://schema.org/Text" + }, + { + "href": "https://schema.org/AboutPage" + } + ], + "cite-as": [ + { + "href": "http://localhost:5000/w5ibb" + } + ], + "describedby": [ + { + "href": "http://localhost:5000/metadata/w5ibb/?format=turtle", + "type": "text/turtle; charset=utf-8" + }, + { + "href": "http://localhost:5000/metadata/w5ibb/?format=datacite-json", + "type": "application/json" + }, + { + "href": "http://localhost:5000/metadata/w5ibb/?format=datacite-xml", + "type": "application/xml" + }, + { + "href": "http://localhost:5000/metadata/w5ibb/?format=google-dataset-json-ld", + "type": "application/ld+json" + }, + { + "href": "http://localhost:5000/metadata/w5ibb/?format=linkset", + "type": "application/linkset" + }, + { + "href": "http://localhost:5000/metadata/w5ibb/?format=linkset-json", + "type": "application/linkset+json" + } + ], + "license": [ + { + "href": "https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode" + } + ], + "item": [ + { + "href": "http://localhost:5000/w6ibb", + "type": "application/octet-stream" + } + ] + } + ] +} \ No newline at end of file diff --git a/osf_tests/metadata/expected_metadata_files/registration_full.turtle b/osf_tests/metadata/expected_metadata_files/registration_full.turtle index ab75ae5888c..32599e57ab9 100644 --- a/osf_tests/metadata/expected_metadata_files/registration_full.turtle +++ b/osf_tests/metadata/expected_metadata_files/registration_full.turtle @@ -43,8 +43,8 @@ dcterms:title "this is a project title!"@en ; dcterms:type ; owl:sameAs ; - osf:funder , - ; + osf:funder , + ; osf:hasFunding , . @@ -98,8 +98,8 @@ dcterms:identifier "https://doi.org/10.$$$$" ; foaf:name "Mx. Moneypockets" . - a dcterms:Agent ; - dcterms:identifier "https://doi.org/10.$" ; + a dcterms:Agent ; + dcterms:identifier "https://ror.org/0example" ; foaf:name "Caring Fan" . a dcterms:Agent, diff --git a/osf_tests/metadata/test_osf_gathering.py b/osf_tests/metadata/test_osf_gathering.py index 424042253f7..f235488e557 100644 --- a/osf_tests/metadata/test_osf_gathering.py +++ b/osf_tests/metadata/test_osf_gathering.py @@ -610,10 +610,16 @@ def test_gather_funding(self): 'award_uri': 'https://nih.example/award', 'award_number': '27', }, + { + 'funder_name': 'NSF', + 'funder_identifier': 'https://ror.org/021nxhr62', + 'funder_identifier_type': 'ROR', + }, ] _bnode1 = rdflib.BNode() _award_uri = URIRef('https://nih.example/award') _funder_uri = URIRef('https://doi.org/10.fake/NIH') + _ror_funder_uri = URIRef('https://ror.org/021nxhr62') assert_triples(osf_gathering.gather_funding(self.projectfocus), { (self.projectfocus.iri, OSF.funder, _bnode1), (_bnode1, RDF.type, DCTERMS.Agent), @@ -628,6 +634,10 @@ def test_gather_funding(self): (_award_uri, DCTERMS.title, Literal('big fun')), (_award_uri, OSF.awardNumber, Literal('27')), (_award_uri, DCTERMS.contributor, _funder_uri), + (self.projectfocus.iri, OSF.funder, _ror_funder_uri), + (_ror_funder_uri, RDF.type, DCTERMS.Agent), + (_ror_funder_uri, DCTERMS.identifier, Literal(_ror_funder_uri)), + (_ror_funder_uri, FOAF.name, Literal('NSF')), }) # focus: registration assert_triples(osf_gathering.gather_funding(self.registrationfocus), set()) diff --git a/osf_tests/metadata/test_serialized_metadata.py b/osf_tests/metadata/test_serialized_metadata.py index 53c5577ede7..5dc4029aaf4 100644 --- a/osf_tests/metadata/test_serialized_metadata.py +++ b/osf_tests/metadata/test_serialized_metadata.py @@ -31,6 +31,9 @@ 'datacite-xml': 'project_basic.datacite.xml', 'datacite-json': 'project_basic.datacite.json', 'google-dataset-json-ld': 'project_basic.google-dataset.json', + + 'linkset': 'project_basic.linkset', + 'linkset-json': 'project_basic.linkset.json', }, }, OSF.Preprint: { @@ -39,6 +42,9 @@ 'datacite-xml': 'preprint_basic.datacite.xml', 'datacite-json': 'preprint_basic.datacite.json', 'google-dataset-json-ld': 'preprint_basic.google-dataset.json', + + 'linkset': 'preprint_basic.linkset', + 'linkset-json': 'preprint_basic.linkset.json', }, }, OSF.Registration: { @@ -47,6 +53,9 @@ 'datacite-xml': 'registration_basic.datacite.xml', 'datacite-json': 'registration_basic.datacite.json', 'google-dataset-json-ld': 'registration_basic.google-dataset.json', + + 'linkset': 'registration_basic.linkset', + 'linkset-json': 'registration_basic.linkset.json', }, }, OSF.File: { @@ -55,6 +64,8 @@ 'datacite-xml': 'file_basic.datacite.xml', 'datacite-json': 'file_basic.datacite.json', 'google-dataset-json-ld': 'file_basic.google-dataset.json', + 'linkset': 'file_basic.linkset', + 'linkset-json': 'file_basic.linkset.json', }, }, DCTERMS.Agent: { @@ -71,6 +82,9 @@ 'datacite-xml': 'project_full.datacite.xml', 'datacite-json': 'project_full.datacite.json', 'google-dataset-json-ld': 'project_full.google-dataset.json', + + 'linkset': 'project_full.linkset', + 'linkset-json': 'project_full.linkset.json', }, OsfmapPartition.SUPPLEMENT: { 'turtle': 'project_supplement.turtle', @@ -85,6 +99,9 @@ 'datacite-xml': 'preprint_full.datacite.xml', 'datacite-json': 'preprint_full.datacite.json', 'google-dataset-json-ld': 'preprint_full.google-dataset.json', + + 'linkset': 'preprint_full.linkset', + 'linkset-json': 'preprint_full.linkset.json', }, OsfmapPartition.SUPPLEMENT: { 'turtle': 'preprint_supplement.turtle', @@ -99,6 +116,9 @@ 'datacite-xml': 'registration_full.datacite.xml', 'datacite-json': 'registration_full.datacite.json', 'google-dataset-json-ld': 'registration_full.google-dataset.json', + + 'linkset': 'registration_full.linkset', + 'linkset-json': 'registration_full.linkset.json', }, OsfmapPartition.SUPPLEMENT: { 'turtle': 'registration_supplement.turtle', @@ -113,6 +133,8 @@ 'datacite-xml': 'file_full.datacite.xml', 'datacite-json': 'file_full.datacite.json', 'google-dataset-json-ld': 'file_full.google-dataset.json', + 'linkset': 'file_full.linkset', + 'linkset-json': 'file_full.linkset.json', }, OsfmapPartition.SUPPLEMENT: { 'turtle': 'file_supplement.turtle', @@ -139,6 +161,8 @@ 'datacite-xml': 'application/xml', 'datacite-json': 'application/json', 'google-dataset-json-ld': 'application/ld+json', + 'linkset': 'application/linkset', + 'linkset-json': 'application/linkset+json', } @@ -328,10 +352,10 @@ def _setUp_full(self): 'award_number': '2000000', 'award_uri': 'https://moneypockets.example/millions-more', 'award_title': 'because reasons!', - }, { # no award info, just a funder: + }, { # no award info, just a funder with ROR identifier: 'funder_name': 'Caring Fan', - 'funder_identifier': 'https://doi.org/10.$', - 'funder_identifier_type': 'Crossref Funder ID', + 'funder_identifier': 'https://ror.org/0example', + 'funder_identifier_type': 'ROR', 'award_number': '', 'award_uri': '', 'award_title': '', diff --git a/osf_tests/test_archiver.py b/osf_tests/test_archiver.py index 1e4ece0b016..1987c1088ee 100644 --- a/osf_tests/test_archiver.py +++ b/osf_tests/test_archiver.py @@ -20,7 +20,7 @@ from website.archiver import listeners from website.archiver.tasks import * # noqa: F403 -from osf.models import Guid, RegistrationSchema, Registration, NotificationType +from osf.models import Guid, RegistrationSchema, Registration, NotificationTypeEnum from osf.models.archive import ArchiveTarget, ArchiveJob from osf.models.base import generate_object_id from osf.utils.migrations import map_schema_to_schemablocks @@ -735,8 +735,8 @@ def test_handle_archive_fail(self): {} ) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.DESK_ARCHIVE_JOB_COPY_ERROR - assert notifications['emits'][1]['type'] == NotificationType.Type.USER_ARCHIVE_JOB_COPY_ERROR + assert notifications['emits'][0]['type'] == NotificationTypeEnum.DESK_ARCHIVE_JOB_COPY_ERROR + assert notifications['emits'][1]['type'] == NotificationTypeEnum.USER_ARCHIVE_JOB_COPY_ERROR assert notifications['emits'][0]['kwargs']['destination_address'] == settings.OSF_SUPPORT_EMAIL assert notifications['emits'][1]['kwargs']['user'] == self.user self.dst.reload() @@ -752,8 +752,8 @@ def test_handle_archive_fail_copy(self): {} ) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.DESK_ARCHIVE_JOB_COPY_ERROR - assert notifications['emits'][1]['type'] == NotificationType.Type.USER_ARCHIVE_JOB_COPY_ERROR + assert notifications['emits'][0]['type'] == NotificationTypeEnum.DESK_ARCHIVE_JOB_COPY_ERROR + assert notifications['emits'][1]['type'] == NotificationTypeEnum.USER_ARCHIVE_JOB_COPY_ERROR assert notifications['emits'][0]['kwargs']['destination_address'] == settings.OSF_SUPPORT_EMAIL assert notifications['emits'][1]['kwargs']['user'] == self.user @@ -767,8 +767,8 @@ def test_handle_archive_fail_size(self): {} ) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.DESK_ARCHIVE_JOB_EXCEEDED - assert notifications['emits'][1]['type'] == NotificationType.Type.USER_ARCHIVE_JOB_EXCEEDED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.DESK_ARCHIVE_JOB_EXCEEDED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.USER_ARCHIVE_JOB_EXCEEDED assert notifications['emits'][0]['kwargs']['destination_address'] == settings.OSF_SUPPORT_EMAIL assert notifications['emits'][1]['kwargs']['user'] == self.user @@ -782,8 +782,8 @@ def test_handle_archive_uncaught_error(self): {} ) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.DESK_ARCHIVE_JOB_UNCAUGHT_ERROR - assert notifications['emits'][1]['type'] == NotificationType.Type.USER_ARCHIVE_JOB_UNCAUGHT_ERROR + assert notifications['emits'][0]['type'] == NotificationTypeEnum.DESK_ARCHIVE_JOB_UNCAUGHT_ERROR + assert notifications['emits'][1]['type'] == NotificationTypeEnum.USER_ARCHIVE_JOB_UNCAUGHT_ERROR assert notifications['emits'][0]['kwargs']['destination_address'] == settings.OSF_SUPPORT_EMAIL assert notifications['emits'][1]['kwargs']['user'] == self.user diff --git a/osf_tests/test_collection.py b/osf_tests/test_collection.py index 5eba83ac530..1dd1b3473b9 100644 --- a/osf_tests/test_collection.py +++ b/osf_tests/test_collection.py @@ -5,7 +5,7 @@ from framework.auth import Auth -from osf.models import Collection, NotificationType +from osf.models import Collection, NotificationTypeEnum from osf.exceptions import NodeStateError from tests.utils import capture_notifications from website.views import find_bookmark_collection @@ -134,7 +134,7 @@ def test_node_removed_from_collection_on_privacy_change_notify(self, auth, provi with capture_notifications() as notifications: provider_collected_node.set_privacy('private', auth=auth) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_PRIVATE + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_PRIVATE @mock.patch('osf.models.node.Node.check_privacy_change_viability', mock.Mock()) # mocks the storage usage limits def test_node_removed_from_collection_on_privacy_change_no_provider(self, auth, collected_node, bookmark_collection): diff --git a/osf_tests/test_collection_submission.py b/osf_tests/test_collection_submission.py index 478a437f5a5..2b661f00873 100644 --- a/osf_tests/test_collection_submission.py +++ b/osf_tests/test_collection_submission.py @@ -8,7 +8,7 @@ from osf_tests.factories import NodeFactory, CollectionFactory, CollectionProviderFactory -from osf.models import CollectionSubmission, NotificationType +from osf.models import CollectionSubmission, NotificationTypeEnum from osf.utils.workflows import CollectionSubmissionStates from framework.exceptions import PermissionsError from api_tests.utils import UserRoles @@ -165,8 +165,8 @@ def test_notify_contributors_pending(self, node, moderated_collection): ) collection_submission.save() assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_SUBMITTED - assert notifications['emits'][1]['type'] == NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_SUBMITTED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS assert collection_submission.state == CollectionSubmissionStates.PENDING def test_notify_moderators_pending(self, node, moderated_collection): @@ -179,8 +179,8 @@ def test_notify_moderators_pending(self, node, moderated_collection): ) collection_submission.save() assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_SUBMITTED - assert notifications['emits'][1]['type'] == NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_SUBMITTED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS assert collection_submission.state == CollectionSubmissionStates.PENDING @pytest.mark.parametrize('user_role', [UserRoles.UNAUTHENTICATED, UserRoles.NONCONTRIB]) @@ -201,7 +201,7 @@ def test_notify_moderated_accepted(self, node, moderated_collection_submission): with capture_notifications() as notifications: moderated_collection_submission.accept(user=moderator, comment='Test Comment') assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_ACCEPTED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_ACCEPTED assert moderated_collection_submission.state == CollectionSubmissionStates.ACCEPTED @@ -224,7 +224,7 @@ def test_notify_moderated_rejected(self, node, moderated_collection_submission): with capture_notifications() as notifications: moderated_collection_submission.reject(user=moderator, comment='Test Comment') assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REJECTED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REJECTED assert moderated_collection_submission.state == CollectionSubmissionStates.REJECTED @@ -253,7 +253,7 @@ def test_notify_moderated_removed_moderator(self, node, moderated_collection_sub with capture_notifications() as notifications: moderated_collection_submission.remove(user=moderator, comment='Test Comment') assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_MODERATOR + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_MODERATOR assert moderated_collection_submission.state == CollectionSubmissionStates.REMOVED @@ -264,8 +264,8 @@ def test_notify_moderated_removed_admin(self, node, moderated_collection_submiss with capture_notifications() as notifications: moderated_collection_submission.remove(user=moderator, comment='Test Comment') assert len(notifications['emits']) == 2 - assert notifications['emits'][1]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_ADMIN - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_ADMIN + assert notifications['emits'][1]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_ADMIN + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_ADMIN assert moderated_collection_submission.state == CollectionSubmissionStates.REMOVED @@ -350,8 +350,8 @@ def test_notify_moderated_removed_admin(self, node, unmoderated_collection_submi with capture_notifications() as notifications: unmoderated_collection_submission.remove(user=moderator, comment='Test Comment') assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_ADMIN - assert notifications['emits'][1]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_ADMIN + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_ADMIN + assert notifications['emits'][1]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_ADMIN assert unmoderated_collection_submission.state == CollectionSubmissionStates.REMOVED def test_resubmit_success(self, node, unmoderated_collection_submission): @@ -454,7 +454,7 @@ def test_notify_moderated_accepted(self, node, hybrid_moderated_collection_submi with capture_notifications() as notifications: hybrid_moderated_collection_submission.accept(user=moderator, comment='Test Comment') assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_ACCEPTED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_ACCEPTED assert hybrid_moderated_collection_submission.state == CollectionSubmissionStates.ACCEPTED @pytest.mark.parametrize('user_role', [UserRoles.UNAUTHENTICATED, UserRoles.NONCONTRIB]) @@ -476,7 +476,7 @@ def test_notify_moderated_rejected(self, node, hybrid_moderated_collection_submi with capture_notifications() as notifications: hybrid_moderated_collection_submission.reject(user=moderator, comment='Test Comment') assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REJECTED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REJECTED assert hybrid_moderated_collection_submission.state == CollectionSubmissionStates.REJECTED @pytest.mark.parametrize('user_role', UserRoles.excluding(*[UserRoles.ADMIN_USER, UserRoles.MODERATOR])) @@ -504,7 +504,7 @@ def test_notify_moderated_removed_moderator(self, node, hybrid_moderated_collect with capture_notifications() as notifications: hybrid_moderated_collection_submission.remove(user=moderator, comment='Test Comment') assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_MODERATOR + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_MODERATOR assert hybrid_moderated_collection_submission.state == CollectionSubmissionStates.REMOVED def test_notify_moderated_removed_admin(self, node, hybrid_moderated_collection_submission): @@ -514,8 +514,8 @@ def test_notify_moderated_removed_admin(self, node, hybrid_moderated_collection_ with capture_notifications() as notifications: hybrid_moderated_collection_submission.remove(user=moderator, comment='Test Comment') assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_ADMIN - assert notifications['emits'][1]['type'] == NotificationType.Type.COLLECTION_SUBMISSION_REMOVED_ADMIN + assert notifications['emits'][0]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_ADMIN + assert notifications['emits'][1]['type'] == NotificationTypeEnum.COLLECTION_SUBMISSION_REMOVED_ADMIN assert hybrid_moderated_collection_submission.state == CollectionSubmissionStates.REMOVED diff --git a/osf_tests/test_institution.py b/osf_tests/test_institution.py index b0575d02fe6..039b0ce04dd 100644 --- a/osf_tests/test_institution.py +++ b/osf_tests/test_institution.py @@ -4,7 +4,7 @@ import pytest from addons.osfstorage.models import Region -from osf.models import Institution, InstitutionStorageRegion, NotificationType +from osf.models import Institution, InstitutionStorageRegion, NotificationTypeEnum from osf_tests.factories import ( AuthUserFactory, InstitutionFactory, @@ -157,8 +157,8 @@ def test_send_deactivation_email_call_count(self): with capture_notifications() as notifications: institution._send_deactivation_email() assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_INSTITUTION_DEACTIVATION - assert notifications['emits'][1]['type'] == NotificationType.Type.USER_INSTITUTION_DEACTIVATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_INSTITUTION_DEACTIVATION + assert notifications['emits'][1]['type'] == NotificationTypeEnum.USER_INSTITUTION_DEACTIVATION def test_send_deactivation_email_call_args(self): institution = InstitutionFactory() @@ -168,7 +168,7 @@ def test_send_deactivation_email_call_args(self): with capture_notifications() as notifications: institution._send_deactivation_email() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_INSTITUTION_DEACTIVATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_INSTITUTION_DEACTIVATION def test_deactivate_inactive_institution_noop(self): institution = InstitutionFactory() diff --git a/osf_tests/test_institutional_admin_contributors.py b/osf_tests/test_institutional_admin_contributors.py index 8f4c7fad1c1..ad9f7075832 100644 --- a/osf_tests/test_institutional_admin_contributors.py +++ b/osf_tests/test_institutional_admin_contributors.py @@ -2,7 +2,7 @@ from unittest import mock -from osf.models import Contributor, NotificationType +from osf.models import Contributor, NotificationTypeEnum from osf_tests.factories import ( AuthUserFactory, ProjectFactory, @@ -142,7 +142,7 @@ def test_requested_permissions_or_default(self, app, project, institutional_admi auth=mock.ANY, permissions=permissions.ADMIN, # `requested_permissions` should take precedence visible=True, - notification_type=NotificationType.Type.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST, + notification_type=NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST, make_curator=False, ) @@ -168,7 +168,7 @@ def test_permissions_override_requested_permissions(self, app, project, institut auth=mock.ANY, permissions=permissions.ADMIN, # `requested_permissions` should take precedence visible=True, - notification_type=NotificationType.Type.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST, + notification_type=NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST, make_curator=False, ) @@ -194,6 +194,6 @@ def test_requested_permissions_is_used(self, app, project, institutional_admin): auth=mock.ANY, permissions=permissions.ADMIN, # `requested_permissions` should take precedence visible=True, - notification_type=NotificationType.Type.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST, + notification_type=NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST, make_curator=False, ) diff --git a/osf_tests/test_merging_users.py b/osf_tests/test_merging_users.py index f0d1c1069ca..e505b5580e3 100644 --- a/osf_tests/test_merging_users.py +++ b/osf_tests/test_merging_users.py @@ -19,7 +19,7 @@ ) from importlib import import_module from django.conf import settings as django_conf_settings -from osf.models import UserSessionMap, NotificationType +from osf.models import UserSessionMap, NotificationTypeEnum from tests.utils import run_celery_tasks, capture_notifications from waffle.testutils import override_flag from osf.features import ENABLE_GV @@ -300,5 +300,5 @@ def test_send_confirm_email_emits_merge_notification(self): with capture_notifications() as notifications: send_confirm_email(merger, target_email) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_CONFIRM_MERGE + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_CONFIRM_MERGE assert notifications['emits'][0]['kwargs']['destination_address'] == target_email diff --git a/osf_tests/test_node.py b/osf_tests/test_node.py index e6c9424b51d..98447188a8b 100644 --- a/osf_tests/test_node.py +++ b/osf_tests/test_node.py @@ -34,7 +34,7 @@ NodeRelation, Registration, DraftRegistration, - CollectionSubmission, NotificationType + CollectionSubmission, NotificationTypeEnum ) from addons.wiki.models import WikiPage, WikiVersion @@ -2150,7 +2150,7 @@ def test_set_privacy(self, node, auth): with capture_notifications() as notifications: node.set_privacy('public', auth=auth) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_NEW_PUBLIC_PROJECT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_NEW_PUBLIC_PROJECT assert node.logs.first().action == NodeLog.MADE_PUBLIC assert last_logged_before_method_call != node.last_logged node.save() @@ -2171,7 +2171,7 @@ def test_set_privacy_sends_mail(self, node, auth): node.set_privacy('private', auth=auth) node.set_privacy('public', auth=auth, meeting_creation=False) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_NEW_PUBLIC_PROJECT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_NEW_PUBLIC_PROJECT def test_set_privacy_can_not_cancel_pending_embargo_for_registration(self, node, user, auth): registration = RegistrationFactory(project=node) diff --git a/osf_tests/test_registration_moderation_notifications.py b/osf_tests/test_registration_moderation_notifications.py index ca16b4eb993..5516344a2b1 100644 --- a/osf_tests/test_registration_moderation_notifications.py +++ b/osf_tests/test_registration_moderation_notifications.py @@ -6,7 +6,7 @@ from notifications.tasks import send_users_digest_email from osf.management.commands.populate_notification_types import populate_notification_types from osf.migrations import update_provider_auth_groups -from osf.models import Brand, NotificationSubscription, NotificationType +from osf.models import Brand, NotificationSubscription, NotificationTypeEnum from osf.models.action import RegistrationAction from osf.utils.notifications import ( notify_submit, @@ -135,11 +135,11 @@ def test_submit_notifications(self, registration, moderator, admin, contrib, pro notify_submit(registration, admin) assert len(notification['emits']) == 3 - assert notification['emits'][0]['type'] == NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION + assert notification['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION assert notification['emits'][0]['kwargs']['user'] == admin - assert notification['emits'][1]['type'] == NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION + assert notification['emits'][1]['type'] == NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION assert notification['emits'][1]['kwargs']['user'] == contrib - assert notification['emits'][2]['type'] == NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS + assert notification['emits'][2]['type'] == NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS assert NotificationSubscription.objects.count() == 7 digest = NotificationSubscription.objects.last() assert digest.user == moderator diff --git a/osf_tests/test_reviewable.py b/osf_tests/test_reviewable.py index f3627d1faf2..954abd6ee1f 100644 --- a/osf_tests/test_reviewable.py +++ b/osf_tests/test_reviewable.py @@ -1,7 +1,7 @@ from unittest import mock import pytest -from osf.models import Preprint, NotificationType +from osf.models import Preprint, NotificationTypeEnum from osf.utils.workflows import DefaultStates from osf_tests.factories import PreprintFactory, AuthUserFactory from tests.utils import capture_notifications @@ -48,7 +48,7 @@ def test_reject_resubmission_sends_emails(self): with capture_notifications() as notifications: preprint.run_submit(user) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION assert preprint.machine_state == DefaultStates.PENDING.value assert not user.notification_subscriptions.exists() @@ -59,5 +59,5 @@ def test_reject_resubmission_sends_emails(self): with capture_notifications() as notifications: preprint.run_submit(user) # Resubmission alerts users and moderators assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_REVIEWS_RESUBMISSION_CONFIRMATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_REVIEWS_RESUBMISSION_CONFIRMATION assert preprint.machine_state == DefaultStates.PENDING.value diff --git a/osf_tests/test_schema_responses.py b/osf_tests/test_schema_responses.py index 958150aee76..c087c6f514e 100644 --- a/osf_tests/test_schema_responses.py +++ b/osf_tests/test_schema_responses.py @@ -3,7 +3,7 @@ from api.providers.workflows import Workflows from framework.exceptions import PermissionsError from osf.exceptions import PreviousSchemaResponseError, SchemaResponseStateError, SchemaResponseUpdateError -from osf.models import RegistrationSchema, RegistrationSchemaBlock, SchemaResponseBlock, NotificationType +from osf.models import RegistrationSchema, RegistrationSchemaBlock, SchemaResponseBlock, NotificationTypeEnum from osf.models import schema_response # import module for mocking purposes from osf.utils.workflows import ApprovalStates, SchemaResponseTriggers from osf_tests.factories import AuthUserFactory, ProjectFactory, RegistrationFactory, RegistrationProviderFactory @@ -259,7 +259,7 @@ def test_create_from_previous_response_notification( initiator=admin_user ) assert len(notifications['emits']) == len(notification_recipients) - assert all(notification['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_INITIATED + assert all(notification['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_INITIATED for notification in notifications['emits']) assert all(notification['kwargs']['user'].username in notification_recipients for notification in notifications['emits']) @@ -588,9 +588,9 @@ def test_submit_response_notification( with capture_notifications() as notifications: revised_response.submit(user=admin_user, required_approvers=[admin_user]) assert len(notifications['emits']) == 3 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_SUBMITTED - assert notifications['emits'][1]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_SUBMITTED - assert notifications['emits'][2]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_SUBMITTED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_SUBMITTED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_SUBMITTED + assert notifications['emits'][2]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_SUBMITTED def test_no_submit_notification_on_initial_response(self, initial_response, admin_user): initial_response.approvals_state_machine.set_state(ApprovalStates.IN_PROGRESS) @@ -752,7 +752,7 @@ def test_reject_response_notification( with capture_notifications() as notifications: revised_response.reject(user=admin_user) assert len(notifications['emits']) == 3 - assert all(notification['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_REJECTED + assert all(notification['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_REJECTED for notification in notifications['emits']) def test_no_reject_notification_on_initial_response(self, initial_response, admin_user): @@ -861,9 +861,9 @@ def test_accept_notification_sent_on_admin_approval(self, revised_response, admi revised_response.approve(user=admin_user) assert len(notifications['emits']) == 2 assert notifications['emits'][0]['kwargs']['user'] == moderator - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS assert notifications['emits'][1]['kwargs']['user'] == admin_user - assert notifications['emits'][1]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_APPROVED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_APPROVED def test_moderators_notified_on_admin_approval(self, revised_response, admin_user, moderator): revised_response.approvals_state_machine.set_state(ApprovalStates.UNAPPROVED) @@ -874,9 +874,9 @@ def test_moderators_notified_on_admin_approval(self, revised_response, admin_use revised_response.approve(user=admin_user) assert len(notifications['emits']) == 2 assert notifications['emits'][0]['kwargs']['user'] == moderator - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS assert notifications['emits'][1]['kwargs']['user'] == admin_user - assert notifications['emits'][1]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_APPROVED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_APPROVED def test_no_moderator_notification_on_admin_approval_of_initial_response( self, initial_response, admin_user): @@ -914,9 +914,9 @@ def test_moderator_accept_notification( with capture_notifications() as notifications: revised_response.accept(user=moderator) assert len(notifications['emits']) == 3 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_APPROVED - assert notifications['emits'][1]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_APPROVED - assert notifications['emits'][2]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_APPROVED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_APPROVED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_APPROVED + assert notifications['emits'][2]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_APPROVED def test_no_moderator_accept_notification_on_initial_response( self, initial_response, moderator): @@ -954,9 +954,9 @@ def test_moderator_reject_notification( with capture_notifications() as notifications: revised_response.reject(user=moderator) assert len(notifications['emits']) == 3 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_REJECTED - assert notifications['emits'][1]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_REJECTED - assert notifications['emits'][2]['type'] == NotificationType.Type.NODE_SCHEMA_RESPONSE_REJECTED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_REJECTED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_REJECTED + assert notifications['emits'][2]['type'] == NotificationTypeEnum.NODE_SCHEMA_RESPONSE_REJECTED def test_no_moderator_reject_notification_on_initial_response( self, initial_response, moderator): diff --git a/osf_tests/test_user.py b/osf_tests/test_user.py index 1846652f66a..2e5d0631cd4 100644 --- a/osf_tests/test_user.py +++ b/osf_tests/test_user.py @@ -32,7 +32,7 @@ PreprintContributor, DraftRegistrationContributor, UserSessionMap, - NotificationType, + NotificationTypeEnum, ) from osf.models.institution_affiliation import get_user_by_institution_identity from addons.github.tests.factories import GitHubAccountFactory @@ -946,7 +946,7 @@ def test_set_password_notify_default(self, user): user.save() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_PASSWORD_RESET + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_PASSWORD_RESET def test_set_password_no_notify(self, user): old_password = 'password' diff --git a/package.json b/package.json index fe7ef44be4c..9e322c164b5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "OSF", - "version": "26.1.6", + "version": "26.5.0", "description": "Facilitating Open Science", "repository": "https://github.com/CenterForOpenScience/osf.io", "author": "Center for Open Science", diff --git a/pyproject.toml b/pyproject.toml index d9973dae373..b1646584209 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "osf-io" -version = "24.05.2" +version = "26.5.0" description = "The code for [https://osf.io](https://osf.io)." authors = ["Your Name "] license = "Apache License 2.0" diff --git a/scripts/disable_removed_beat_tasks.py b/scripts/disable_removed_beat_tasks.py new file mode 100644 index 00000000000..9a455716e85 --- /dev/null +++ b/scripts/disable_removed_beat_tasks.py @@ -0,0 +1,24 @@ +from framework.celery_tasks import app as celery_app +from website import settings +from django.db.models import Q +from django_celery_beat.models import PeriodicTask, PeriodicTasks + + +@celery_app.task(name='scripts.disable_removed_beat_tasks') +def disable_removed_beat_tasks(): + """ + Disable django-celery-beat PeriodicTask entries that no longer exist + and re-enable those that do exist, based on the current CeleryConfig.beat_schedule. + """ + + beat_schedule_keys = settings.CeleryConfig.beat_schedule.keys() if hasattr(settings.CeleryConfig, 'beat_schedule') else None + if not beat_schedule_keys: + return + + desired_task_names = set(beat_schedule_keys) | {'celery.backend_cleanup'} # Built-in backend cleanup task + + qs_disable = PeriodicTask.objects.filter(~Q(name__in=desired_task_names)) + qs_disable.update(enabled=False) + qs_enable = PeriodicTask.objects.filter(name__in=desired_task_names) + qs_enable.update(enabled=True) + PeriodicTasks.update_changed() # Notify django-celery-beat of the changes diff --git a/scripts/osfstorage/usage_audit.py b/scripts/osfstorage/usage_audit.py index d3f555aab75..49003c56fdc 100644 --- a/scripts/osfstorage/usage_audit.py +++ b/scripts/osfstorage/usage_audit.py @@ -19,7 +19,7 @@ from framework.celery_tasks import app as celery_app -from osf.models import TrashedFile, Node, NotificationType +from osf.models import TrashedFile, Node, NotificationTypeEnum from website.app import init_app from website.settings.defaults import GBs @@ -110,7 +110,7 @@ def main(send_email=False): if lines: if send_email: logger.info('Sending email...') - NotificationType.Type.EMPTY.instance.emit( + NotificationTypeEnum.EMPTY.instance.emit( destination_address='support+scripts@osf.io', event_context={ 'body': '\n'.join(lines), diff --git a/scripts/populate_notification_subscriptions.py b/scripts/populate_notification_subscriptions.py deleted file mode 100644 index 557b9f2a47d..00000000000 --- a/scripts/populate_notification_subscriptions.py +++ /dev/null @@ -1,113 +0,0 @@ -import django -django.setup() - -from website.app import init_app -init_app(routes=False) - -from framework.celery_tasks import app as celery_app -from django.contrib.contenttypes.models import ContentType -from django.db.models import Count, F, OuterRef, Subquery, IntegerField, CharField -from django.db.models.functions import Cast -from osf.models import OSFUser, Node, NotificationSubscription, NotificationType - - -@celery_app.task(name='scripts.populate_notification_subscriptions') -def populate_notification_subscriptions(): - created = 0 - user_file_nt = NotificationType.Type.USER_FILE_UPDATED.instance - review_nt = NotificationType.Type.REVIEWS_SUBMISSION_STATUS.instance - node_file_nt = NotificationType.Type.NODE_FILE_UPDATED.instance - - user_ct = ContentType.objects.get_for_model(OSFUser) - node_ct = ContentType.objects.get_for_model(Node) - - reviews_qs = OSFUser.objects.exclude(subscriptions__notification_type__name=NotificationType.Type.REVIEWS_SUBMISSION_STATUS).distinct('id') - files_qs = OSFUser.objects.exclude(subscriptions__notification_type__name=NotificationType.Type.USER_FILE_UPDATED).distinct('id') - - node_notifications_sq = ( - NotificationSubscription.objects.filter( - content_type=node_ct, - notification_type=node_file_nt, - object_id=Cast(OuterRef('pk'), CharField()), - ).values( - 'object_id' - ).annotate( - cnt=Count('id') - ).values('cnt')[:1] - ) - - nodes_qs = ( - Node.objects - .annotate( - contributors_count=Count('_contributors', distinct=True), - notifications_count=Subquery( - node_notifications_sq, - output_field=IntegerField(), - ), - ).exclude(contributors_count=F('notifications_count')) - ) - - print(f"Creating REVIEWS_SUBMISSION_STATUS subscriptions for {reviews_qs.count()} users.") - for id, user in enumerate(reviews_qs, 1): - print(f"Processing user {id} / {reviews_qs.count()}") - try: - _, is_created = NotificationSubscription.objects.get_or_create( - notification_type=review_nt, - user=user, - content_type=user_ct, - object_id=user.id, - defaults={ - 'message_frequency': 'none', - }, - ) - if is_created: - created += 1 - except Exception as exeption: - print(exeption) - continue - - print(f"Creating USER_FILE_UPDATED subscriptions for {files_qs.count()} users.") - for id, user in enumerate(files_qs, 1): - print(f"Processing user {id} / {files_qs.count()}") - try: - _, is_created = NotificationSubscription.objects.get_or_create( - notification_type=user_file_nt, - user=user, - content_type=user_ct, - object_id=user.id, - defaults={ - '_is_digest': True, - 'message_frequency': 'none', - }, - ) - if is_created: - created += 1 - except Exception as exeption: - print(exeption) - continue - - print(f"Creating NODE_FILE_UPDATED subscriptions for {nodes_qs.count()} nodes.") - for id, node in enumerate(nodes_qs, 1): - print(f"Processing node {id} / {nodes_qs.count()}") - for contributor in node.contributors.all(): - try: - _, is_created = NotificationSubscription.objects.get_or_create( - notification_type=node_file_nt, - user=contributor, - content_type=node_ct, - object_id=node.id, - defaults={ - '_is_digest': True, - 'message_frequency': 'none', - }, - ) - if is_created: - created += 1 - except Exception as exeption: - print(exeption) - continue - - print(f"Created {created} subscriptions") - -if __name__ == '__main__': - populate_notification_subscriptions.delay() diff --git a/scripts/remove_after_use/merge_notification_subscription_provider_ct.py b/scripts/remove_after_use/merge_notification_subscription_provider_ct.py new file mode 100644 index 00000000000..50da93b2669 --- /dev/null +++ b/scripts/remove_after_use/merge_notification_subscription_provider_ct.py @@ -0,0 +1,31 @@ +import django +django.setup() + +from website.app import init_app +init_app(routes=False) + +from django.contrib.contenttypes.models import ContentType +from framework.celery_tasks import app as celery_app +from osf.models import NotificationSubscription + + +@celery_app.task(name='scripts.remove_after_use.merge_notification_subscription_provider_ct') +def merge_notification_subscription_provider_ct(): + + abstract_provider_ct = ContentType.objects.get_by_natural_key('osf', 'abstractprovider') + + provider_ct_list = [ + ContentType.objects.get_by_natural_key('osf', 'preprintprovider'), + ContentType.objects.get_by_natural_key('osf', 'registrationprovider'), + ContentType.objects.get_by_natural_key('osf', 'collectionprovider'), + ] + subscriptions = NotificationSubscription.objects.filter( + content_type__in=provider_ct_list + ) + subscriptions.update( + content_type=abstract_provider_ct + ) + + +if __name__ == '__main__': + merge_notification_subscription_provider_ct.delay() diff --git a/scripts/remove_after_use/populate_notification_subscriptions_node_file_updated.py b/scripts/remove_after_use/populate_notification_subscriptions_node_file_updated.py new file mode 100644 index 00000000000..61625ce6b1f --- /dev/null +++ b/scripts/remove_after_use/populate_notification_subscriptions_node_file_updated.py @@ -0,0 +1,128 @@ +import django +django.setup() + +from website.app import init_app +init_app(routes=False) + +from datetime import datetime +from framework.celery_tasks import app as celery_app +from django.contrib.contenttypes.models import ContentType +from django.db.models import Count, F, OuterRef, Subquery, IntegerField, CharField +from django.db.models.functions import Cast, Coalesce +from osf.models import Node, NotificationSubscription, NotificationTypeEnum + + +@celery_app.task(name='scripts.remove_after_use.populate_notification_subscriptions_node_file_updated') +def populate_notification_subscriptions_node_file_updated(batch_size: int = 1000): + print('---Starting NODE_FILE_UPDATED subscriptions population script----') + global_start = datetime.now() + + node_file_nt = NotificationTypeEnum.NODE_FILE_UPDATED + + node_ct = ContentType.objects.get_for_model(Node) + + node_notifications_sq = ( + NotificationSubscription.objects.filter( + content_type=node_ct, + notification_type=node_file_nt.instance, + object_id=Cast(OuterRef('pk'), CharField()), + ).values( + 'object_id' + ).annotate( + cnt=Count('id') + ).values('cnt')[:1] + ) + + nodes_qs = ( + Node.objects + .filter(is_deleted=False) + .annotate( + contributors_count=Count('_contributors', distinct=True), + notifications_count=Coalesce( + Subquery( + node_notifications_sq, + output_field=IntegerField(), + ), + 0 + ), + ).exclude(contributors_count=F('notifications_count')) + ).iterator(chunk_size=batch_size) + + items_to_create = [] + total_created = 0 + batch_start = datetime.now() + count_nodes = 0 + count_contributors = 0 + for node in nodes_qs: + count_nodes += 1 + for contributor in node.contributors.all(): + count_contributors += 1 + items_to_create.append( + NotificationSubscription( + notification_type=node_file_nt.instance, + user=contributor, + content_type=node_ct, + object_id=node.id, + _is_digest=True, + message_frequency='none', + ) + ) + if len(items_to_create) >= batch_size: + print(f'Creating batch of {len(items_to_create)} subscriptions...') + try: + NotificationSubscription.objects.bulk_create( + items_to_create, + batch_size=batch_size, + ignore_conflicts=True, + ) + total_created += len(items_to_create) + items_to_create = [] + except Exception as exeption: + print(f"Error during bulk_create: {exeption}") + continue + finally: + items_to_create.clear() + batch_end = datetime.now() + print(f'Batch took {batch_end - batch_start}') + + if count_contributors % batch_size == 0: + print(f'Processed {count_nodes} nodes with {count_contributors} contributors, created {total_created} subscriptions') + batch_start = datetime.now() + + if items_to_create: + final_batch_start = datetime.now() + print(f'Creating final batch of {len(items_to_create)} subscriptions...') + try: + NotificationSubscription.objects.bulk_create( + items_to_create, + batch_size=batch_size, + ignore_conflicts=True, + ) + total_created += len(items_to_create) + except Exception as exeption: + print(f"Error during bulk_create: {exeption}") + final_batch_end = datetime.now() + print(f'Final batch took {final_batch_end - final_batch_start}') + + global_end = datetime.now() + print(f'Total time for NODE_FILE_UPDATED subscription population: {global_end - global_start}') + print(f'Created {total_created} subscriptions.') + print('----Creation finished----') + +@celery_app.task(name='scripts.remove_after_use.update_notification_subscriptions_node_file_updated') +def update_notification_subscriptions_node_file_updated(): + print('---Starting NODE_FILE_UPDATED subscriptions update script----') + + node_file_nt = NotificationTypeEnum.NODE_FILE_UPDATED + + updated_start = datetime.now() + updated = ( + NotificationSubscription.objects.filter( + notification_type__name=node_file_nt, + _is_digest=False, + ) + .update(_is_digest=True) + ) + updated_end = datetime.now() + print(f'Updated {updated} subscriptions. Took time: {updated_end - updated_start}') + print('Update finished.') diff --git a/scripts/remove_after_use/populate_notification_subscriptions_user_global_file_updated.py b/scripts/remove_after_use/populate_notification_subscriptions_user_global_file_updated.py new file mode 100644 index 00000000000..651143d6f8a --- /dev/null +++ b/scripts/remove_after_use/populate_notification_subscriptions_user_global_file_updated.py @@ -0,0 +1,111 @@ +import django +django.setup() + +from website.app import init_app +init_app(routes=False) + +from django.utils import timezone +from dateutil.relativedelta import relativedelta +from datetime import datetime +from framework.celery_tasks import app as celery_app +from django.contrib.contenttypes.models import ContentType +from osf.models import OSFUser, NotificationSubscription, NotificationTypeEnum + +@celery_app.task(name='scripts.remove_after_use.populate_notification_subscriptions_user_global_file_updated') +def populate_notification_subscriptions_user_global_file_updated(per_last_years: int | None= None, batch_size: int = 1000): + print('---Starting USER_FILE_UPDATED subscriptions population script----') + global_start = datetime.now() + + user_file_updated_nt = NotificationTypeEnum.USER_FILE_UPDATED + user_ct = ContentType.objects.get_for_model(OSFUser) + if per_last_years: + from_date = timezone.now() - relativedelta(years=per_last_years) + user_qs = (OSFUser.objects + .filter(date_last_login__gte=from_date) + .exclude(subscriptions__notification_type__name=user_file_updated_nt) + .distinct('id') + .order_by('id') + .iterator(chunk_size=batch_size) + ) + else: + user_qs = (OSFUser.objects + .exclude(subscriptions__notification_type__name=user_file_updated_nt) + .distinct('id') + .order_by('id') + .iterator(chunk_size=batch_size) + ) + + items_to_create = [] + total_created = 0 + + batch_start = datetime.now() + for count, user in enumerate(user_qs, 1): + items_to_create.append( + NotificationSubscription( + notification_type=user_file_updated_nt.instance, + user=user, + content_type=user_ct, + object_id=user.id, + _is_digest=True, + message_frequency='none', + ) + ) + if len(items_to_create) >= batch_size: + print(f'Creating batch of {len(items_to_create)} subscriptions...') + try: + NotificationSubscription.objects.bulk_create( + items_to_create, + batch_size=batch_size, + ignore_conflicts=True, + ) + total_created += len(items_to_create) + except Exception as e: + print(f'Error during bulk_create: {e}') + finally: + items_to_create.clear() + batch_end = datetime.now() + print(f'Batch took {batch_end - batch_start}') + + if count % batch_size == 0: + print(f'Processed {count}, created {total_created}') + batch_start = datetime.now() + + if items_to_create: + final_batch_start = datetime.now() + print(f'Creating final batch of {len(items_to_create)} subscriptions...') + try: + NotificationSubscription.objects.bulk_create( + items_to_create, + batch_size=batch_size, + ignore_conflicts=True, + ) + total_created += len(items_to_create) + except Exception as e: + print(f'Error during bulk_create: {e}') + final_batch_end = datetime.now() + print(f'Final batch took {final_batch_end - final_batch_start}') + + global_end = datetime.now() + print(f'Total time for USER_FILE_UPDATED subscription population: {global_end - global_start}') + print(f'Created {total_created} subscriptions.') + print('----Creation finished----') + +@celery_app.task(name='scripts.remove_after_use.update_notification_subscriptions_user_global_file_updated') +def update_notification_subscriptions_user_global_file_updated(): + print('---Starting USER_FILE_UPDATED subscriptions updating script----') + + user_file_updated_nt = NotificationTypeEnum.USER_FILE_UPDATED + + update_start = datetime.now() + updated = ( + NotificationSubscription.objects + .filter( + notification_type__name=user_file_updated_nt, + _is_digest=False, + ) + .update(_is_digest=True) + ) + update_end = datetime.now() + + print(f'Updated {updated} subscriptions. Took time: {update_end - update_start}') + print('Update finished.') diff --git a/scripts/remove_after_use/populate_notification_subscriptions_user_global_reviews.py b/scripts/remove_after_use/populate_notification_subscriptions_user_global_reviews.py new file mode 100644 index 00000000000..edfca287d0d --- /dev/null +++ b/scripts/remove_after_use/populate_notification_subscriptions_user_global_reviews.py @@ -0,0 +1,104 @@ +import django +django.setup() + +from website.app import init_app +init_app(routes=False) + +from django.utils import timezone +from dateutil.relativedelta import relativedelta +from datetime import datetime +from framework.celery_tasks import app as celery_app +from django.contrib.contenttypes.models import ContentType +from osf.models import OSFUser, NotificationSubscription, NotificationTypeEnum + + +@celery_app.task(name='scripts.remove_after_use.populate_notification_subscriptions_user_global_reviews') +def populate_notification_subscriptions_user_global_reviews(per_last_years: int | None = None, batch_size: int = 1000): + print('---Starting REVIEWS_SUBMISSION_STATUS subscriptions population script----') + global_start = datetime.now() + + review_nt = NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS + user_ct = ContentType.objects.get_for_model(OSFUser) + if per_last_years: + from_date = timezone.now() - relativedelta(years=per_last_years) + user_qs = OSFUser.objects.filter(date_last_login__gte=from_date).exclude( + subscriptions__notification_type__name=review_nt.instance + ).distinct('id') + else: + user_qs = OSFUser.objects.exclude( + subscriptions__notification_type__name=review_nt.instance + ).distinct('id') + + items_to_create = [] + total_created = 0 + + batch_start = datetime.now() + for count, user in enumerate(user_qs, 1): + items_to_create.append( + NotificationSubscription( + notification_type=review_nt.instance, + user=user, + content_type=user_ct, + object_id=user.id, + _is_digest=True, + message_frequency='none', + ) + ) + if len(items_to_create) >= batch_size: + print(f'Creating batch of {len(items_to_create)} subscriptions...') + try: + NotificationSubscription.objects.bulk_create( + items_to_create, + batch_size=batch_size, + ignore_conflicts=True, + ) + total_created += len(items_to_create) + except Exception as e: + print(f'Error during bulk_create: {e}') + finally: + items_to_create.clear() + batch_end = datetime.now() + print(f'Batch took {batch_end - batch_start}') + + if count % batch_size == 0: + print(f'Processed {count}, created {total_created}') + batch_start = datetime.now() + + if items_to_create: + final_batch_start = datetime.now() + print(f'Creating final batch of {len(items_to_create)} subscriptions...') + try: + NotificationSubscription.objects.bulk_create( + items_to_create, + batch_size=batch_size, + ignore_conflicts=True, + ) + total_created += len(items_to_create) + except Exception as e: + print(f'Error during bulk_create: {e}') + final_batch_end = datetime.now() + print(f'Final batch took {final_batch_end - final_batch_start}') + + global_end = datetime.now() + print(f'Total time for REVIEWS_SUBMISSION_STATUS subscription population: {global_end - global_start}') + print(f'Created {total_created} subscriptions.') + print('----Creation finished----') + +@celery_app.task(name='scripts.remove_after_use.update_notification_subscriptions_user_global_reviews') +def update_notification_subscriptions_user_global_reviews(): + print('---Starting REVIEWS_SUBMISSION_STATUS subscriptions updating script----') + + review_nt = NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS + + updated_start = datetime.now() + updated = ( + NotificationSubscription.objects.filter( + notification_type__name=review_nt, + _is_digest=False, + ) + .update(_is_digest=True) + ) + updated_end = datetime.now() + + print(f'Updated {updated} subscriptions. Took time: {updated_end - updated_start}') + print('Update finished.') diff --git a/scripts/stuck_registration_audit.py b/scripts/stuck_registration_audit.py index 36eca5e52ab..b9cdb53c27c 100644 --- a/scripts/stuck_registration_audit.py +++ b/scripts/stuck_registration_audit.py @@ -14,7 +14,7 @@ from framework.auth import Auth from framework.celery_tasks import app as celery_app from osf.management.commands import force_archive as fa -from osf.models import Registration, NotificationType +from osf.models import Registration, NotificationTypeEnum from website.settings import ADDONS_REQUESTED from scripts import utils as scripts_utils @@ -95,13 +95,12 @@ def main(): dict_writer.writeheader() dict_writer.writerows(broken_registrations) - NotificationType.Type.DESK_ARCHIVE_REGISTRATION_STUCK.instance.emit( + NotificationTypeEnum.DESK_ARCHIVE_REGISTRATION_STUCK.instance.emit( destination_address=settings.OSF_SUPPORT_EMAIL, event_context={ 'broken_registrations_count': len(broken_registrations), 'attachment_name': filename, 'attachement_content': output.getvalue(), - 'can_change_preferences': False } ) diff --git a/scripts/tests/test_deactivate_requested_accounts.py b/scripts/tests/test_deactivate_requested_accounts.py index d2adf6f76fe..fdc6233b920 100644 --- a/scripts/tests/test_deactivate_requested_accounts.py +++ b/scripts/tests/test_deactivate_requested_accounts.py @@ -1,6 +1,6 @@ import pytest -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from osf_tests.factories import ProjectFactory, AuthUserFactory from osf.management.commands.deactivate_requested_accounts import deactivate_requested_accounts @@ -30,7 +30,7 @@ def test_deactivate_user_with_no_content(self, user_requested_deactivation): with capture_notifications() as notifications: deactivate_requested_accounts(dry_run=False) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_REQUEST_DEACTIVATION_COMPLETE + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_REQUEST_DEACTIVATION_COMPLETE user_requested_deactivation.reload() assert user_requested_deactivation.requested_deactivation @@ -42,7 +42,7 @@ def test_deactivate_user_with_content(self, user_requested_deactivation_with_nod with capture_notifications() as notifications: deactivate_requested_accounts(dry_run=False) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.DESK_REQUEST_DEACTIVATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.DESK_REQUEST_DEACTIVATION user_requested_deactivation_with_node.reload() assert user_requested_deactivation_with_node.requested_deactivation diff --git a/scripts/tests/test_populate_new_and_noteworthy.py b/scripts/tests/test_populate_new_and_noteworthy.py index d2a66ef613d..dbe183930f4 100644 --- a/scripts/tests/test_populate_new_and_noteworthy.py +++ b/scripts/tests/test_populate_new_and_noteworthy.py @@ -36,6 +36,7 @@ def test_get_new_and_noteworthy_nodes(self): new_noteworthy = script.get_new_and_noteworthy_nodes(self.new_and_noteworthy_links_node) assert set(new_noteworthy) == self.all_ids + @mock.patch.object(script, 'NEW_AND_NOTEWORTHY_LINKS_NODE', NEW_AND_NOTEWORTHY_LINKS_NODE) def test_populate_new_and_noteworthy(self): assert self.new_and_noteworthy_links_node._nodes.count() == 0 diff --git a/scripts/triggered_mails.py b/scripts/triggered_mails.py index 4b56d12c5df..389a82c257f 100644 --- a/scripts/triggered_mails.py +++ b/scripts/triggered_mails.py @@ -2,11 +2,11 @@ import uuid from django.db import transaction -from django.db.models import Q, Exists, OuterRef +from django.db.models import Q, F from django.utils import timezone from framework.celery_tasks import app as celery_app -from osf.models import OSFUser, NotificationType +from osf.models import OSFUser, NotificationTypeEnum from website.app import init_app from website import settings from osf import features @@ -60,31 +60,38 @@ def find_inactive_users_without_enqueued_or_sent_no_login(): Match your original inactivity rules, but exclude users who already have a no_login EmailTask either pending, started, retrying, or already sent successfully. """ + now = timezone.now() - # Subquery: Is there already a not-yet-failed/aborted EmailTask for this user with our prefix? - existing_no_login = EmailTask.objects.filter( - user_id=OuterRef('pk'), - task_id__startswith=NO_LOGIN_PREFIX, - status__in=['PENDING', 'STARTED', 'RETRY', 'SUCCESS'], - ) cutoff_query = Q(date_last_login__gte=settings.NO_LOGIN_EMAIL_CUTOFF - settings.NO_LOGIN_WAIT_TIME) if settings.NO_LOGIN_EMAIL_CUTOFF else Q() base_q = OSFUser.objects.filter( cutoff_query, is_active=True, ).filter( Q( - date_last_login__lt=timezone.now() - settings.NO_LOGIN_WAIT_TIME, + date_last_login__lt=now - settings.NO_LOGIN_WAIT_TIME, # NOT tagged osf4m ) & ~Q(tags__name='osf4m') | Q( - date_last_login__lt=timezone.now() - settings.NO_LOGIN_OSF4M_WAIT_TIME, + date_last_login__lt=now - settings.NO_LOGIN_OSF4M_WAIT_TIME, tags__name='osf4m' ) ).distinct() - # Exclude users who already have a task for this email type - return base_q.annotate(_has_task=Exists(existing_no_login)).filter(_has_task=False) + # Exclude users who have already received a no-login email recently + base_q = base_q.filter( + Q(no_login_email_last_sent__isnull=True) | + ( + Q(no_login_email_last_sent__lt=now - settings.NO_LOGIN_WAIT_TIME) & + Q(no_login_email_last_sent__lt=F('date_last_login')) + ) + ) + # Exlude users who already have a pending/started/retrying EmailTask for no-login + base_q = base_q.exclude( + emailtask__task_id__startswith=NO_LOGIN_PREFIX, + emailtask__status__in=['PENDING', 'STARTED', 'RETRY'] + ) + return base_q @celery_app.task(name='scripts.triggered_no_login_email') @@ -124,7 +131,7 @@ def send_no_login_email(email_task_id: int): email_task.save() logger.warning(f'EmailTask {email_task.id}: user {user.id} is not active') return - NotificationType.Type.USER_NO_LOGIN.instance.emit( + NotificationTypeEnum.USER_NO_LOGIN.instance.emit( user=user, event_context={ 'user_fullname': user.fullname, @@ -133,6 +140,8 @@ def send_no_login_email(email_task_id: int): ) email_task.status = 'SUCCESS' email_task.save() + user.no_login_email_last_sent = timezone.now() + user.save() except Exception as exc: # noqa: BLE001 logger.exception(f'EmailTask {email_task.id}: error while sending') diff --git a/tests/identifiers/test_datacite.py b/tests/identifiers/test_datacite.py index ba432402a88..1a774ceea71 100644 --- a/tests/identifiers/test_datacite.py +++ b/tests/identifiers/test_datacite.py @@ -6,7 +6,7 @@ from django.utils import timezone from framework.auth import Auth -from osf.models import Outcome +from osf.models import GuidMetadataRecord, Outcome from osf.utils.outcomes import ArtifactTypes from osf_tests.factories import AuthUserFactory, IdentifierFactory, RegistrationFactory from tests.base import OsfTestCase @@ -300,6 +300,151 @@ def test_datacite_format_related_resources__ignores_inactive_resources(self, dat ] _assert_unordered_list_of_dicts_equal(metadata_dict['relatedIdentifiers'], expected_relationships) + def _set_funding_info(self, registration, funding_info): + metadata_record = GuidMetadataRecord.objects.for_guid(registration._id) + metadata_record.funding_info = funding_info + metadata_record.save() + + def test_datacite_funding_references_with_ror_identifier_xml(self, registration, datacite_client): + self._set_funding_info(registration, [ + { + 'funder_name': 'National Science Foundation', + 'funder_identifier': 'https://ror.org/021nxhr62', + 'funder_identifier_type': 'ROR', + }, + ]) + metadata_xml = datacite_client.build_metadata(registration) + parser = lxml.etree.XMLParser(ns_clean=True, recover=True, encoding='utf-8') + root = lxml.etree.fromstring(metadata_xml, parser=parser) + ns = schema40.ns[None] + + funding_refs = root.find(f'{{{ns}}}fundingReferences') + refs = funding_refs.findall(f'{{{ns}}}fundingReference') + assert len(refs) == 1 + + funder_name = refs[0].find(f'{{{ns}}}funderName') + assert funder_name.text == 'National Science Foundation' + + funder_id = refs[0].find(f'{{{ns}}}funderIdentifier') + assert funder_id.text == 'https://ror.org/021nxhr62' + assert funder_id.attrib['funderIdentifierType'] == 'ROR' + assert funder_id.attrib['schemeURI'] == 'https://ror.org/' + + def test_datacite_funding_references_with_ror_identifier_json(self, registration, datacite_client): + self._set_funding_info(registration, [ + { + 'funder_name': 'National Science Foundation', + 'funder_identifier': 'https://ror.org/021nxhr62', + 'funder_identifier_type': 'ROR', + }, + ]) + metadata_dict = datacite_client.build_metadata(registration, as_xml=False) + + funding_refs = metadata_dict['fundingReferences'] + assert len(funding_refs) == 1 + assert str(funding_refs[0]['funderName']) == 'National Science Foundation' + assert funding_refs[0]['funderIdentifier']['funderIdentifier'] == 'https://ror.org/021nxhr62' + assert funding_refs[0]['funderIdentifier']['funderIdentifierType'] == 'ROR' + assert funding_refs[0]['funderIdentifier']['schemeURI'] == 'https://ror.org/' + + def test_datacite_funding_references_with_crossref_funder_id(self, registration, datacite_client): + self._set_funding_info(registration, [ + { + 'funder_name': 'Mx. Moneypockets', + 'funder_identifier': 'https://doi.org/10.13039/100000001', + 'funder_identifier_type': 'Crossref Funder ID', + 'award_number': '10000000', + 'award_uri': 'https://moneypockets.example/millions', + 'award_title': 'because reasons', + }, + ]) + metadata_xml = datacite_client.build_metadata(registration) + parser = lxml.etree.XMLParser(ns_clean=True, recover=True, encoding='utf-8') + root = lxml.etree.fromstring(metadata_xml, parser=parser) + ns = schema40.ns[None] + + funding_refs = root.find(f'{{{ns}}}fundingReferences') + refs = funding_refs.findall(f'{{{ns}}}fundingReference') + assert len(refs) == 1 + + funder_id = refs[0].find(f'{{{ns}}}funderIdentifier') + assert funder_id.text == 'https://doi.org/10.13039/100000001' + assert funder_id.attrib['funderIdentifierType'] == 'Crossref Funder ID' + assert funder_id.attrib['schemeURI'] == 'https://www.crossref.org/services/funder-registry/' + + award_number = refs[0].find(f'{{{ns}}}awardNumber') + assert award_number.text == '10000000' + + def test_datacite_funding_references_mixed_ror_and_crossref(self, registration, datacite_client): + self._set_funding_info(registration, [ + { + 'funder_name': 'Mx. Moneypockets', + 'funder_identifier': 'https://doi.org/10.13039/100000001', + 'funder_identifier_type': 'Crossref Funder ID', + 'award_number': '10000000', + 'award_uri': 'https://moneypockets.example/millions', + 'award_title': 'because reasons', + }, + { + 'funder_name': 'National Science Foundation', + 'funder_identifier': 'https://ror.org/021nxhr62', + 'funder_identifier_type': 'ROR', + }, + ]) + metadata_dict = datacite_client.build_metadata(registration, as_xml=False) + funding_refs = metadata_dict['fundingReferences'] + assert len(funding_refs) == 2 + + # Build a lookup by funder name for order-independent assertions + refs_by_name = {str(ref['funderName']): ref for ref in funding_refs} + + crossref_ref = refs_by_name['Mx. Moneypockets'] + assert crossref_ref['funderIdentifier']['funderIdentifier'] == 'https://doi.org/10.13039/100000001' + assert crossref_ref['funderIdentifier']['funderIdentifierType'] == 'Crossref Funder ID' + assert crossref_ref['funderIdentifier']['schemeURI'] == 'https://www.crossref.org/services/funder-registry/' + assert crossref_ref['awardNumber']['awardNumber'] == '10000000' + + ror_ref = refs_by_name['National Science Foundation'] + assert ror_ref['funderIdentifier']['funderIdentifier'] == 'https://ror.org/021nxhr62' + assert ror_ref['funderIdentifier']['funderIdentifierType'] == 'ROR' + assert ror_ref['funderIdentifier']['schemeURI'] == 'https://ror.org/' + + def test_datacite_funding_references_ror_with_award_info(self, registration, datacite_client): + self._set_funding_info(registration, [ + { + 'funder_name': 'National Institutes of Health', + 'funder_identifier': 'https://ror.org/01cwqze88', + 'funder_identifier_type': 'ROR', + 'award_number': 'R01-GM123456', + 'award_uri': 'https://reporter.nih.gov/project-details/123456', + 'award_title': 'Studying important things', + }, + ]) + metadata_xml = datacite_client.build_metadata(registration) + parser = lxml.etree.XMLParser(ns_clean=True, recover=True, encoding='utf-8') + root = lxml.etree.fromstring(metadata_xml, parser=parser) + ns = schema40.ns[None] + + funding_refs = root.find(f'{{{ns}}}fundingReferences') + refs = funding_refs.findall(f'{{{ns}}}fundingReference') + assert len(refs) == 1 + + funder_id = refs[0].find(f'{{{ns}}}funderIdentifier') + assert funder_id.text == 'https://ror.org/01cwqze88' + assert funder_id.attrib['funderIdentifierType'] == 'ROR' + assert funder_id.attrib['schemeURI'] == 'https://ror.org/' + + award_number = refs[0].find(f'{{{ns}}}awardNumber') + assert award_number.text == 'R01-GM123456' + + award_title = refs[0].find(f'{{{ns}}}awardTitle') + assert award_title.text == 'Studying important things' + + def test_datacite_funding_references_no_funding_info(self, registration, datacite_client): + # With no funding info set, fundingReferences should be empty + metadata_dict = datacite_client.build_metadata(registration, as_xml=False) + assert metadata_dict.get('fundingReferences', []) == [] + @pytest.mark.django_db class TestDataCiteViews(OsfTestCase): diff --git a/tests/test_add_contributiors_subscriptions.py b/tests/test_add_contributiors_subscriptions.py index 93460b71e8c..123c1f28fd6 100644 --- a/tests/test_add_contributiors_subscriptions.py +++ b/tests/test_add_contributiors_subscriptions.py @@ -1,6 +1,6 @@ import pytest from framework.auth import Auth -from osf.models import NotificationType, NotificationSubscription +from osf.models import NotificationTypeEnum, NotificationSubscription from osf_tests.factories import ProjectFactory, UserFactory from tests.utils import capture_notifications from framework.auth import register_unconfirmed @@ -39,7 +39,7 @@ def test_only_one_subscription_for_registered_user(self): f"found {subs.count()}" ) sub = subs.first() - assert sub.notification_type.name == NotificationType.Type.NODE_FILE_UPDATED + assert sub.notification_type.name == NotificationTypeEnum.NODE_FILE_UPDATED subs = NotificationSubscription.objects.filter( user=user, @@ -51,7 +51,7 @@ def test_only_one_subscription_for_registered_user(self): f"found {subs.count()}" ) sub = subs.first() - assert sub.notification_type.name == NotificationType.Type.USER_FILE_UPDATED + assert sub.notification_type.name == NotificationTypeEnum.USER_FILE_UPDATED def test_only_one_subscription_for_unregistered_user(self): """Adding the same unregistered contributor multiple times creates only one subscription.""" @@ -91,7 +91,7 @@ def test_only_one_subscription_for_unregistered_user(self): f"found {subs.count()}" ) sub = subs.first() - assert sub.notification_type.name == NotificationType.Type.NODE_FILE_UPDATED + assert sub.notification_type.name == NotificationTypeEnum.NODE_FILE_UPDATED subs = NotificationSubscription.objects.filter( user=unreg_user, @@ -103,7 +103,7 @@ def test_only_one_subscription_for_unregistered_user(self): f"found {subs.count()}" ) sub = subs.first() - assert sub.notification_type.name == NotificationType.Type.USER_FILE_UPDATED + assert sub.notification_type.name == NotificationTypeEnum.USER_FILE_UPDATED def test_only_one_subscription_for_creator(self): """Ensure the project creator only has one NotificationSubscription for their own node.""" @@ -134,7 +134,7 @@ def test_only_one_subscription_for_creator(self): f"found {subs.count()}" ) sub = subs.first() - assert sub.notification_type.name == NotificationType.Type.NODE_FILE_UPDATED + assert sub.notification_type.name == NotificationTypeEnum.NODE_FILE_UPDATED subs = NotificationSubscription.objects.filter( user=creator, @@ -146,7 +146,7 @@ def test_only_one_subscription_for_creator(self): f"found {subs.count()}" ) sub = subs.first() - assert sub.notification_type.name == NotificationType.Type.USER_FILE_UPDATED + assert sub.notification_type.name == NotificationTypeEnum.USER_FILE_UPDATED def test_unregistered_contributor_then_registered_user_only_one_subscription(self): """When an unregistered contributor later registers, their subscriptions merge correctly.""" @@ -178,7 +178,7 @@ def test_unregistered_contributor_then_registered_user_only_one_subscription(sel assert subs_node.count() == 1, ( f"Expected one NODE_FILE_UPDATED subscription after registration, found {subs_node.count()}" ) - assert subs_node.first().notification_type.name == NotificationType.Type.NODE_FILE_UPDATED + assert subs_node.first().notification_type.name == NotificationTypeEnum.NODE_FILE_UPDATED subs_user = NotificationSubscription.objects.filter( user=registered_user, @@ -188,7 +188,7 @@ def test_unregistered_contributor_then_registered_user_only_one_subscription(sel assert subs_user.count() == 1, ( f"Expected one USER_FILE_UPDATED subscription after registration, found {subs_user.count()}" ) - assert subs_user.first().notification_type.name == NotificationType.Type.USER_FILE_UPDATED + assert subs_user.first().notification_type.name == NotificationTypeEnum.USER_FILE_UPDATED def test_contributor_removed_then_readded_only_one_subscription(self): """Removing a contributor and re-adding them should not duplicate subscriptions.""" @@ -216,7 +216,7 @@ def test_contributor_removed_then_readded_only_one_subscription(self): assert subs_node.count() == 1, ( f"Expected one NODE_FILE_UPDATED subscription after re-adding, found {subs_node.count()}" ) - assert subs_node.first().notification_type.name == NotificationType.Type.NODE_FILE_UPDATED + assert subs_node.first().notification_type.name == NotificationTypeEnum.NODE_FILE_UPDATED subs_user = NotificationSubscription.objects.filter( user=user, @@ -226,4 +226,4 @@ def test_contributor_removed_then_readded_only_one_subscription(self): assert subs_user.count() == 1, ( f"Expected one USER_FILE_UPDATED subscription after re-adding, found {subs_user.count()}" ) - assert subs_user.first().notification_type.name == NotificationType.Type.USER_FILE_UPDATED + assert subs_user.first().notification_type.name == NotificationTypeEnum.USER_FILE_UPDATED diff --git a/tests/test_adding_contributor_views.py b/tests/test_adding_contributor_views.py index 26207af9360..6dabbdd17cc 100644 --- a/tests/test_adding_contributor_views.py +++ b/tests/test_adding_contributor_views.py @@ -8,7 +8,7 @@ from framework import auth from framework.auth import Auth from framework.exceptions import HTTPError -from osf.models import NodeRelation, NotificationType +from osf.models import NodeRelation, NotificationTypeEnum from osf.utils import permissions from osf_tests.factories import ( fake_email, @@ -266,7 +266,7 @@ def test_email_sent_when_reg_user_is_added(self): project.add_contributors(contributors, auth=self.auth, notification_type=None) project.save() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT def test_contributor_added_email_sent_to_unreg_user(self): unreg_user = UnregUserFactory() @@ -305,17 +305,17 @@ def test_notify_contributor_email_does_not_send_before_throttle_expires(self): notify_added_contributor( project, contributor, - notification_type=NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT, + notification_type=NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT, auth=auth ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT # 2nd call does not send email because throttle period has not expired notify_added_contributor( project, contributor, - notification_type=NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT, + notification_type=NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT, auth=auth ) @@ -327,23 +327,23 @@ def test_notify_contributor_email_sends_after_throttle_expires(self): notify_added_contributor( project, contributor, - NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT, + NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT, auth, ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT time.sleep(2) # throttle period expires with capture_notifications() as notifications: notify_added_contributor( project, contributor, - NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT, + NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT, auth, throttle=1 ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT def test_add_contributor_to_fork_sends_email(self): contributor = UserFactory() @@ -352,7 +352,7 @@ def test_add_contributor_to_fork_sends_email(self): fork.add_contributor(contributor, auth=Auth(self.creator)) fork.save() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT def test_add_contributor_to_template_sends_email(self): contributor = UserFactory() @@ -361,11 +361,11 @@ def test_add_contributor_to_template_sends_email(self): template.add_contributor( contributor, auth=Auth(self.creator), - notification_type=NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT + notification_type=NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT ) template.save() assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_ACCESS_REQUEST def test_creating_fork_does_not_email_creator(self): with capture_notifications(): @@ -512,7 +512,7 @@ def test_send_claim_email_to_given_email(self): with capture_notifications() as notifications: send_claim_email(email=given_email, unclaimed_user=unreg_user, node=project) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_INVITE_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_INVITE_DEFAULT def test_send_claim_email_to_referrer(self): project = ProjectFactory() @@ -528,8 +528,8 @@ def test_send_claim_email_to_referrer(self): send_claim_email(email=real_email, unclaimed_user=unreg_user, node=project) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_PENDING_VERIFICATION - assert notifications['emits'][1]['type'] == NotificationType.Type.USER_FORWARD_INVITE + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_PENDING_VERIFICATION + assert notifications['emits'][1]['type'] == NotificationTypeEnum.USER_FORWARD_INVITE def test_send_claim_email_before_throttle_expires(self): project = ProjectFactory() diff --git a/tests/test_auth.py b/tests/test_auth.py index 63f0684699f..487759603c1 100644 --- a/tests/test_auth.py +++ b/tests/test_auth.py @@ -24,7 +24,7 @@ from framework.auth import Auth from framework.auth.decorators import must_be_logged_in from framework.sessions import get_session -from osf.models import OSFUser, NotificationType +from osf.models import OSFUser, NotificationTypeEnum from osf.utils import permissions from tests.utils import capture_notifications from website import settings @@ -165,7 +165,7 @@ def test_password_change_sends_email(self): user.set_password('killerqueen') user.save() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_PASSWORD_RESET + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_PASSWORD_RESET @mock.patch('framework.auth.utils.requests.post') def test_validate_recaptcha_success(self, req_post): @@ -210,13 +210,13 @@ def test_sign_up_twice_sends_two_confirmation_emails_only(self): with capture_notifications() as notifications: self.app.post(url, json=sign_up_data) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_NO_ADDON - assert notifications['emits'][1]['type'] == NotificationType.Type.USER_INITIAL_CONFIRM_EMAIL + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_NO_ADDON + assert notifications['emits'][1]['type'] == NotificationTypeEnum.USER_INITIAL_CONFIRM_EMAIL with capture_notifications() as notifications: self.app.post(url, json=sign_up_data) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_INITIAL_CONFIRM_EMAIL + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_INITIAL_CONFIRM_EMAIL class TestAuthObject(OsfTestCase): @@ -722,6 +722,59 @@ def test_must_have_permission_not_logged_in(self, mock_from_kwargs, mock_to_node thriller(node=project) assert ctx.value.code == http_status.HTTP_401_UNAUTHORIZED + def decorated_view(self, *args, **kwargs): + return 'Success' + + ## 1. Public Access + @mock.patch('framework.auth.decorators.Auth.from_kwargs') + def test_private_resource_not_allow_anonymous(self, mock_auth): + from framework.auth.decorators import is_contributor_or_public_resource + decorator = is_contributor_or_public_resource('resource') + project = ProjectFactory(is_public=False) + mock_auth.return_value = Auth(user=None) + decorated_func = decorator(self.decorated_view) + with decoratorapp.test_request_context(): + with pytest.raises(HTTPError) as excinfo: + decorated_func(resource=project) + assert excinfo.value.code == http_status.HTTP_403_FORBIDDEN + + @mock.patch('framework.auth.decorators.Auth.from_kwargs') + def test_public_resource_allow_anonymous(self, mock_auth): + from framework.auth.decorators import is_contributor_or_public_resource + decorator = is_contributor_or_public_resource('resource') + project = ProjectFactory(is_public=True) + mock_auth.return_value = Auth(user=None) + decorated_func = decorator(self.decorated_view) + with decoratorapp.test_request_context(): + result = decorated_func(resource=project) + assert result == 'Success' + + @mock.patch('framework.auth.decorators.Auth.from_kwargs') + def test_private_resource_allows_contributor(self, mock_auth): + from framework.auth.decorators import is_contributor_or_public_resource + user = UserFactory() + project = ProjectFactory(is_public=False) + project.add_contributor(user, save=True) + mock_auth.return_value = Auth(user=user) + decorator = is_contributor_or_public_resource('resource') + decorated_func = decorator(self.decorated_view) + with decoratorapp.test_request_context(): + result = decorated_func(resource=project) + assert result == 'Success' + + @mock.patch('framework.auth.decorators.Auth.from_kwargs') + def test_private_resource_not_allow_non_contributor_auth_user(self, mock_auth): + from framework.auth.decorators import is_contributor_or_public_resource + user = UserFactory() + project = ProjectFactory(is_public=False) + mock_auth.return_value = Auth(user=user) + decorator = is_contributor_or_public_resource('resource') + decorated_func = decorator(self.decorated_view) + with decoratorapp.test_request_context(): + with pytest.raises(HTTPError) as excinfo: + decorated_func(resource=project) + assert excinfo.value.code == http_status.HTTP_403_FORBIDDEN + def needs_addon_view(**kwargs): return 'openaddon' diff --git a/tests/test_auth_views.py b/tests/test_auth_views.py index dcd18e3fd58..7b24e286c15 100644 --- a/tests/test_auth_views.py +++ b/tests/test_auth_views.py @@ -25,7 +25,7 @@ ) from framework.auth.exceptions import InvalidTokenError from framework.auth.views import login_and_register_handler -from osf.models import OSFUser, NotableDomain, NotificationType +from osf.models import OSFUser, NotableDomain, NotificationTypeEnum from osf_tests.factories import ( fake_email, AuthUserFactory, @@ -326,7 +326,7 @@ def test_resend_confirmation(self): self.app.put(url, json={'id': self.user._id, 'email': header}, auth=self.user.auth) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_CONFIRM_EMAIL + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_CONFIRM_EMAIL self.user.reload() assert token != self.user.get_confirmation_token(email) @@ -505,7 +505,7 @@ def test_resend_confirmation_does_not_send_before_throttle_expires(self): with capture_notifications() as notifications: self.app.put(url, json={'id': self.user._id, 'email': header}, auth=self.user.auth) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_CONFIRM_EMAIL + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_CONFIRM_EMAIL # 2nd call does not send email because throttle period has not expired res = self.app.put(url, json={'id': self.user._id, 'email': header}, auth=self.user.auth) assert res.status_code == 400 diff --git a/tests/test_claim_views.py b/tests/test_claim_views.py index af3038c537c..031eaa6ac70 100644 --- a/tests/test_claim_views.py +++ b/tests/test_claim_views.py @@ -10,7 +10,7 @@ from framework.flask import redirect from osf.models import ( OSFUser, - Tag, NotificationType, + Tag, NotificationTypeEnum, ) from osf_tests.factories import ( fake_email, @@ -98,8 +98,8 @@ def test_claim_user_already_registered_redirects_to_claim_user_registered(self): } ) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_PENDING_VERIFICATION - assert notifications['emits'][1]['type'] == NotificationType.Type.USER_FORWARD_INVITE + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_PENDING_VERIFICATION + assert notifications['emits'][1]['type'] == NotificationTypeEnum.USER_FORWARD_INVITE # set unregistered record email since we are mocking send_claim_email() unclaimed_record = unregistered_user.get_unclaimed_record(self.project._primary_key) @@ -147,8 +147,8 @@ def test_claim_user_already_registered_secondary_email_redirects_to_claim_user_r } ) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_PENDING_VERIFICATION - assert notifications['emits'][1]['type'] == NotificationType.Type.USER_FORWARD_INVITE + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_PENDING_VERIFICATION + assert notifications['emits'][1]['type'] == NotificationTypeEnum.USER_FORWARD_INVITE # set unregistered record email since we are mocking send_claim_email() unclaimed_record = unregistered_user.get_unclaimed_record(self.project._primary_key) @@ -236,8 +236,8 @@ def test_send_claim_registered_email_before_throttle_expires(self): node=self.project, ) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_FORWARD_INVITE_REGISTERED - assert notifications['emits'][1]['type'] == NotificationType.Type.USER_PENDING_VERIFICATION_REGISTERED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_FORWARD_INVITE_REGISTERED + assert notifications['emits'][1]['type'] == NotificationTypeEnum.USER_PENDING_VERIFICATION_REGISTERED # second call raises error because it was called before throttle period with pytest.raises(HTTPError): send_claim_registered_email( @@ -433,7 +433,7 @@ def test_claim_user_post_returns_fullname(self): ) assert res.json['fullname'] == self.given_name assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_INVITE_DEFAULT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_INVITE_DEFAULT def test_claim_user_post_if_email_is_different_from_given_email(self): email = fake_email() # email that is different from the one the referrer gave @@ -446,9 +446,9 @@ def test_claim_user_post_if_email_is_different_from_given_email(self): } ) assert len(notifications['emits']) == 2 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_PENDING_VERIFICATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_PENDING_VERIFICATION assert notifications['emits'][0]['kwargs']['user'].username == self.given_email - assert notifications['emits'][1]['type'] == NotificationType.Type.USER_FORWARD_INVITE + assert notifications['emits'][1]['type'] == NotificationTypeEnum.USER_FORWARD_INVITE assert notifications['emits'][1]['kwargs']['destination_address'] == email def test_claim_url_with_bad_token_returns_400(self): diff --git a/tests/test_events.py b/tests/test_events.py index fa79515e021..b73e55882ba 100644 --- a/tests/test_events.py +++ b/tests/test_events.py @@ -2,7 +2,7 @@ from django.contrib.contenttypes.models import ContentType -from osf.models import NotificationType +from osf.models import NotificationType, NotificationTypeEnum from tests.utils import capture_notifications from notifications.file_event_notifications import ( event_registry, @@ -121,7 +121,7 @@ def setUp(self): self.sub = factories.NotificationSubscriptionFactory( object_id=self.project.id, content_type=ContentType.objects.get_for_model(self.project), - notification_type=NotificationType.objects.get(name=NotificationType.Type.FILE_UPDATED) + notification_type=NotificationType.objects.get(name=NotificationTypeEnum.FILE_UPDATED) ) self.sub.save() self.event = event_registry['file_updated'](self.user_2, self.project, 'file_updated', payload=file_payload) @@ -135,7 +135,7 @@ def test_file_updated(self): with capture_notifications() as notifications: self.event.perform() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.FILE_UPDATED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.FILE_UPDATED class TestFileAdded(OsfTestCase): @@ -147,7 +147,7 @@ def setUp(self): self.project_subscription = factories.NotificationSubscriptionFactory( object_id=self.project.id, content_type=ContentType.objects.get_for_model(self.project), - notification_type=NotificationType.objects.get(name=NotificationType.Type.FILE_UPDATED) + notification_type=NotificationType.objects.get(name=NotificationTypeEnum.FILE_UPDATED) ) self.project_subscription.save() self.user2 = factories.UserFactory() @@ -162,7 +162,7 @@ def test_file_added(self): with capture_notifications() as notifications: self.event.perform() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.FILE_ADDED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.FILE_ADDED class TestFileRemoved(OsfTestCase): @@ -174,7 +174,7 @@ def setUp(self): self.project_subscription = factories.NotificationSubscriptionFactory( object_id=self.project.id, content_type=ContentType.objects.get_for_model(self.project), - notification_type=NotificationType.objects.get(name=NotificationType.Type.FILE_REMOVED) + notification_type=NotificationType.objects.get(name=NotificationTypeEnum.FILE_REMOVED) ) self.project_subscription.object_id = self.project.id self.project_subscription.content_type = ContentType.objects.get_for_model(self.project) @@ -185,12 +185,12 @@ def setUp(self): ) def test_info_formed_correct_file(self): - assert NotificationType.Type.FILE_UPDATED == self.event.event_type + assert NotificationTypeEnum.FILE_UPDATED == self.event.event_type assert f'removed file "{materialized.lstrip("/")}".' == self.event.html_message assert f'removed file "{materialized.lstrip("/")}".' == self.event.text_message def test_info_formed_correct_folder(self): - assert NotificationType.Type.FILE_UPDATED == self.event.event_type + assert NotificationTypeEnum.FILE_UPDATED == self.event.event_type self.event.payload['metadata']['materialized'] += '/' assert f'removed folder "{materialized.lstrip("/")}/".' == self.event.html_message assert f'removed folder "{materialized.lstrip("/")}/".' == self.event.text_message @@ -199,7 +199,7 @@ def test_file_removed(self): with capture_notifications() as notifications: self.event.perform() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.FILE_REMOVED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.FILE_REMOVED class TestFolderCreated(OsfTestCase): @@ -210,7 +210,7 @@ def setUp(self): self.project = factories.ProjectFactory() self.project_subscription = factories.NotificationSubscriptionFactory( user=self.user, - notification_type=NotificationType.objects.get(name=NotificationType.Type.FILE_UPDATED), + notification_type=NotificationType.objects.get(name=NotificationTypeEnum.FILE_UPDATED), ) self.project_subscription.save() self.user2 = factories.UserFactory() @@ -219,7 +219,7 @@ def setUp(self): ) def test_info_formed_correct(self): - assert NotificationType.Type.FILE_UPDATED == self.event.event_type + assert NotificationTypeEnum.FILE_UPDATED == self.event.event_type assert 'created folder "Three/".' == self.event.html_message assert 'created folder "Three/".' == self.event.text_message @@ -227,7 +227,7 @@ def test_folder_added(self): with capture_notifications() as notifications: self.event.perform() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.FOLDER_CREATED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.FOLDER_CREATED class TestFolderFileRenamed(OsfTestCase): @@ -242,7 +242,7 @@ def setUp(self): user=self.user_2, object_id=self.project.id, content_type=ContentType.objects.get_for_model(self.project), - notification_type=NotificationType.objects.get(name=NotificationType.Type.USER_FILE_UPDATED) + notification_type=NotificationType.objects.get(name=NotificationTypeEnum.USER_FILE_UPDATED) ) self.sub.save() @@ -295,21 +295,21 @@ def setUp(self): self.sub = factories.NotificationSubscriptionFactory( object_id=self.project.id, content_type=ContentType.objects.get_for_model(self.project), - notification_type=NotificationType.objects.get(name=NotificationType.Type.FILE_UPDATED) + notification_type=NotificationType.objects.get(name=NotificationTypeEnum.FILE_UPDATED) ) self.sub.save() # for private node self.private_sub = factories.NotificationSubscriptionFactory( object_id=self.private_node.id, content_type=ContentType.objects.get_for_model(self.private_node), - notification_type=NotificationType.objects.get(name=NotificationType.Type.FILE_UPDATED) + notification_type=NotificationType.objects.get(name=NotificationTypeEnum.FILE_UPDATED) ) self.private_sub.save() # for file subscription self.file_sub = factories.NotificationSubscriptionFactory( object_id=self.project.id, content_type=ContentType.objects.get_for_model(self.project), - notification_type=NotificationType.objects.get(name=NotificationType.Type.NODE_FILES_UPDATED) + notification_type=NotificationType.objects.get(name=NotificationTypeEnum.NODE_FILE_UPDATED) ) self.file_sub.save() @@ -327,7 +327,7 @@ def test_user_performing_action_no_email(self): with capture_notifications() as notifications: self.event.perform() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.ADDON_FILE_MOVED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.ADDON_FILE_MOVED assert notifications['emits'][0]['kwargs']['user'] == self.user_2 def test_perform_store_called_once(self): @@ -336,7 +336,7 @@ def test_perform_store_called_once(self): with capture_notifications() as notifications: self.event.perform() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.ADDON_FILE_MOVED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.ADDON_FILE_MOVED def test_perform_store_one_of_each(self): # Move Event: Tests that store_emails is called 3 times, one in @@ -357,7 +357,7 @@ def test_perform_store_one_of_each(self): with capture_notifications() as notifications: self.event.perform() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.ADDON_FILE_MOVED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.ADDON_FILE_MOVED def test_remove_user_sent_once(self): # Move Event: Tests removed user is removed once. Regression @@ -368,7 +368,7 @@ def test_remove_user_sent_once(self): with capture_notifications() as notifications: self.event.perform() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.ADDON_FILE_MOVED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.ADDON_FILE_MOVED class TestFileCopied(OsfTestCase): @@ -393,21 +393,21 @@ def setUp(self): self.sub = factories.NotificationSubscriptionFactory( object_id=self.project.id, content_type=ContentType.objects.get_for_model(self.project), - notification_type=NotificationType.objects.get(name=NotificationType.Type.FILE_UPDATED) + notification_type=NotificationType.objects.get(name=NotificationTypeEnum.FILE_UPDATED) ) self.sub.save() # for private node self.private_sub = factories.NotificationSubscriptionFactory( object_id=self.private_node.id, content_type=ContentType.objects.get_for_model(self.private_node), - notification_type=NotificationType.objects.get(name=NotificationType.Type.FILE_UPDATED) + notification_type=NotificationType.objects.get(name=NotificationTypeEnum.FILE_UPDATED) ) self.private_sub.save() # for file subscription self.file_sub = factories.NotificationSubscriptionFactory( object_id=self.project.id, content_type=ContentType.objects.get_for_model(self.project), - notification_type=NotificationType.objects.get(name=NotificationType.Type.NODE_FILES_UPDATED) + notification_type=NotificationType.objects.get(name=NotificationTypeEnum.NODE_FILE_UPDATED) ) self.file_sub.save() @@ -439,7 +439,7 @@ def test_copied_one_of_each(self): with capture_notifications() as notifications: self.event.perform() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.ADDON_FILE_COPIED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.ADDON_FILE_COPIED def test_user_performing_action_no_email(self): # Move Event: Makes sure user who performed the action is not @@ -449,7 +449,7 @@ def test_user_performing_action_no_email(self): with capture_notifications() as notifications: self.event.perform() assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.ADDON_FILE_COPIED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.ADDON_FILE_COPIED class TestSubscriptionManipulations(OsfTestCase): diff --git a/tests/test_forgot_password.py b/tests/test_forgot_password.py index 935b641d120..3e8bacaf1a1 100644 --- a/tests/test_forgot_password.py +++ b/tests/test_forgot_password.py @@ -1,6 +1,6 @@ from urllib.parse import quote_plus -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from tests.base import OsfTestCase from osf_tests.factories import ( AuthUserFactory, @@ -50,7 +50,7 @@ def test_can_receive_reset_password_email(self): res = form.submit(self.app) # check mail was sent assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_FORGOT_PASSWORD + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_FORGOT_PASSWORD # check http 200 response assert res.status_code == 200 # check request URL is /forgotpassword @@ -152,7 +152,7 @@ def test_can_receive_reset_password_email(self): # check mail was sent assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_FORGOT_PASSWORD_INSTITUTION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_FORGOT_PASSWORD_INSTITUTION # check http 200 response assert res.status_code == 200 # check request URL is /forgotpassword diff --git a/tests/test_misc_views.py b/tests/test_misc_views.py index d51c0e2d098..3d1e0cad47c 100644 --- a/tests/test_misc_views.py +++ b/tests/test_misc_views.py @@ -21,7 +21,7 @@ Comment, OSFUser, SpamStatus, - NodeRelation, NotificationType, + NodeRelation, NotificationTypeEnum, ) from osf.utils import permissions from osf_tests.factories import ( @@ -420,8 +420,10 @@ def test_external_login_confirm_email_get_link(self): self.user.save() assert not self.user.is_registered url = self.user.get_confirmation_url(self.user.username, external_id_provider='orcid', destination='my_projects') - with capture_notifications(): + with capture_notifications() as notifications: res = self.app.get(url) + assert len(notifications['emits']) == 1 + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_EXTERNAL_LOGIN_LINK_SUCCESS assert res.status_code == 302, 'redirects to cas login' assert 'You should be redirected automatically' in str(res.html) assert '/login?service=' in res.location diff --git a/tests/test_preprints.py b/tests/test_preprints.py index 77104e655b2..7d669ee3e3f 100644 --- a/tests/test_preprints.py +++ b/tests/test_preprints.py @@ -26,7 +26,7 @@ from addons.base import views from admin_tests.utilities import setup_view from api.preprints.views import PreprintContributorDetail -from osf.models import Tag, Preprint, PreprintLog, PreprintContributor, NotificationType +from osf.models import Tag, Preprint, PreprintLog, PreprintContributor, NotificationTypeEnum from osf.exceptions import PreprintStateError, ValidationError, ValidationValueError from osf_tests.factories import ( ProjectFactory, @@ -2014,12 +2014,12 @@ def test_creator_gets_email(self): with capture_notifications() as notifications: self.preprint.set_published(True, auth=Auth(self.user), save=True) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION with capture_notifications() as notifications: self.preprint_branded.set_published(True, auth=Auth(self.user), save=True) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION + assert notifications['emits'][0]['type'] == NotificationTypeEnum.PROVIDER_REVIEWS_SUBMISSION_CONFIRMATION class TestPreprintOsfStorage(OsfTestCase): def setUp(self): diff --git a/tests/test_registrations/test_retractions.py b/tests/test_registrations/test_retractions.py index 520a21a809a..481f4be7420 100644 --- a/tests/test_registrations/test_retractions.py +++ b/tests/test_registrations/test_retractions.py @@ -22,7 +22,7 @@ InvalidSanctionApprovalToken, InvalidSanctionRejectionToken, NodeStateError, ) -from osf.models import Contributor, Retraction, NotificationType +from osf.models import Contributor, Retraction, NotificationTypeEnum from osf.utils import permissions from tests.utils import capture_notifications @@ -804,7 +804,7 @@ def test_POST_retraction_does_not_send_email_to_unregistered_admins(self): auth=self.user.auth, ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_PENDING_RETRACTION_ADMIN + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_PENDING_RETRACTION_ADMIN def test_POST_pending_embargo_returns_HTTPError_HTTPOK(self): self.registration.embargo_registration( @@ -900,7 +900,7 @@ def test_valid_POST_calls_send_mail_with_username(self): auth=self.user.auth, ) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.NODE_PENDING_RETRACTION_ADMIN + assert notifications['emits'][0]['type'] == NotificationTypeEnum.NODE_PENDING_RETRACTION_ADMIN def test_non_contributor_GET_approval_returns_HTTPError_FORBIDDEN(self): non_contributor = AuthUserFactory() diff --git a/tests/test_registrations/test_views.py b/tests/test_registrations/test_views.py index 4c0bdde8419..15d0e60cc77 100644 --- a/tests/test_registrations/test_views.py +++ b/tests/test_registrations/test_views.py @@ -50,7 +50,7 @@ def test_node_register_page_not_registration_redirects(self): @mock.patch('website.archiver.tasks.archive') def test_node_register_page_registration(self, mock_archive): draft_reg = DraftRegistrationFactory(branched_from=self.node, user=self.node.creator) - reg = self.node.register_node(get_default_metaschema(), self.auth, draft_reg, None) + reg = self.node.register_node(get_default_metaschema(), self.auth, draft_reg, None, provider=draft_reg.provider) url = reg.web_url_for('node_register_page') res = self.app.get(url, auth=self.user.auth) assert res.status_code == http_status.HTTP_200_OK diff --git a/tests/test_resend_confirmation.py b/tests/test_resend_confirmation.py index 95c1d1d431d..9b1fcdf74ce 100644 --- a/tests/test_resend_confirmation.py +++ b/tests/test_resend_confirmation.py @@ -1,4 +1,4 @@ -from osf.models import NotificationType +from osf.models import NotificationTypeEnum from tests.base import OsfTestCase from osf_tests.factories import ( UserFactory, @@ -34,7 +34,7 @@ def test_can_receive_resend_confirmation_email(self): res = form.submit(self.app) # check email, request and response assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_INITIAL_CONFIRM_EMAIL + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_INITIAL_CONFIRM_EMAIL assert res.status_code == 200 assert res.request.path == self.post_url diff --git a/tests/test_spam_mixin.py b/tests/test_spam_mixin.py index 91dc6387181..ca3e25a9cda 100644 --- a/tests/test_spam_mixin.py +++ b/tests/test_spam_mixin.py @@ -10,7 +10,7 @@ from tests.base import DbTestCase from osf_tests.factories import UserFactory, CommentFactory, ProjectFactory, PreprintFactory, RegistrationFactory, AuthUserFactory -from osf.models import NotableDomain, SpamStatus, NotificationType +from osf.models import NotableDomain, SpamStatus, NotificationTypeEnum from tests.utils import capture_notifications from website import settings @@ -27,7 +27,7 @@ def test_throttled_autoban(): proj.save() projects.append(proj) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.USER_SPAM_BANNED + assert notifications['emits'][0]['type'] == NotificationTypeEnum.USER_SPAM_BANNED user.reload() assert user.is_disabled for project in projects: diff --git a/tests/test_triggered_mails.py b/tests/test_triggered_mails.py index c482338ccff..33562878f8a 100644 --- a/tests/test_triggered_mails.py +++ b/tests/test_triggered_mails.py @@ -3,14 +3,14 @@ from unittest import mock from waffle.testutils import override_switch from osf import features - +from website import settings from django.utils import timezone from tests.base import OsfTestCase from tests.utils import run_celery_tasks, capture_notifications from osf_tests.factories import UserFactory -from osf.models import EmailTask, NotificationType +from osf.models import EmailTask, NotificationTypeEnum from scripts.triggered_mails import ( find_inactive_users_without_enqueued_or_sent_no_login, @@ -22,7 +22,7 @@ def _inactive_time(): """Make a timestamp that is definitely 'inactive' regardless of threshold settings.""" # Very conservative: 12 weeks ago - return timezone.now() - timedelta(weeks=12) + return timezone.now() - settings.NO_LOGIN_WAIT_TIME def _recent_time(): @@ -87,7 +87,7 @@ def test_trigger_no_login_mail_failure_marks_task_failure(self): # Force the emit call to raise to exercise failure branch with mock.patch.object( - NotificationType.Type.USER_NO_LOGIN.instance, + NotificationTypeEnum.USER_NO_LOGIN.instance, 'emit', side_effect=RuntimeError('kaboom'), ), run_celery_tasks(): @@ -114,25 +114,56 @@ def test_finder_returns_two_inactive_when_none_queued(self): assert ids == {u1.id, u2.id} def test_finder_excludes_users_with_existing_task(self): - """Inactive users but one already has a no_login EmailTask -> excluded.""" + """Inactive users but one already has a no_login_email_last_sent -> excluded.""" u1 = UserFactory(fullname='Jalen Hurts') u2 = UserFactory(fullname='Jason Kelece') u1.date_last_login = _inactive_time() u2.date_last_login = _inactive_time() - u1.save() - u2.save() - - # Pretend u2 already had this email flow (SUCCESS qualifies for exclusion) EmailTask.objects.create( - task_id=f"{NO_LOGIN_PREFIX}existing-success", - user=u2, - status='SUCCESS', + user=u2, task_id=f'{NO_LOGIN_PREFIX}uuid4', status='PENDING', ) + u1.save() + u2.save() users = list(find_inactive_users_without_enqueued_or_sent_no_login()) ids = {u.id for u in users} assert ids == {u1.id} # u2 excluded because of existing task + def test_finder_excludes_users_with_recent_no_login_email(self): + """Inactive users but one already has a no_login_email_last_sent -> excluded.""" + u1 = UserFactory(fullname='Jalen Hurts') + u2 = UserFactory(fullname='Jason Kelece') + u1.date_last_login = _inactive_time() + u2.date_last_login = _inactive_time() + u2.no_login_email_last_sent = timezone.now() + u1.save() + u2.save() + + users = list(find_inactive_users_without_enqueued_or_sent_no_login()) + ids = {u.id for u in users} + assert ids == {u1.id} # u2 excluded because of recent email + + def test_finder_excludes_users_logged_in_before_no_login_email_last_sent(self): + """Inactive users but one already has a no_login_email_last_sent -> excluded.""" + u1 = UserFactory(fullname='Jalen Hurts') + u2 = UserFactory(fullname='Jason Kelece') + u1.date_last_login = _inactive_time() + u2.date_last_login = _inactive_time() + u2.no_login_email_last_sent = timezone.now() - settings.NO_LOGIN_WAIT_TIME # old enough to be eligible if not for the login + u1.save() + u2.save() + + users = list(find_inactive_users_without_enqueued_or_sent_no_login()) + ids = {u.id for u in users} + assert ids == {u1.id} # u2 excluded because last login was before email was sent + + u2.date_last_login = timezone.now() - settings.NO_LOGIN_WAIT_TIME + u2.save() + + users = list(find_inactive_users_without_enqueued_or_sent_no_login()) + ids = {u.id for u in users} + assert ids == {u1.id, u2.id} # u2 included again because they logged in after the email was sent + @override_switch(features.ENABLE_NO_LOGIN_EMAILS, active=False) def test_disable_task(self): u1 = UserFactory(fullname='Jalen Hurts') diff --git a/tests/test_user_profile_view.py b/tests/test_user_profile_view.py index fd5b424f4b8..8fa505df378 100644 --- a/tests/test_user_profile_view.py +++ b/tests/test_user_profile_view.py @@ -9,7 +9,7 @@ from addons.github.tests.factories import GitHubAccountFactory from framework.celery_tasks import handlers from osf.external.spam import tasks as spam_tasks -from osf.models import NotableDomain, NotificationType +from osf.models import NotableDomain, NotificationTypeEnum from osf_tests.factories import ( fake_email, ApiOAuth2ApplicationFactory, @@ -728,7 +728,7 @@ def test_user_cannot_request_account_export_before_throttle_expires(self): with capture_notifications() as notifications: self.app.post(url, auth=self.user.auth) assert len(notifications['emits']) == 1 - assert notifications['emits'][0]['type'] == NotificationType.Type.DESK_REQUEST_EXPORT + assert notifications['emits'][0]['type'] == NotificationTypeEnum.DESK_REQUEST_EXPORT res = self.app.post(url, auth=self.user.auth) assert res.status_code == 400 diff --git a/tests/utils.py b/tests/utils.py index 9e6e3db07cd..9f0aba2f4cf 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -545,7 +545,7 @@ def _safe_obj_id(obj: Any) -> Optional[str]: @contextlib.contextmanager def assert_notification( *, - type, # NotificationType, NotificationType.Type, or str + type, # NotificationType, NotificationTypeEnum, or str user: Any = None, # optional user object to match subscribed_object: Any = None, # optional object (e.g., node) to match times: int = 1, # exact number of emits expected @@ -555,7 +555,7 @@ def assert_notification( ): """ Usage: - with assert_notification(type=NotificationType.Type.NODE_FORK_COMPLETED, user=self.user): + with assert_notification(type=NotificationTypeEnum.NODE_FORK_COMPLETED, user=self.user): """ expected_type = _notif_type_name(type) diff --git a/website/archiver/utils.py b/website/archiver/utils.py index 0eafd0460b3..f124388423c 100644 --- a/website/archiver/utils.py +++ b/website/archiver/utils.py @@ -27,44 +27,37 @@ def normalize_unicode_filenames(filename): def send_archiver_size_exceeded_mails(src, user, stat_result, url): - from osf.models.notification_type import NotificationType + from osf.models.notification_type import NotificationTypeEnum - NotificationType.Type.DESK_ARCHIVE_JOB_EXCEEDED.instance.emit( + NotificationTypeEnum.DESK_ARCHIVE_JOB_EXCEEDED.instance.emit( destination_address=settings.OSF_SUPPORT_EMAIL, subscribed_object=src, event_context={ 'user_fullname': user.fullname, 'user__id': user._id, - 'src__id': src._id, 'src_url': src.url, 'src_title': src.title, 'stat_result': stat_result, 'url': url, 'max_archive_size': MAX_ARCHIVE_SIZE / 1024 ** 3, - 'can_change_preferences': False, } ) - NotificationType.Type.USER_ARCHIVE_JOB_EXCEEDED.instance.emit( + NotificationTypeEnum.USER_ARCHIVE_JOB_EXCEEDED.instance.emit( user=user, subscribed_object=user, event_context={ - 'user_fullname': user.fullname, - 'user__id': user._id, 'src_title': src.title, 'src_url': src.url, - 'max_archive_size': MAX_ARCHIVE_SIZE / 1024 ** 3, - 'can_change_preferences': False, } ) def send_archiver_copy_error_mails(src, user, results, url): - from osf.models.notification_type import NotificationType + from osf.models.notification_type import NotificationTypeEnum - NotificationType.Type.DESK_ARCHIVE_JOB_COPY_ERROR.instance.emit( + NotificationTypeEnum.DESK_ARCHIVE_JOB_COPY_ERROR.instance.emit( destination_address=settings.OSF_SUPPORT_EMAIL, event_context={ - 'domain': settings.DOMAIN, 'user_fullname': user.fullname, 'user__id': user._id, 'src__id': src._id, @@ -72,37 +65,34 @@ def send_archiver_copy_error_mails(src, user, results, url): 'src_title': src.title, 'results': results, 'url': url, - 'can_change_preferences': False, } ) - NotificationType.Type.USER_ARCHIVE_JOB_COPY_ERROR.instance.emit( + NotificationTypeEnum.USER_ARCHIVE_JOB_COPY_ERROR.instance.emit( user=user, event_context={ 'domain': settings.DOMAIN, - 'user_fullname': user.fullname, - 'user__id': user._id, - 'src__id': src._id, 'src_url': src.url, 'src_title': src.title, - 'results': results, - 'can_change_preferences': False, + } ) def send_archiver_file_not_found_mails(src, user, results, url): - from osf.models.notification_type import NotificationType + from osf.models.notification_type import NotificationTypeEnum - NotificationType.Type.DESK_ARCHIVE_JOB_FILE_NOT_FOUND.instance.emit( + NotificationTypeEnum.DESK_ARCHIVE_JOB_FILE_NOT_FOUND.instance.emit( destination_address=settings.OSF_SUPPORT_EMAIL, event_context={ - 'user': user.id, - 'src': src._id, + 'domain': settings.DOMAIN, + 'src': src, + 'src_title': src.title, + 'user__id': user._id, + 'user_fullname': user.fullname, + 'src__id': src._id, 'results': results, - 'url': url, - 'can_change_preferences': False, } ) - NotificationType.Type.USER_ARCHIVE_JOB_FILE_NOT_FOUND.instance.emit( + NotificationTypeEnum.USER_ARCHIVE_JOB_FILE_NOT_FOUND.instance.emit( user=user, event_context={ 'user': user.id, @@ -110,39 +100,29 @@ def send_archiver_file_not_found_mails(src, user, results, url): 'src_title': src.title, 'src_url': src.url, 'results': results, - 'can_change_preferences': False, } ) def send_archiver_uncaught_error_mails(src, user, results, url): - from osf.models.notification_type import NotificationType + from osf.models.notification_type import NotificationTypeEnum - NotificationType.Type.DESK_ARCHIVE_JOB_UNCAUGHT_ERROR.instance.emit( + NotificationTypeEnum.DESK_ARCHIVE_JOB_UNCAUGHT_ERROR.instance.emit( destination_address=settings.OSF_SUPPORT_EMAIL, event_context={ 'user_fullname': user.fullname, 'user__id': user._id, - 'user_username': user.username, 'src_title': src.title, - 'src__id': src._id, 'src_url': src.url, - 'src': src._id, - 'results': [str(error) for error in results], 'url': url, - 'can_change_preferences': False, + 'src__id': src._id, + 'results': results, } ) - NotificationType.Type.USER_ARCHIVE_JOB_UNCAUGHT_ERROR.instance.emit( + NotificationTypeEnum.USER_ARCHIVE_JOB_UNCAUGHT_ERROR.instance.emit( user=user, event_context={ - 'user_fullname': user.fullname, - 'user__id': user._id, 'src_title': src.title, - 'src__id': src._id, 'src_url': src.url, - 'src': src._id, - 'results': [str(error) for error in results], - 'can_change_preferences': False, } ) diff --git a/website/mailchimp_utils.py b/website/mailchimp_utils.py index 7e92a59d275..764247c1482 100644 --- a/website/mailchimp_utils.py +++ b/website/mailchimp_utils.py @@ -8,7 +8,7 @@ from framework.celery_tasks.handlers import queued_task from framework.auth.signals import user_confirmed from osf.exceptions import OSFError -from osf.models import OSFUser, NotificationSubscription, NotificationType +from osf.models import OSFUser, NotificationSubscription, NotificationTypeEnum from website import settings @@ -123,16 +123,22 @@ def subscribe_on_confirm(user): # Subscribe user to default notification subscriptions NotificationSubscription.objects.get_or_create( user=user, - notification_type=NotificationType.Type.REVIEWS_SUBMISSION_STATUS.instance, + notification_type=NotificationTypeEnum.REVIEWS_SUBMISSION_STATUS.instance, content_type=ContentType.objects.get_for_model(user), object_id=user.id, - defaults={'message_frequency': 'instantly'}, + defaults={ + '_is_digest': True, + 'message_frequency': 'instantly', + }, ) NotificationSubscription.objects.get_or_create( user=user, - notification_type=NotificationType.Type.USER_FILE_UPDATED.instance, + notification_type=NotificationTypeEnum.USER_FILE_UPDATED.instance, content_type=ContentType.objects.get_for_model(user), object_id=user.id, - defaults={'message_frequency': 'instantly'}, + defaults={ + '_is_digest': True, + 'message_frequency': 'instantly', + }, ) diff --git a/website/notifications/__init__.py b/website/notifications/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/website/notifications/constants.py b/website/notifications/constants.py deleted file mode 100644 index ce3c9db4315..00000000000 --- a/website/notifications/constants.py +++ /dev/null @@ -1,39 +0,0 @@ -NODE_SUBSCRIPTIONS_AVAILABLE = { - 'file_updated': 'Files updated' -} - -# Note: if the subscription starts with 'global_', it will be treated like a default -# subscription. If no notification type has been assigned, the user subscription -# will default to 'email_transactional'. -USER_SUBSCRIPTIONS_AVAILABLE = { - 'global_file_updated': 'Files updated', - 'global_reviews': 'Preprint submissions updated' -} - -PROVIDER_SUBSCRIPTIONS_AVAILABLE = { - 'new_pending_submissions': 'New preprint submissions for moderators to review.' -} - -# Note: the python value None mean inherit from parent -NOTIFICATION_TYPES = { - 'email_transactional': 'Email when a change occurs', - 'email_digest': 'Daily email digest of all changes to this project', - 'none': 'None' -} - -# Formatted file provider names for notification emails -PROVIDERS = { - 'osfstorage': 'OSF Storage', - 'boa': 'Boa', - 'box': 'Box', - 'dataverse': 'Dataverse', - 'dropbox': 'Dropbox', - 'figshare': 'figshare', - 'github': 'GitHub', - 'gitlab': 'GitLab', - 'bitbucket': 'Bitbucket', - 'googledrive': 'Google Drive', - 'owncloud': 'ownCloud', - 'onedrive': 'Microsoft OneDrive', - 's3': 'Amazon S3' -} diff --git a/website/notifications/emails.py b/website/notifications/emails.py deleted file mode 100644 index e61c64e660a..00000000000 --- a/website/notifications/emails.py +++ /dev/null @@ -1,243 +0,0 @@ -from django.apps import apps - -from babel import dates, core, Locale - -from osf.models import AbstractNode, NotificationDigest, NotificationSubscription -from osf.utils.permissions import ADMIN, READ -from website import mails -from website.notifications import constants -from website.notifications import utils -from website.util import web_url_for - - -def notify(event, user, node, timestamp, **context): - """Retrieve appropriate ***subscription*** and passe user list - - :param event: event that triggered the notification - :param user: user who triggered notification - :param node: instance of Node - :param timestamp: time event happened - :param context: optional variables specific to templates - target_user: used with comment_replies - :return: List of user ids notifications were sent to - """ - sent_users = [] - # The user who the current comment is a reply to - target_user = context.get('target_user', None) - exclude = context.get('exclude', []) - # do not notify user who initiated the emails - exclude.append(user._id) - - event_type = utils.find_subscription_type(event) - if target_user and event_type in constants.USER_SUBSCRIPTIONS_AVAILABLE: - # global user - subscriptions = get_user_subscriptions(target_user, event_type) - else: - # local project user - subscriptions = compile_subscriptions(node, event_type, event) - - for notification_type in subscriptions: - if notification_type == 'none' or not subscriptions[notification_type]: - continue - # Remove excluded ids from each notification type - subscriptions[notification_type] = [guid for guid in subscriptions[notification_type] if guid not in exclude] - - # If target, they get a reply email and are removed from the general email - if target_user and target_user._id in subscriptions[notification_type]: - subscriptions[notification_type].remove(target_user._id) - store_emails([target_user._id], notification_type, 'comment_replies', user, node, timestamp, **context) - sent_users.append(target_user._id) - - if subscriptions[notification_type]: - store_emails(subscriptions[notification_type], notification_type, event_type, user, node, timestamp, **context) - sent_users.extend(subscriptions[notification_type]) - return sent_users - -def notify_mentions(event, user, node, timestamp, **context): - OSFUser = apps.get_model('osf', 'OSFUser') - recipient_ids = context.get('new_mentions', []) - recipients = OSFUser.objects.filter(guids___id__in=recipient_ids) - sent_users = notify_global_event(event, user, node, timestamp, recipients, context=context) - return sent_users - -def notify_global_event(event, sender_user, node, timestamp, recipients, template=None, context=None): - event_type = utils.find_subscription_type(event) - sent_users = [] - if not context: - context = {} - - for recipient in recipients: - subscriptions = get_user_subscriptions(recipient, event_type) - context['is_creator'] = recipient == node.creator - if node.provider: - context['has_psyarxiv_chronos_text'] = node.has_permission(recipient, ADMIN) and 'psyarxiv' in node.provider.name.lower() - for notification_type in subscriptions: - if (notification_type != 'none' and subscriptions[notification_type] and recipient._id in subscriptions[notification_type]): - store_emails([recipient._id], notification_type, event, sender_user, node, timestamp, template=template, **context) - sent_users.append(recipient._id) - - return sent_users - - -def store_emails(recipient_ids, notification_type, event, user, node, timestamp, abstract_provider=None, template=None, **context): - """Store notification emails - - Emails are sent via celery beat as digests - :param recipient_ids: List of user ids to send mail to. - :param notification_type: from constants.Notification_types - :param event: event that triggered notification - :param user: user who triggered the notification - :param node: instance of Node - :param timestamp: time event happened - :param context: - :return: -- - """ - OSFUser = apps.get_model('osf', 'OSFUser') - - if notification_type == 'none': - return - - # If `template` is not specified, default to using a template with name `event` - template = f'{template or event}.html.mako' - - # user whose action triggered email sending - context['user'] = user - node_lineage_ids = get_node_lineage(node) if node else [] - - for recipient_id in recipient_ids: - if recipient_id == user._id: - continue - recipient = OSFUser.load(recipient_id) - if recipient.is_disabled: - continue - context['localized_timestamp'] = localize_timestamp(timestamp, recipient) - context['recipient'] = recipient - message = mails.render_message(template, **context) - digest = NotificationDigest( - timestamp=timestamp, - send_type=notification_type, - event=event, - user=recipient, - message=message, - node_lineage=node_lineage_ids, - provider=abstract_provider - ) - digest.save() - - -def compile_subscriptions(node, event_type, event=None, level=0): - """Recurse through node and parents for subscriptions. - - :param node: current node - :param event_type: Generally node_subscriptions_available - :param event: Particular event such a file_updated that has specific file subs - :param level: How deep the recursion is - :return: a dict of notification types with lists of users. - """ - subscriptions = check_node(node, event_type) - if event: - subscriptions = check_node(node, event) # Gets particular event subscriptions - parent_subscriptions = compile_subscriptions(node, event_type, level=level + 1) # get node and parent subs - elif getattr(node, 'parent_id', False): - parent_subscriptions = \ - compile_subscriptions(AbstractNode.load(node.parent_id), event_type, level=level + 1) - else: - parent_subscriptions = check_node(None, event_type) - for notification_type in parent_subscriptions: - p_sub_n = parent_subscriptions[notification_type] - p_sub_n.extend(subscriptions[notification_type]) - for nt in subscriptions: - if notification_type != nt: - p_sub_n = list(set(p_sub_n).difference(set(subscriptions[nt]))) - if level == 0: - p_sub_n, removed = utils.separate_users(node, p_sub_n) - parent_subscriptions[notification_type] = p_sub_n - return parent_subscriptions - - -def check_node(node, event): - """Return subscription for a particular node and event.""" - node_subscriptions = {key: [] for key in constants.NOTIFICATION_TYPES} - if node: - subscription = NotificationSubscription.load(utils.to_subscription_key(node._id, event)) - for notification_type in node_subscriptions: - users = getattr(subscription, notification_type, []) - if users: - for user in users.exclude(date_disabled__isnull=False): - if node.has_permission(user, READ): - node_subscriptions[notification_type].append(user._id) - return node_subscriptions - - -def get_user_subscriptions(user, event): - if user.is_disabled: - return {} - user_subscription = NotificationSubscription.load(utils.to_subscription_key(user._id, event)) - if user_subscription: - return {key: list(getattr(user_subscription, key).all().values_list('guids___id', flat=True)) for key in constants.NOTIFICATION_TYPES} - else: - return {key: [user._id] if (event in constants.USER_SUBSCRIPTIONS_AVAILABLE and key == 'email_transactional') else [] for key in constants.NOTIFICATION_TYPES} - - -def get_node_lineage(node): - """ Get a list of node ids in order from the node to top most project - e.g. [parent._id, node._id] - """ - from osf.models import Preprint - lineage = [node._id] - if isinstance(node, Preprint): - return lineage - - while node.parent_id: - node = node.parent_node - lineage = [node._id] + lineage - - return lineage - - -def get_settings_url(uid, user): - if uid == user._id: - return web_url_for('user_notifications', _absolute=True) - - node = AbstractNode.load(uid) - assert node, 'get_settings_url received an invalid Node id' - return node.web_url_for('node_setting', _guid=True, _absolute=True) - -def fix_locale(locale): - """Attempt to fix a locale to have the correct casing, e.g. de_de -> de_DE - - This is NOT guaranteed to return a valid locale identifier. - """ - try: - language, territory = locale.split('_', 1) - except ValueError: - return locale - else: - return '_'.join([language, territory.upper()]) - -def localize_timestamp(timestamp, user): - try: - user_timezone = dates.get_timezone(user.timezone) - except LookupError: - user_timezone = dates.get_timezone('Etc/UTC') - - try: - user_locale = Locale(user.locale) - except core.UnknownLocaleError: - user_locale = Locale('en') - - # Do our best to find a valid locale - try: - user_locale.date_formats - except OSError: # An IOError will be raised if locale's casing is incorrect, e.g. de_de vs. de_DE - # Attempt to fix the locale, e.g. de_de -> de_DE - try: - user_locale = Locale(fix_locale(user.locale)) - user_locale.date_formats - except (core.UnknownLocaleError, OSError): - user_locale = Locale('en') - - formatted_date = dates.format_date(timestamp, format='full', locale=user_locale) - formatted_time = dates.format_time(timestamp, format='short', tzinfo=user_timezone, locale=user_locale) - - return f'{formatted_time} on {formatted_date}' diff --git a/website/notifications/utils.py b/website/notifications/utils.py deleted file mode 100644 index b9a9b6d10e3..00000000000 --- a/website/notifications/utils.py +++ /dev/null @@ -1,479 +0,0 @@ -import collections - -from django.apps import apps -from django.db.models import Q - -from osf.utils.permissions import READ -from website.notifications import constants -from website.notifications.exceptions import InvalidSubscriptionError -from website.project import signals - -class NotificationsDict(dict): - def __init__(self): - super().__init__() - self.update(messages=[], children=collections.defaultdict(NotificationsDict)) - - def add_message(self, keys, messages): - """ - :param keys: ordered list of project ids from parent to node (e.g. ['parent._id', 'node._id']) - :param messages: built email message for an event that occurred on the node - :return: nested dict with project/component ids as the keys with the message at the appropriate level - """ - d_to_use = self - - for key in keys: - d_to_use = d_to_use['children'][key] - - if not isinstance(messages, list): - messages = [messages] - - d_to_use['messages'].extend(messages) - - -def find_subscription_type(subscription): - """Find subscription type string within specific subscription. - Essentially removes extraneous parts of the string to get the type. - """ - subs_available = list(constants.USER_SUBSCRIPTIONS_AVAILABLE.keys()) - subs_available.extend(list(constants.NODE_SUBSCRIPTIONS_AVAILABLE.keys())) - for available in subs_available: - if available in subscription: - return available - - -def to_subscription_key(uid, event): - """Build the Subscription primary key for the given guid and event""" - return f'{uid}_{event}' - - -def from_subscription_key(key): - parsed_key = key.split('_', 1) - return { - 'uid': parsed_key[0], - 'event': parsed_key[1] - } - - -@signals.contributor_removed.connect -def remove_contributor_from_subscriptions(node, user): - """ Remove contributor from node subscriptions unless the user is an - admin on any of node's parent projects. - """ - Preprint = apps.get_model('osf.Preprint') - DraftRegistration = apps.get_model('osf.DraftRegistration') - # Preprints don't have subscriptions at this time - if isinstance(node, Preprint): - return - if isinstance(node, DraftRegistration): - return - - # If user still has permissions through being a contributor or group member, or has - # admin perms on a parent, don't remove their subscription - if not (node.is_contributor_or_group_member(user)) and user._id not in node.admin_contributor_or_group_member_ids: - node_subscriptions = get_all_node_subscriptions(user, node) - for subscription in node_subscriptions: - subscription.objects.filter( - user=user, - ).delete() - -def separate_users(node, user_ids): - """Separates users into ones with permissions and ones without given a list. - :param node: Node to separate based on permissions - :param user_ids: List of ids, will also take and return User instances - :return: list of subbed, list of removed user ids - """ - OSFUser = apps.get_model('osf.OSFUser') - removed = [] - subbed = [] - for user_id in user_ids: - try: - user = OSFUser.load(user_id) - except TypeError: - user = user_id - if node.has_permission(user, READ): - subbed.append(user_id) - else: - removed.append(user_id) - return subbed, removed - - -def users_to_remove(source_event, source_node, new_node): - """Find users that do not have permissions on new_node. - :param source_event: such as _file_updated - :param source_node: Node instance where a subscription currently resides - :param new_node: Node instance where a sub or new sub will be. - :return: Dict of notification type lists with user_ids - """ - NotificationSubscription = apps.get_model('osf.NotificationSubscription') - removed_users = {key: [] for key in constants.NOTIFICATION_TYPES} - if source_node == new_node: - return removed_users - old_sub = NotificationSubscription.load(to_subscription_key(source_node._id, source_event)) - old_node_sub = NotificationSubscription.load(to_subscription_key(source_node._id, - '_'.join(source_event.split('_')[-2:]))) - if not old_sub and not old_node_sub: - return removed_users - for notification_type in constants.NOTIFICATION_TYPES: - users = [] - if hasattr(old_sub, notification_type): - users += list(getattr(old_sub, notification_type).values_list('guids___id', flat=True)) - if hasattr(old_node_sub, notification_type): - users += list(getattr(old_node_sub, notification_type).values_list('guids___id', flat=True)) - subbed, removed_users[notification_type] = separate_users(new_node, users) - return removed_users - - -def move_subscription(remove_users, source_event, source_node, new_event, new_node): - """Moves subscription from old_node to new_node - :param remove_users: dictionary of lists of users to remove from the subscription - :param source_event: A specific guid event _file_updated - :param source_node: Instance of Node - :param new_event: A specific guid event - :param new_node: Instance of Node - :return: Returns a NOTIFICATION_TYPES list of removed users without permissions - """ - NotificationSubscription = apps.get_model('osf.NotificationSubscription') - if source_node == new_node: - return - old_sub = NotificationSubscription.load(to_subscription_key(source_node._id, source_event)) - if not old_sub: - return - elif old_sub: - old_sub._id = to_subscription_key(new_node._id, new_event) - old_sub.event_name = new_event - old_sub.owner = new_node - new_sub = old_sub - new_sub.save() - # Remove users that don't have permission on the new node. - for notification_type in constants.NOTIFICATION_TYPES: - if new_sub: - for user_id in remove_users[notification_type]: - related_manager = getattr(new_sub, notification_type, None) - subscriptions = related_manager.all() if related_manager else [] - if user_id in subscriptions: - new_sub.delete() - - -def get_configured_projects(user): - """Filter all user subscriptions for ones that are on parent projects - and return the node objects. - :param user: OSFUser object - :return: list of node objects for projects with no parent - """ - configured_projects = set() - user_subscriptions = get_all_user_subscriptions(user, extra=( - ~Q(node__type='osf.collection') & - Q(node__is_deleted=False) - )) - - for subscription in user_subscriptions: - # If the user has opted out of emails skip - node = subscription.subscribed_object - - if subscription.message_frequency == 'none': - continue - - root = node.root - - if not root.is_deleted: - configured_projects.add(root) - - return sorted(configured_projects, key=lambda n: n.title.lower()) - - -def check_project_subscriptions_are_all_none(user, node): - node_subscriptions = get_all_node_subscriptions(user, node) - for s in node_subscriptions: - if not s.none.filter(id=user.id).exists(): - return False - return True - - -def get_all_user_subscriptions(user, extra=None): - """ Get all Subscription objects that the user is subscribed to""" - NotificationSubscription = apps.get_model('osf.NotificationSubscription') - queryset = NotificationSubscription.objects.filter( - Q(none=user.pk) | - Q(email_digest=user.pk) | - Q(email_transactional=user.pk) - ).distinct() - return queryset.filter(extra) if extra else queryset - - -def get_all_node_subscriptions(user, node, user_subscriptions=None): - """ Get all Subscription objects for a node that the user is subscribed to - :param user: OSFUser object - :param node: Node object - :param user_subscriptions: all Subscription objects that the user is subscribed to - :return: list of Subscription objects for a node that the user is subscribed to - """ - if not user_subscriptions: - user_subscriptions = get_all_user_subscriptions(user) - return user_subscriptions.filter(user__isnull=True, node=node) - - -def format_data(user, nodes): - """ Format subscriptions data for project settings page - :param user: OSFUser object - :param nodes: list of parent project node objects - :return: treebeard-formatted data - """ - items = [] - - user_subscriptions = get_all_user_subscriptions(user) - for node in nodes: - assert node, f'{node._id} is not a valid Node.' - - can_read = node.has_permission(user, READ) - can_read_children = node.has_permission_on_children(user, READ) - - if not can_read and not can_read_children: - continue - - children = node.get_nodes(**{'is_deleted': False, 'is_node_link': False}) - children_tree = [] - # List project/node if user has at least READ permissions (contributor or admin viewer) or if - # user is contributor on a component of the project/node - - if can_read: - node_sub_available = list(constants.NODE_SUBSCRIPTIONS_AVAILABLE.keys()) - subscriptions = get_all_node_subscriptions( - user, - node, - user_subscriptions=user_subscriptions).filter(notification_type__name__in=node_sub_available) - - for subscription in subscriptions: - index = node_sub_available.index(getattr(subscription, 'event_name')) - children_tree.append(serialize_event(user, subscription=subscription, - node=node, event_description=node_sub_available.pop(index))) - for node_sub in node_sub_available: - children_tree.append(serialize_event(user, node=node, event_description=node_sub)) - children_tree.sort(key=lambda s: s['event']['title']) - - children_tree.extend(format_data(user, children)) - - item = { - 'node': { - 'id': node._id, - 'url': node.url if can_read else '', - 'title': node.title if can_read else 'Private Project', - }, - 'children': children_tree, - 'kind': 'folder' if not node.parent_node or not node.parent_node.has_permission(user, READ) else 'node', - 'nodeType': node.project_or_component, - 'category': node.category, - 'permissions': { - 'view': can_read, - }, - } - - items.append(item) - - return items - - -def format_user_subscriptions(user): - """ Format user-level subscriptions (e.g. comment replies across the OSF) for user settings page""" - user_subs_available = list(constants.USER_SUBSCRIPTIONS_AVAILABLE.keys()) - subscriptions = [ - serialize_event( - user, subscription, - event_description=user_subs_available.pop(user_subs_available.index(getattr(subscription, 'event_name'))) - ) - for subscription in get_all_user_subscriptions(user) - if subscription is not None and getattr(subscription, 'event_name') in user_subs_available - ] - subscriptions.extend([serialize_event(user, event_description=sub) for sub in user_subs_available]) - return subscriptions - - -def format_file_subscription(user, node_id, path, provider): - """Format a single file event""" - AbstractNode = apps.get_model('osf.AbstractNode') - node = AbstractNode.load(node_id) - wb_path = path.lstrip('/') - for subscription in get_all_node_subscriptions(user, node): - if wb_path in getattr(subscription, 'event_name'): - return serialize_event(user, subscription, node) - return serialize_event(user, node=node, event_description='file_updated') - - -all_subs = constants.NODE_SUBSCRIPTIONS_AVAILABLE.copy() -all_subs.update(constants.USER_SUBSCRIPTIONS_AVAILABLE) - -def serialize_event(user, subscription=None, node=None, event_description=None): - """ - :param user: OSFUser object - :param subscription: Subscription object, use if parsing particular subscription - :param node: Node object, use if node is known - :param event_description: use if specific subscription is known - :return: treebeard-formatted subscription event - """ - if not event_description: - event_description = getattr(subscription, 'event_name') - # Looks at only the types available. Deals with pre-pending file names. - for sub_type in all_subs: - if sub_type in event_description: - event_type = sub_type - else: - event_type = event_description - if node and node.parent_node: - notification_type = 'adopt_parent' - elif event_type.startswith('global_'): - notification_type = 'email_transactional' - else: - notification_type = 'none' - if subscription: - for n_type in constants.NOTIFICATION_TYPES: - if getattr(subscription, n_type).filter(id=user.id).exists(): - notification_type = n_type - return { - 'event': { - 'title': event_description, - 'description': all_subs[event_type], - 'notificationType': notification_type, - 'parent_notification_type': get_parent_notification_type(node, event_type, user) - }, - 'kind': 'event', - 'children': [] - } - - -def get_parent_notification_type(node, event, user): - """ - Given an event on a node (e.g. comment on node 'xyz'), find the user's notification - type on the parent project for the same event. - :param obj node: event owner (Node or User object) - :param str event: notification event (e.g. 'comment_replies') - :param obj user: OSFUser object - :return: str notification type (e.g. 'email_transactional') - """ - AbstractNode = apps.get_model('osf.AbstractNode') - NotificationSubscription = apps.get_model('osf.NotificationSubscription') - - if node and isinstance(node, AbstractNode) and node.parent_node and node.parent_node.has_permission(user, READ): - parent = node.parent_node - key = to_subscription_key(parent._id, event) - try: - subscription = NotificationSubscription.objects.get(_id=key) - except NotificationSubscription.DoesNotExist: - return get_parent_notification_type(parent, event, user) - - for notification_type in constants.NOTIFICATION_TYPES: - if getattr(subscription, notification_type).filter(id=user.id).exists(): - return notification_type - else: - return get_parent_notification_type(parent, event, user) - else: - return None - - -def get_global_notification_type(global_subscription, user): - """ - Given a global subscription (e.g. NotificationSubscription object with event_type - 'global_file_updated'), find the user's notification type. - :param obj global_subscription: NotificationSubscription object - :param obj user: OSFUser object - :return: str notification type (e.g. 'email_transactional') - """ - for notification_type in constants.NOTIFICATION_TYPES: - # TODO Optimize me - if getattr(global_subscription, notification_type).filter(id=user.id).exists(): - return notification_type - - -def check_if_all_global_subscriptions_are_none(user): - # This function predates comment mentions, which is a global_ notification that cannot be disabled - # Therefore, an actual check would never return True. - # If this changes, an optimized query would look something like: - # not NotificationSubscription.objects.filter(Q(event_name__startswith='global_') & (Q(email_digest=user.pk)|Q(email_transactional=user.pk))).exists() - return False - - -def subscribe_user_to_global_notifications(user): - NotificationSubscription = apps.get_model('osf.NotificationSubscription') - notification_type = 'email_transactional' - user_events = constants.USER_SUBSCRIPTIONS_AVAILABLE - for user_event in user_events: - user_event_id = to_subscription_key(user._id, user_event) - - # get_or_create saves on creation - subscription, created = NotificationSubscription.objects.get_or_create(_id=user_event_id, user=user, event_name=user_event) - subscription.add_user_to_subscription(user, notification_type) - subscription.save() - - -def subscribe_user_to_notifications(node, user): - """ Update the notification settings for the creator or contributors - :param user: User to subscribe to notifications - """ - NotificationSubscription = apps.get_model('osf.NotificationSubscription') - Preprint = apps.get_model('osf.Preprint') - DraftRegistration = apps.get_model('osf.DraftRegistration') - if isinstance(node, Preprint): - raise InvalidSubscriptionError('Preprints are invalid targets for subscriptions at this time.') - - if isinstance(node, DraftRegistration): - raise InvalidSubscriptionError('DraftRegistrations are invalid targets for subscriptions at this time.') - - if node.is_collection: - raise InvalidSubscriptionError('Collections are invalid targets for subscriptions') - - if node.is_deleted: - raise InvalidSubscriptionError('Deleted Nodes are invalid targets for subscriptions') - - if getattr(node, 'is_registration', False): - raise InvalidSubscriptionError('Registrations are invalid targets for subscriptions') - - events = constants.NODE_SUBSCRIPTIONS_AVAILABLE - notification_type = 'email_transactional' - target_id = node._id - - if user.is_registered: - for event in events: - event_id = to_subscription_key(target_id, event) - global_event_id = to_subscription_key(user._id, 'global_' + event) - global_subscription = NotificationSubscription.load(global_event_id) - - subscription = NotificationSubscription.load(event_id) - - # If no subscription for component and creator is the user, do not create subscription - # If no subscription exists for the component, this means that it should adopt its - # parent's settings - if not (node and node.parent_node and not subscription and node.creator == user): - if not subscription: - subscription = NotificationSubscription(_id=event_id, owner=node, event_name=event) - # Need to save here in order to access m2m fields - subscription.save() - if global_subscription: - global_notification_type = get_global_notification_type(global_subscription, user) - subscription.add_user_to_subscription(user, global_notification_type) - else: - subscription.add_user_to_subscription(user, notification_type) - subscription.save() - - -def format_user_and_project_subscriptions(user): - """ Format subscriptions data for user settings page. """ - return [ - { - 'node': { - 'id': user._id, - 'title': 'Default Notification Settings', - 'help': 'These are default settings for new projects you create ' + - 'or are added to. Modifying these settings will not ' + - 'modify settings on existing projects.' - }, - 'kind': 'heading', - 'children': format_user_subscriptions(user) - }, - { - 'node': { - 'id': '', - 'title': 'Project Notifications', - 'help': 'These are settings for each of your projects. Modifying ' + - 'these settings will only modify the settings for the selected project.' - }, - 'kind': 'heading', - 'children': format_data(user, get_configured_projects(user)) - }] diff --git a/website/notifications/views.py b/website/notifications/views.py deleted file mode 100644 index 700594f69d6..00000000000 --- a/website/notifications/views.py +++ /dev/null @@ -1,540 +0,0 @@ -from django.contrib.contenttypes.models import ContentType -from rest_framework import status as http_status - -from flask import request - -from framework import sentry -from framework.auth.decorators import must_be_logged_in -from framework.exceptions import HTTPError - -from osf.models import AbstractNode, Registration, Node - -NOTIFICATION_TYPES = {} -USER_SUBSCRIPTIONS_AVAILABLE = {} -NODE_SUBSCRIPTIONS_AVAILABLE = {} -from website.project.decorators import must_be_valid_project -import collections - -from django.apps import apps -from django.db.models import Q - -from osf.models import NotificationSubscription -from osf.utils.permissions import READ - - -class NotificationsDict(dict): - def __init__(self): - super().__init__() - self.update(messages=[], children=collections.defaultdict(NotificationsDict)) - - def add_message(self, keys, messages): - """ - :param keys: ordered list of project ids from parent to node (e.g. ['parent._id', 'node._id']) - :param messages: built email message for an event that occurred on the node - :return: nested dict with project/component ids as the keys with the message at the appropriate level - """ - d_to_use = self - - for key in keys: - d_to_use = d_to_use['children'][key] - - if not isinstance(messages, list): - messages = [messages] - - d_to_use['messages'].extend(messages) - - -def find_subscription_type(subscription): - """Find subscription type string within specific subscription. - Essentially removes extraneous parts of the string to get the type. - """ - subs_available = list(USER_SUBSCRIPTIONS_AVAILABLE.keys()) - subs_available.extend(list(NODE_SUBSCRIPTIONS_AVAILABLE.keys())) - for available in subs_available: - if available in subscription: - return available - - -def to_subscription_key(uid, event): - """Build the Subscription primary key for the given guid and event""" - return f'{uid}_{event}' - - -def from_subscription_key(key): - parsed_key = key.split('_', 1) - return { - 'uid': parsed_key[0], - 'event': parsed_key[1] - } - - -def users_to_remove(source_event, source_node, new_node): - """Find users that do not have permissions on new_node. - :param source_event: such as _file_updated - :param source_node: Node instance where a subscription currently resides - :param new_node: Node instance where a sub or new sub will be. - :return: Dict of notification type lists with user_ids - """ - NotificationSubscription = apps.get_model('osf.NotificationSubscription') - removed_users = {key: [] for key in NOTIFICATION_TYPES} - if source_node == new_node: - return removed_users - old_sub = NotificationSubscription.objects.get( - subscribed_object=source_node, - notification_type__name=source_event - ) - for notification_type in NOTIFICATION_TYPES: - users = [] - if hasattr(old_sub, notification_type): - users += list(getattr(old_sub, notification_type).values_list('guids___id', flat=True)) - return removed_users - - -def move_subscription(remove_users, source_event, source_node, new_event, new_node): - """Moves subscription from old_node to new_node - :param remove_users: dictionary of lists of users to remove from the subscription - :param source_event: A specific guid event _file_updated - :param source_node: Instance of Node - :param new_event: A specific guid event - :param new_node: Instance of Node - :return: Returns a NOTIFICATION_TYPES list of removed users without permissions - """ - NotificationSubscription = apps.get_model('osf.NotificationSubscription') - OSFUser = apps.get_model('osf.OSFUser') - if source_node == new_node: - return - old_sub = NotificationSubscription.load(to_subscription_key(source_node._id, source_event)) - if not old_sub: - return - elif old_sub: - old_sub._id = to_subscription_key(new_node._id, new_event) - old_sub.event_name = new_event - old_sub.owner = new_node - new_sub = old_sub - new_sub.save() - # Remove users that don't have permission on the new node. - for notification_type in NOTIFICATION_TYPES: - if new_sub: - for user_id in remove_users[notification_type]: - related_manager = getattr(new_sub, notification_type, None) - subscriptions = related_manager.all() if related_manager else [] - if user_id in subscriptions: - user = OSFUser.load(user_id) - new_sub.remove_user_from_subscription(user) - - -def get_configured_projects(user): - """Filter all user subscriptions for ones that are on parent projects - and return the node objects. - :param user: OSFUser object - :return: list of node objects for projects with no parent - """ - configured_projects = set() - user_subscriptions = get_all_user_subscriptions(user, extra=( - ~Q(node__type='osf.collection') & - Q(node__is_deleted=False) - )) - - for subscription in user_subscriptions: - # If the user has opted out of emails skip - node = subscription.subscribed_object - - if subscription.message_frequency == 'none': - continue - if isinstance(node, Node): - root = node.root - - if not root.is_deleted: - configured_projects.add(root) - - return sorted(configured_projects, key=lambda n: n.title.lower()) - - -def check_project_subscriptions_are_all_none(user, node): - node_subscriptions = NotificationSubscription.objects.filter( - user=user, - object_id=node.id, - content_type=ContentType.objects.get_for_model(node).id, - ) - for s in node_subscriptions: - if not s.message_frequecy == 'none': - return False - return True - - -def get_all_user_subscriptions(user, extra=None): - """ Get all Subscription objects that the user is subscribed to""" - NotificationSubscription = apps.get_model('osf.NotificationSubscription') - return NotificationSubscription.objects.filter( - user=user, - ) - - -def get_all_node_subscriptions(user, node, user_subscriptions=None): - """ Get all Subscription objects for a node that the user is subscribed to - :param user: OSFUser object - :param node: Node object - :param user_subscriptions: all Subscription objects that the user is subscribed to - :return: list of Subscription objects for a node that the user is subscribed to - """ - if not user_subscriptions: - user_subscriptions = get_all_user_subscriptions(user) - return user_subscriptions.filter( - object_id=node.id, - content_type=ContentType.objects.get_for_model(node).id, - ) - - -def format_data(user, nodes): - """ Format subscriptions data for project settings page - :param user: OSFUser object - :param nodes: list of parent project node objects - :return: treebeard-formatted data - """ - items = [] - - user_subscriptions = get_all_user_subscriptions(user) - for node in nodes: - assert node, f'{node._id} is not a valid Node.' - - can_read = node.has_permission(user, READ) - can_read_children = node.has_permission_on_children(user, READ) - - if not can_read and not can_read_children: - continue - - children = node.get_nodes(**{'is_deleted': False, 'is_node_link': False}) - children_tree = [] - # List project/node if user has at least READ permissions (contributor or admin viewer) or if - # user is contributor on a component of the project/node - - if can_read: - node_sub_available = list(NODE_SUBSCRIPTIONS_AVAILABLE.keys()) - subscriptions = get_all_node_subscriptions( - user, - node, - user_subscriptions=user_subscriptions - ).filter( - notification_type__name__in=node_sub_available - ) - - for subscription in subscriptions: - index = node_sub_available.index(getattr(subscription, 'event_name')) - children_tree.append(serialize_event(user, subscription=subscription, - node=node, event_description=node_sub_available.pop(index))) - for node_sub in node_sub_available: - children_tree.append(serialize_event(user, node=node, event_description=node_sub)) - children_tree.sort(key=lambda s: s['event']['title']) - - children_tree.extend(format_data(user, children)) - - item = { - 'node': { - 'id': node._id, - 'url': node.url if can_read else '', - 'title': node.title if can_read else 'Private Project', - }, - 'children': children_tree, - 'kind': 'folder' if not node.parent_node or not node.parent_node.has_permission(user, READ) else 'node', - 'nodeType': node.project_or_component, - 'category': node.category, - 'permissions': { - 'view': can_read, - }, - } - - items.append(item) - - return items - - -def format_user_subscriptions(user): - """ Format user-level subscriptions (e.g. comment replies across the OSF) for user settings page""" - user_subs_available = list(USER_SUBSCRIPTIONS_AVAILABLE.keys()) - subscriptions = [ - serialize_event( - user, subscription, - event_description=user_subs_available.pop(user_subs_available.index(getattr(subscription, 'event_name'))) - ) - for subscription in get_all_user_subscriptions(user) - if subscription is not None in user_subs_available - ] - subscriptions.extend([serialize_event(user, event_description=sub) for sub in user_subs_available]) - return subscriptions - - -def format_file_subscription(user, node_id, path, provider): - """Format a single file event""" - AbstractNode = apps.get_model('osf.AbstractNode') - node = AbstractNode.load(node_id) - wb_path = path.lstrip('/') - for subscription in get_all_node_subscriptions(user, node): - if wb_path in getattr(subscription, 'event_name'): - return serialize_event(user, subscription, node) - return serialize_event(user, node=node, event_description='file_updated') - -def serialize_event(user, subscription=None, node=None, event_description=None): - """ - :param user: OSFUser object - :param subscription: Subscription object, use if parsing particular subscription - :param node: Node object, use if node is known - :param event_description: use if specific subscription is known - :return: treebeard-formatted subscription event - """ - if not event_description: - event_description = getattr(subscription, 'event_name') - # Looks at only the types available. Deals with pre-pending file names. - for sub_type in {}: - if sub_type in event_description: - event_type = sub_type - else: - event_type = event_description - if node and node.parent_node: - notification_type = 'adopt_parent' - elif event_type.startswith('global_'): - notification_type = 'email_transactional' - else: - notification_type = 'none' - if subscription: - for n_type in {}: - if getattr(subscription, n_type).filter(id=user.id).exists(): - notification_type = n_type - return { - 'event': { - 'title': event_description, - 'description': {}[event_type], - 'notificationType': notification_type, - 'parent_notification_type': get_parent_notification_type(node, event_type, user) - }, - 'kind': 'event', - 'children': [] - } - - -def get_parent_notification_type(node, event, user): - """ - Given an event on a node (e.g. comment on node 'xyz'), find the user's notification - type on the parent project for the same event. - :param obj node: event owner (Node or User object) - :param str event: notification event (e.g. 'comment_replies') - :param obj user: OSFUser object - :return: str notification type (e.g. 'email_transactional') - """ - AbstractNode = apps.get_model('osf.AbstractNode') - NotificationSubscriptionLegacy = apps.get_model('osf.NotificationSubscriptionLegacy') - - if node and isinstance(node, AbstractNode) and node.parent_node and node.parent_node.has_permission(user, READ): - parent = node.parent_node - key = to_subscription_key(parent._id, event) - try: - subscription = NotificationSubscriptionLegacy.objects.get(_id=key) - except NotificationSubscriptionLegacy.DoesNotExist: - return get_parent_notification_type(parent, event, user) - - for notification_type in NOTIFICATION_TYPES: - if getattr(subscription, notification_type).filter(id=user.id).exists(): - return notification_type - else: - return get_parent_notification_type(parent, event, user) - else: - return None - - -def get_global_notification_type(global_subscription, user): - """ - Given a global subscription (e.g. NotificationSubscription object with event_type - 'global_file_updated'), find the user's notification type. - :param obj global_subscription: NotificationSubscription object - :param obj user: OSFUser object - :return: str notification type (e.g. 'email_transactional') - """ - for notification_type in NOTIFICATION_TYPES: - # TODO Optimize me - if getattr(global_subscription, notification_type).filter(id=user.id).exists(): - return notification_type - - -def check_if_all_global_subscriptions_are_none(user): - # This function predates comment mentions, which is a global_ notification that cannot be disabled - # Therefore, an actual check would never return True. - # If this changes, an optimized query would look something like: - # not NotificationSubscriptionLegacy.objects.filter(Q(event_name__startswith='global_') & (Q(email_digest=user.pk)|Q(email_transactional=user.pk))).exists() - return False - - -def subscribe_user_to_global_notifications(user): - NotificationSubscriptionLegacy = apps.get_model('osf.NotificationSubscriptionLegacy') - notification_type = 'email_transactional' - user_events = USER_SUBSCRIPTIONS_AVAILABLE - for user_event in user_events: - user_event_id = to_subscription_key(user._id, user_event) - - # get_or_create saves on creation - subscription, created = NotificationSubscriptionLegacy.objects.get_or_create(_id=user_event_id, user=user, event_name=user_event) - subscription.add_user_to_subscription(user, notification_type) - subscription.save() - - -class InvalidSubscriptionError: - pass - - -def subscribe_user_to_notifications(node, user): - """ Update the notification settings for the creator or contributors - :param user: User to subscribe to notifications - """ - NotificationSubscription = apps.get_model('osf.NotificationSubscription') - Preprint = apps.get_model('osf.Preprint') - DraftRegistration = apps.get_model('osf.DraftRegistration') - if isinstance(node, Preprint): - raise InvalidSubscriptionError('Preprints are invalid targets for subscriptions at this time.') - - if isinstance(node, DraftRegistration): - raise InvalidSubscriptionError('DraftRegistrations are invalid targets for subscriptions at this time.') - - if node.is_collection: - raise InvalidSubscriptionError('Collections are invalid targets for subscriptions') - - if node.is_deleted: - raise InvalidSubscriptionError('Deleted Nodes are invalid targets for subscriptions') - - if getattr(node, 'is_registration', False): - raise InvalidSubscriptionError('Registrations are invalid targets for subscriptions') - - events = NODE_SUBSCRIPTIONS_AVAILABLE - - if user.is_registered: - for event in events: - subscription, _ = NotificationSubscription.objects.get_or_create( - user=user, - notification_type__name=event - ) - - -def format_user_and_project_subscriptions(user): - """ Format subscriptions data for user settings page. """ - return [ - { - 'node': { - 'id': user._id, - 'title': 'Default Notification Settings', - 'help': 'These are default settings for new projects you create ' + - 'or are added to. Modifying these settings will not ' + - 'modify settings on existing projects.' - }, - 'kind': 'heading', - 'children': format_user_subscriptions(user) - }, - { - 'node': { - 'id': '', - 'title': 'Project Notifications', - 'help': 'These are settings for each of your projects. Modifying ' + - 'these settings will only modify the settings for the selected project.' - }, - 'kind': 'heading', - 'children': format_data(user, get_configured_projects(user)) - }] - - -@must_be_logged_in -def get_subscriptions(auth): - return format_user_and_project_subscriptions(auth.user) - - -@must_be_logged_in -@must_be_valid_project -def get_node_subscriptions(auth, **kwargs): - node = kwargs.get('node') or kwargs['project'] - return format_data(auth.user, [node]) - - -@must_be_logged_in -def get_file_subscriptions(auth, **kwargs): - node_id = request.args.get('node_id') - path = request.args.get('path') - provider = request.args.get('provider') - return format_file_subscription(auth.user, node_id, path, provider) - - -@must_be_logged_in -def configure_subscription(auth): - user = auth.user - json_data = request.get_json() - target_id = json_data.get('id') - event = json_data.get('event') - notification_type = json_data.get('notification_type') - path = json_data.get('path') - provider = json_data.get('provider') - - if not event or (notification_type not in NOTIFICATION_TYPES and notification_type != 'adopt_parent'): - raise HTTPError(http_status.HTTP_400_BAD_REQUEST, data=dict( - message_long='Must provide an event and notification type for subscription.') - ) - - node = AbstractNode.load(target_id) - if 'file_updated' in event and path is not None and provider is not None: - wb_path = path.lstrip('/') - event = wb_path + '_file_updated' - event_id = to_subscription_key(target_id, event) - - if not node: - # if target_id is not a node it currently must be the current user - if not target_id == user._id: - sentry.log_message( - '{!r} attempted to subscribe to either a bad ' - 'id or non-node non-self id, {}'.format(user, target_id) - ) - raise HTTPError(http_status.HTTP_404_NOT_FOUND) - - if notification_type == 'adopt_parent': - sentry.log_message( - f'{user!r} attempted to adopt_parent of a none node id, {target_id}' - ) - raise HTTPError(http_status.HTTP_400_BAD_REQUEST) - # owner = user - else: - if not node.has_permission(user, READ): - sentry.log_message(f'{user!r} attempted to subscribe to private node, {target_id}') - raise HTTPError(http_status.HTTP_403_FORBIDDEN) - - if isinstance(node, Registration): - sentry.log_message( - f'{user!r} attempted to subscribe to registration, {target_id}' - ) - raise HTTPError(http_status.HTTP_400_BAD_REQUEST) - - if notification_type != 'adopt_parent': - pass - # owner = node - else: - if 'file_updated' in event and len(event) > len('file_updated'): - pass - else: - parent = node.parent_node - if not parent: - sentry.log_message( - '{!r} attempted to adopt_parent of ' - 'the parentless project, {!r}'.format(user, node) - ) - raise HTTPError(http_status.HTTP_400_BAD_REQUEST) - - # If adopt_parent make sure that this subscription is None for the current User - subscription, _ = NotificationSubscription.objects.get_or_create( - user=user, - subscribed_object=node, - notification_type__name=event - ) - if not subscription: - return {} # We're done here - - subscription.delete() - return {} - - subscription, _ = NotificationSubscription.objects.get_or_create( - user=user, - notification_type__name=event - ) - subscription.save() - - return {'message': f'Successfully subscribed to {notification_type} list on {event_id}'} diff --git a/website/profile/views.py b/website/profile/views.py index 42d5590f212..a08a586742e 100644 --- a/website/profile/views.py +++ b/website/profile/views.py @@ -25,7 +25,7 @@ from framework.status import push_status_message from framework.utils import throttle_period_expired -from osf.models import ApiOAuth2Application, ApiOAuth2PersonalToken, OSFUser, NotificationType +from osf.models import ApiOAuth2Application, ApiOAuth2PersonalToken, OSFUser, NotificationTypeEnum from osf.exceptions import BlockedEmailError, OSFError from osf.utils.requests import string_type_request_headers from website import mailchimp_utils @@ -185,13 +185,12 @@ def update_user(auth): # make sure the new username has already been confirmed if username and username != user.username and user.emails.filter(address=username).exists(): - NotificationType.Type.USER_PRIMARY_EMAIL_CHANGED.instance.emit( + NotificationTypeEnum.USER_PRIMARY_EMAIL_CHANGED.instance.emit( subscribed_object=user, user=user, event_context={ 'user_fullname': user.fullname, 'new_address': username, - 'can_change_preferences': False, 'osf_contact_email': settings.OSF_CONTACT_EMAIL, } ) @@ -784,13 +783,12 @@ def request_export(auth): data={'message_long': 'Too many requests. Please wait a while before sending another account export request.', 'error_type': 'throttle_error'}) - NotificationType.Type.DESK_REQUEST_EXPORT.instance.emit( + NotificationTypeEnum.DESK_REQUEST_EXPORT.instance.emit( user=user, event_context={ 'user_username': user.username, 'user_absolute_url': user.absolute_url, 'user__id': user._id, - 'can_change_preferences': False, } ) user.email_last_sent = timezone.now() diff --git a/website/project/views/contributor.py b/website/project/views/contributor.py index 6315452cda9..9ad43fa0304 100644 --- a/website/project/views/contributor.py +++ b/website/project/views/contributor.py @@ -26,7 +26,7 @@ Preprint, PreprintProvider, RecentlyAddedContributor, - NotificationType + NotificationTypeEnum ) from osf.utils import sanitize from osf.utils.permissions import ADMIN @@ -214,7 +214,7 @@ def finalize_invitation( node, contributor, auth, - notification_type=NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT + notification_type=NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT ): try: record = contributor.get_unclaimed_record(node._primary_key) @@ -436,7 +436,7 @@ def send_claim_registered_email(claimer, unclaimed_user, node, throttle=24 * 360 ) if check_email_throttle( referrer, - notification_type=NotificationType.Type.USER_FORWARD_INVITE_REGISTERED, + notification_type=NotificationTypeEnum.USER_FORWARD_INVITE_REGISTERED, throttle=throttle ): raise HTTPError( @@ -447,29 +447,24 @@ def send_claim_registered_email(claimer, unclaimed_user, node, throttle=24 * 360 ) # Send mail to referrer, telling them to forward verification link to claimer - NotificationType.Type.USER_FORWARD_INVITE_REGISTERED.instance.emit( + NotificationTypeEnum.USER_FORWARD_INVITE_REGISTERED.instance.emit( user=referrer, event_context={ 'claim_url': claim_url, 'referrer_fullname': referrer.fullname, 'user_fullname': unclaimed_record['name'], 'node_title': node.title, - 'can_change_preferences': False, 'osf_contact_email': settings.OSF_CONTACT_EMAIL, } ) # Send mail to claimer, telling them to wait for referrer - NotificationType.Type.USER_PENDING_VERIFICATION_REGISTERED.instance.emit( + NotificationTypeEnum.USER_PENDING_VERIFICATION_REGISTERED.instance.emit( subscribed_object=claimer, user=claimer, event_context={ - 'claim_url': claim_url, 'user_fullname': unclaimed_record['name'], - 'referrer_username': referrer.username, 'referrer_fullname': referrer.fullname, 'node_title': node.title, - 'can_change_preferences': False, - 'osf_contact_email': settings.OSF_CONTACT_EMAIL, } ) @@ -479,7 +474,7 @@ def send_claim_email( node, notify=True, throttle=24 * 3600, - notification_type=NotificationType.Type.NODE_CONTRIBUTOR_ADDED_DEFAULT + notification_type=NotificationTypeEnum.NODE_CONTRIBUTOR_ADDED_DEFAULT ): """ Send a claim email to an unregistered contributor or the referrer, depending on the scenario. @@ -508,15 +503,15 @@ def send_claim_email( match notification_type: case 'preprint': if getattr(node.provider, 'is_default', False): - notification_type = NotificationType.Type.USER_INVITE_OSF_PREPRINT + notification_type = NotificationTypeEnum.USER_INVITE_OSF_PREPRINT logo = settings.OSF_PREPRINTS_LOGO else: - notification_type = NotificationType.Type.PROVIDER_USER_INVITE_PREPRINT + notification_type = NotificationTypeEnum.PROVIDER_USER_INVITE_PREPRINT logo = getattr(node.provider, '_id', None) case 'draft_registration': - notification_type = NotificationType.Type.DRAFT_REGISTRATION_CONTRIBUTOR_ADDED_DEFAULT + notification_type = NotificationTypeEnum.DRAFT_REGISTRATION_CONTRIBUTOR_ADDED_DEFAULT case _: - notification_type = NotificationType.Type.USER_INVITE_DEFAULT + notification_type = NotificationTypeEnum.USER_INVITE_DEFAULT unclaimed_record['claimer_email'] = claimer_email unclaimed_user.save() @@ -539,7 +534,7 @@ def send_claim_email( unclaimed_user.save() if notify: - NotificationType.Type.USER_PENDING_VERIFICATION.instance.emit( + NotificationTypeEnum.USER_PENDING_VERIFICATION.instance.emit( subscribed_object=unclaimed_user, user=unclaimed_user, event_context={ @@ -547,26 +542,21 @@ def send_claim_email( 'user_fullname': unclaimed_record['name'], 'node_title': node.title, 'logo': logo, - 'can_change_preferences': False, + 'node_absolute_url': node.absolute_url, 'osf_contact_email': settings.OSF_CONTACT_EMAIL, } ) - notification_type = NotificationType.Type.USER_FORWARD_INVITE + notification_type = NotificationTypeEnum.USER_FORWARD_INVITE claim_url = unclaimed_user.get_claim_url(node._primary_key, external=True) notification_type.instance.emit( user=referrer, destination_address=email, event_context={ - 'user_fullname': referrer.id, - 'referrer_name': referrer.fullname, + 'user_fullname': unclaimed_record['name'], 'referrer_fullname': referrer.fullname, - 'fullname': unclaimed_record['name'], - 'node_url': node.url, - 'logo': logo, 'claim_url': claim_url, - 'can_change_preferences': False, 'domain': settings.DOMAIN, 'node_absolute_url': node.absolute_url, 'node_title': node.title, @@ -626,7 +616,7 @@ def notify_added_contributor(resource, contributor, notification_type, auth=None logo = settings.OSF_LOGO if getattr(resource, 'has_linked_published_preprints', None): - notification_type = NotificationType.Type.PREPRINT_CONTRIBUTOR_ADDED_PREPRINT_NODE_FROM_OSF + notification_type = NotificationTypeEnum.PREPRINT_CONTRIBUTOR_ADDED_PREPRINT_NODE_FROM_OSF logo = settings.OSF_PREPRINTS_LOGO throttle = kwargs.get('throttle', settings.CONTRIBUTOR_ADDED_EMAIL_THROTTLE) @@ -642,6 +632,7 @@ def notify_added_contributor(resource, contributor, notification_type, auth=None subscribed_object=resource, event_context={ 'user_fullname': contributor.fullname, + 'referrer_fullname': referrer_name, 'referrer_text': referrer_name + ' has added you as a contributor' if referrer_name else 'You have been added', 'registry_text': resource.provider.name if resource.provider else 'OSF Registry', 'referrer_name': referrer_name, @@ -655,7 +646,6 @@ def notify_added_contributor(resource, contributor, notification_type, auth=None 'node_provider__id': getattr(resource.provider, '_id', None), 'node_absolute_url': resource.absolute_url, 'node_has_permission_admin': resource.has_permission(user=contributor, permission='admin'), - 'can_change_preferences': False, 'logo': logo, 'osf_contact_email': settings.OSF_CONTACT_EMAIL, 'preprint_list': ''.join(f"- {p['absolute_url']}\n" for p in serialize_preprints(resource, user=None)) if isinstance(resource, Node) else '- (none)\n', diff --git a/website/reviews/listeners.py b/website/reviews/listeners.py index 0e8f8ee4799..83fc702691b 100644 --- a/website/reviews/listeners.py +++ b/website/reviews/listeners.py @@ -29,7 +29,7 @@ def reviews_withdraw_requests_notification_moderators(self, timestamp, context, context['requester_fullname'] = user.fullname context['profile_image_url'] = get_profile_image_url(resource.creator) provider = resource.provider - from osf.models import NotificationType + from osf.models import NotificationTypeEnum context['message'] = f'has requested withdrawal of "{resource.title}".' context['reviews_submission_url'] = f'{DOMAIN}{resource._id}?mode=moderator' @@ -41,7 +41,7 @@ def reviews_withdraw_requests_notification_moderators(self, timestamp, context, context['recipient_fullname'] = recipient.fullname context['localized_timestamp'] = str(timestamp) - NotificationType.Type.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.instance.emit( + NotificationTypeEnum.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.instance.emit( user=recipient, subscribed_object=provider, event_context=context, @@ -56,7 +56,7 @@ def reviews_withdrawal_requests_notification(self, timestamp, context): context['reviewable_absolute_url'] = preprint.absolute_url context['reviewable_title'] = preprint.title context['reviewable__id'] = preprint._id - from osf.models import NotificationType + from osf.models import NotificationTypeEnum preprint_word = preprint.provider.preprint_word context['message'] = f'has requested withdrawal of the {preprint_word} "{preprint.title}".' @@ -69,7 +69,7 @@ def reviews_withdrawal_requests_notification(self, timestamp, context): context['recipient_fullname'] = recipient.fullname context['localized_timestamp'] = str(timestamp) - NotificationType.Type.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.instance.emit( + NotificationTypeEnum.PROVIDER_NEW_PENDING_WITHDRAW_REQUESTS.instance.emit( user=recipient, event_context=context, subscribed_object=preprint.provider, @@ -106,7 +106,7 @@ def reviews_submit_notification_moderators(self, timestamp, resource, context): else: context['message'] = f'submitted "{resource.title}".' - from osf.models import NotificationType + from osf.models import NotificationTypeEnum context['requester_contributor_names'] = ''.join(resource.contributors.values_list('fullname', flat=True)) context['localized_timestamp'] = str(timezone.now()) @@ -117,7 +117,7 @@ def reviews_submit_notification_moderators(self, timestamp, resource, context): context['requester_fullname'] = recipient.fullname context['is_request_email'] = False - NotificationType.Type.PROVIDER_NEW_PENDING_SUBMISSIONS.instance.emit( + NotificationTypeEnum.PROVIDER_NEW_PENDING_SUBMISSIONS.instance.emit( user=recipient, subscribed_object=provider, event_context=context, diff --git a/website/routes.py b/website/routes.py index 73ff5ae1c96..45d0edf1874 100644 --- a/website/routes.py +++ b/website/routes.py @@ -50,7 +50,6 @@ from website.policies import views as policy_views from website.preprints import views as preprint_views from website.registries import views as registries_views -from website.notifications import views as notification_views from website.closed_challenges import views as closed_challenges_views from website.identifiers import views as identifier_views @@ -1536,22 +1535,24 @@ def make_url_map(app): json_renderer, ), - Rule( - '/subscriptions/', - 'get', - notification_views.get_subscriptions, - json_renderer, - ), + # Legacy v1 API for notifications, which is no longer used by Angular/Post-NR + # Rule( + # '/subscriptions/', + # 'get', + # notification_views.get_subscriptions, + # json_renderer, + # ), - Rule( - [ - '/project//subscriptions/', - '/project//node//subscriptions/' - ], - 'get', - notification_views.get_node_subscriptions, - json_renderer, - ), + # Legacy v1 API for notifications, which is no longer used by Angular/Post-NR + # Rule( + # [ + # '/project//subscriptions/', + # '/project//node//subscriptions/' + # ], + # 'get', + # notification_views.get_node_subscriptions, + # json_renderer, + # ), Rule( [ @@ -1563,12 +1564,13 @@ def make_url_map(app): json_renderer, ), - Rule( - '/subscriptions/', - 'post', - notification_views.configure_subscription, - json_renderer, - ), + # Legacy v1 API for notifications, which is no longer used by Angular/Post-NR + # Rule( + # '/subscriptions/', + # 'post', + # notification_views.configure_subscription, + # json_renderer, + # ), Rule( [ diff --git a/website/settings/defaults.py b/website/settings/defaults.py index bfe78beea09..9e4d73199cd 100644 --- a/website/settings/defaults.py +++ b/website/settings/defaults.py @@ -180,13 +180,17 @@ def parent_dir(path): NO_ADDON_WAIT_TIME = timedelta(weeks=8) # 2 months for "Link an add-on to your OSF project" email NO_LOGIN_WAIT_TIME = timedelta(weeks=52) # 1 year for "We miss you at OSF" email NO_LOGIN_OSF4M_WAIT_TIME = timedelta(weeks=52) # 1 year for "We miss you at OSF" email to users created from OSF4M +# TODO: this will be changed to 12 weeks (3 month) with ENG-9856 +NOTIFICATIONS_CLEANUP_AGE = timedelta(weeks=52) # 1 year to clean up old notifications and email tasks -# Configuration for "We miss you at OSF" email (`NotificationType.Type.USER_NO_LOGIN`) +# Configuration for "We miss you at OSF" email (`NotificationTypeEnum.USER_NO_LOGIN`) # Note: 1) we can gradually increase `MAX_DAILY_NO_LOGIN_EMAILS` to 10000, 100000, etc. or set it to `None` after we # have verified that users are not spammed by this email after NR release. 2) If we want to clean up database for those # already sent `USER_NO_LOGIN` emails, we need to adjust the cut-off time to the day we clean the DB. MAX_DAILY_NO_LOGIN_EMAILS = 1000 -NO_LOGIN_EMAIL_CUTOFF = datetime.datetime(2026, 1, 5) +# Note: set to 26/3/13 which is the date we release to `master` and deploy to test server; prod server has a different +# date, which is configured in the private config, using the date when it is deployed to prod. +NO_LOGIN_EMAIL_CUTOFF = datetime.datetime(2026, 3, 13) # TODO: Override in local.py MAILGUN_API_KEY = None @@ -429,6 +433,9 @@ class CeleryConfig: 'scripts.populate_new_and_noteworthy_projects', 'website.search.elastic_search', 'scripts.generate_sitemap', + 'scripts.remove_after_use.populate_notification_subscriptions_node_file_updated', + 'scripts.remove_after_use.populate_notification_subscriptions_user_global_file_updated', + 'scripts.remove_after_use.populate_notification_subscriptions_user_global_reviews', 'osf.management.commands.clear_expired_sessions', 'osf.management.commands.delete_withdrawn_or_failed_registration_files', 'osf.management.commands.migrate_pagecounter_data', @@ -444,7 +451,7 @@ class CeleryConfig: 'osf.management.commands.monthly_reporters_go', 'osf.management.commands.ingest_cedar_metadata_templates', 'osf.metrics.reporters', - 'scripts.populate_notification_subscriptions', + 'scripts.remove_after_use.merge_notification_subscription_provider_ct', } med_pri_modules = { @@ -560,6 +567,9 @@ class CeleryConfig: 'scripts.approve_embargo_terminations', 'scripts.triggered_mails', 'scripts.generate_sitemap', + 'scripts.remove_after_use.populate_notification_subscriptions_node_file_updated', + 'scripts.remove_after_use.populate_notification_subscriptions_user_global_file_updated', + 'scripts.remove_after_use.populate_notification_subscriptions_user_global_reviews', 'scripts.premigrate_created_modified', 'scripts.add_missing_identifiers_to_preprints', 'osf.management.commands.clear_expired_sessions', @@ -576,7 +586,9 @@ class CeleryConfig: 'osf.management.commands.monthly_reporters_go', 'osf.external.spam.tasks', 'api.share.utils', - 'scripts.populate_notification_subscriptions', + 'scripts.remove_after_use.merge_notification_subscription_provider_ct', + 'scripts.disable_removed_beat_tasks', + 'osf.management.commands.delete_withdrawn_or_failed_registration_files', ) # Modules that need metrics and release requirements @@ -590,6 +602,10 @@ class CeleryConfig: # Setting up a scheduler, essentially replaces an independent cron job # Note: these times must be in UTC beat_schedule = { + 'disable_removed_beat_tasks': { + 'task': 'scripts.disable_removed_beat_tasks', + 'schedule': crontab(minute=0, hour=0), # Daily 8:00 PM EDT + }, 'retract_registrations': { 'task': 'scripts.retract_registrations', 'schedule': crontab(minute=0, hour=5), # Daily 12 a.m @@ -645,6 +661,11 @@ class CeleryConfig: 'schedule': crontab(minute=0, hour=5), # Daily 12 a.m 'kwargs': {'dry_run': False}, }, + 'notifications_cleanup_task': { + 'task': 'notifications.tasks.notifications_cleanup_task', + 'schedule': crontab(minute=0, hour=7), # Daily 2 a.m + 'kwargs': {'dry_run': False}, + }, 'clear_expired_sessions': { 'task': 'osf.management.commands.clear_expired_sessions', 'schedule': crontab(minute=0, hour=5), # Daily 12 a.m diff --git a/website/settings/local-ci.py b/website/settings/local-ci.py index 0831b5b8dbc..a4d250a9792 100644 --- a/website/settings/local-ci.py +++ b/website/settings/local-ci.py @@ -66,10 +66,12 @@ class CeleryConfig(defaults.CeleryConfig): NO_LOGIN_WAIT_TIME = timedelta(weeks=4) NO_LOGIN_OSF4M_WAIT_TIME = timedelta(weeks=6) -# Configuration for "We miss you at OSF" email (`NotificationType.Type.USER_NO_LOGIN`) +# Configuration for "We miss you at OSF" email (`NotificationTypeEnum.USER_NO_LOGIN`) MAX_DAILY_NO_LOGIN_EMAILS = None NO_LOGIN_EMAIL_CUTOFF = None +NOTIFICATIONS_CLEANUP_AGE = timedelta(weeks=4) # 1 month to clean up old notifications and email tasks + USE_CDN_FOR_CLIENT_LIBS = False SENTRY_DSN = None diff --git a/website/templates/archive_size_exceeded_user.html.mako b/website/templates/archive_size_exceeded_user.html.mako index 19d82125b90..7931e4ce714 100644 --- a/website/templates/archive_size_exceeded_user.html.mako +++ b/website/templates/archive_size_exceeded_user.html.mako @@ -8,7 +8,7 @@ diff --git a/website/templates/invite_default.html.mako b/website/templates/invite_default.html.mako index f739f11ad7e..9bf188212ef 100644 --- a/website/templates/invite_default.html.mako +++ b/website/templates/invite_default.html.mako @@ -8,7 +8,7 @@ %> Hello ${user_fullname},

- You have been added by ${referrer_name} as a contributor to the project ${node_title} on the Open Science Framework.
+ You have been added by ${referrer_fullname} as a contributor to the project ${node_title} on the Open Science Framework.

Click here to set a password for your account.

diff --git a/website/templates/node_request_institutional_access_request.html.mako b/website/templates/node_request_institutional_access_request.html.mako index 8ef9529f0ee..8cfae57cdd0 100644 --- a/website/templates/node_request_institutional_access_request.html.mako +++ b/website/templates/node_request_institutional_access_request.html.mako @@ -3,7 +3,7 @@ <%def name="content()">
- We cannot archive ${src_title} at this time because the projected size of the registration exceeds our usage limits. You should receive a followup email from our support team shortly. We're sorry for any inconvenience this may have caused. + We cannot archive ${src_title} at this time because the projected size of the registration exceeds our usage limits. Please email our support team support@osf.io for assistance. We're sorry for any inconvenience this may have caused.
- Hello ${recipient_fullname}, + Hello ${recipient_username},

${sender_fullname} has requested access to ${node_title}.

diff --git a/website/templates/reviews_resubmission_confirmation.html.mako b/website/templates/reviews_resubmission_confirmation.html.mako index e5e8e3caa81..4b7b8ba30fb 100644 --- a/website/templates/reviews_resubmission_confirmation.html.mako +++ b/website/templates/reviews_resubmission_confirmation.html.mako @@ -34,9 +34,7 @@ Sincerely,
Your ${reviewable_provider_name} and OSF teams -

- Center for Open Science -

+
Privacy Policy diff --git a/website/views.py b/website/views.py index db89d258959..1a4bf4942da 100644 --- a/website/views.py +++ b/website/views.py @@ -9,7 +9,7 @@ from flask import request, Response from framework.auth import Auth -from framework.auth.decorators import must_be_logged_in +from framework.auth.decorators import must_be_logged_in, is_contributor_or_public_resource from framework.auth.forms import SignInForm, ForgotPasswordForm from framework.exceptions import HTTPError from framework.flask import redirect # VOL-aware redirect @@ -20,7 +20,7 @@ from addons.osfstorage.models import Region, OsfStorageFile from osf import exceptions -from osf.models import Guid, Preprint, AbstractNode, Node, DraftNode +from osf.models import Guid, Preprint, AbstractNode, Node, DraftNode, Registration from website.settings import DOMAIN from website.project.decorators import check_contributor_auth @@ -287,7 +287,7 @@ def resolve_guid(guid, suffix=None): if clean_suffix == 'metadata': format_arg = request.args.get('format') if format_arg: - return guid_metadata_download(guid, resource, format_arg) + return guid_metadata_download(guid, resource=resource, metadata_format=format_arg) if isinstance(resource, Preprint) and resource.provider.domain_redirect_enabled: return redirect(resource.absolute_url, http_status.HTTP_301_MOVED_PERMANENTLY) @@ -359,6 +359,7 @@ def get_storage_region_list(user, node=False): return available_regions +@is_contributor_or_public_resource('resource') def guid_metadata_download(guid, resource, metadata_format): try: result = pls_gather_metadata_file(resource, metadata_format) @@ -380,4 +381,8 @@ def guid_metadata_download(guid, resource, metadata_format): def metadata_download(guid): format_arg = request.args.get('format', 'datacite-json') resource = Guid.load(guid) - return guid_metadata_download(guid, resource, format_arg) + is_resource_project_or_registration = isinstance(resource.referent, (Node, Registration)) + response = guid_metadata_download(guid, resource=resource, metadata_format=format_arg) + if is_resource_project_or_registration: + response.headers['link'] = f'<{settings.DOMAIN}{guid}/>; rel="describes"; type="text/html"' + return response From 008cc9d1546bd5efe97172f1634404d44863bba6 Mon Sep 17 00:00:00 2001 From: Yuhuai Liu Date: Fri, 20 Mar 2026 16:58:42 -0400 Subject: [PATCH 27/31] update yarn lock (#11646) --- yarn.lock | 7798 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 4575 insertions(+), 3223 deletions(-) diff --git a/yarn.lock b/yarn.lock index ed2280689a2..25ca5aeb866 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,3227 +1,4579 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@centerforopenscience/list-of-licenses@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@centerforopenscience/list-of-licenses/-/list-of-licenses-1.1.0.tgz#2a4379633409205047e723e21cd818560a29ab45" - integrity sha512-EGU7gpRXczqC4TAlfKBiLzRaopxxZkL86kwS8/qdZdmRjTpG872z+bRd5E4ZJivxHBLpVpts5nK/bz4MsbdhTA== - -"@centerforopenscience/osf-style@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@centerforopenscience/osf-style/-/osf-style-1.9.0.tgz#0ab5cb17e2c531aafcc19e226f36ff86b734116e" - integrity sha512-R9IBVbz4eb/NkoM5TZGH46T9m5jspwK0H605O0oSMggHZPcTrf5gAHw0axeC26nKmEpz2FSXjvm84ziPNvhsvA== - -"@fortawesome/fontawesome-common-types@7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-7.0.1.tgz#e9ab94b1ca93e7020e3c7eda2ef1ba8cca8ba1dc" - integrity sha512-0VpNtO5cNe1/HQWMkl4OdncYK/mv9hnBte0Ew0n6DMzmo3Q3WzDFABHm6LeNTipt5zAyhQ6Ugjiu8aLaEjh1gg== - -"@fortawesome/fontawesome-free@^7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.0.1.tgz#c1ac7f07ba2df47d1de7b7236fad25c4e6ca5076" - integrity sha512-RLmb9U6H2rJDnGxEqXxzy7ANPrQz7WK2/eTjdZqyU9uRU5W+FkAec9uU5gTYzFBH7aoXIw2WTJSCJR4KPlReQw== - -"@fortawesome/fontawesome-svg-core@^7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-7.0.1.tgz#f5f7bbfe09e7cc35fd30eefe6be018d2e9c5dd4d" - integrity sha512-x0cR55ILVqFpUioSMf6ebpRCMXMcheGN743P05W2RB5uCNpJUqWIqW66Lap8PfL/lngvjTbZj0BNSUweIr/fHQ== - dependencies: - "@fortawesome/fontawesome-common-types" "7.0.1" - -"@fortawesome/free-brands-svg-icons@^7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-7.0.1.tgz#2a975ae2a26710cb2b34c25d4fe706dcd4747f69" - integrity sha512-6xPmn5SrND/GM0+W33E77x05+aDn6RpR02eWd8eLdN0IxY0vXa5yU/ugaAKloOVxiG9w2330TSRsbJYL6c57Ow== - dependencies: - "@fortawesome/fontawesome-common-types" "7.0.1" - -"@fortawesome/react-fontawesome@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-3.0.2.tgz#275ab6bc04977e145b072ba18c24779eb3427073" - integrity sha512-cmp/nT0pPC7HUALF8uc3+D5ECwEBWxYQbOIHwtGUWEu72sWtZc26k5onr920HWOViF0nYaC+Qzz6Ln56SQcaVg== - -URIjs@^1.14.1: - version "1.16.1" - resolved "https://registry.yarnpkg.com/URIjs/-/URIjs-1.16.1.tgz#edebc678b8b74b26b05d2b481e12383f5ae04b8b" - integrity sha1-7evGeLi3SyawXStIHhI4P1rgS4s= - -acorn-dynamic-import@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" - integrity sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ= - dependencies: - acorn "^4.0.3" - -acorn@^4.0.3: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= - -acorn@^5.0.0: - version "5.7.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" - integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-keywords@^3.1.0: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv@^5.0.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - -ajv@^6.1.0: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -assets-webpack-plugin@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/assets-webpack-plugin/-/assets-webpack-plugin-2.3.0.tgz#3e5fb861a19f1a9748aa02f56b8a03d7476ad0db" - integrity sha1-Pl+4YaGfGpdIqgL1a4oD10dq0Ns= - dependencies: - camelcase "^1.2.1" - escape-string-regexp "^1.0.3" - mkdirp "^0.5.1" - -async@^2.1.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - -autoprefixer@^6.3.1: - version "6.7.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" - integrity sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ= - dependencies: - browserslist "^1.7.6" - caniuse-db "^1.0.30000634" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^5.2.16" - postcss-value-parser "^3.2.3" - -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -balanced-match@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg= - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.0.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -bluebird@^3.5.1: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - -body-parser@~1.19.1: - version "1.19.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" - integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.7" - raw-body "2.4.3" - type-is "~1.6.18" - -bootbox@^5.5.2: - version "5.5.2" - resolved "https://registry.yarnpkg.com/bootbox/-/bootbox-5.5.2.tgz#a4200aa03f12ffe4d07905834e9dfb76e52cee00" - integrity sha512-q8d9VO2A4+q6S0XvovLtqtBUp7uRy0wtDOuuycnoheK2TiAm3um0jOlAOu9ORn9XoT92tdil+p15Dle1mRgSPQ== - dependencies: - bootstrap "^4.4.0" - jquery "^3.5.1" - popper.js "^1.16.0" - -bootstrap@3.3.7, bootstrap@~3.3.2: - version "3.3.7" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.3.7.tgz#5a389394549f23330875a3b150656574f8a9eb71" - integrity sha1-WjiTlFSfIzMIdaOxUGVldPip63E= - -bootstrap@^3.3.7, bootstrap@^4.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.4.1.tgz#c3a347d419e289ad11f4033e3c4132b87c081d72" - integrity sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA== - -bower@^1.8.8: - version "1.8.13" - resolved "https://registry.yarnpkg.com/bower/-/bower-1.8.13.tgz#5892f391f47134db88ea93d4c91a31f09792dc58" - integrity sha512-8eWko16JlCTdaZZG70kddHPed17pHEbH8/IjfP4IFkQsfEqRsyNM09Dc8cDBFkSvtQ/2lTea7A+bMhRggG2a+Q== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: - version "1.7.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" - integrity sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk= - dependencies: - caniuse-db "^1.0.30000639" - electron-to-chromium "^1.2.7" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -c3@^0.4.18: - version "0.4.24" - resolved "https://registry.yarnpkg.com/c3/-/c3-0.4.24.tgz#57b62357098842d38e265a265f6de1e8c6faadd2" - integrity sha512-mVCFtN5ZWUT5UE7ilFQ7KBQ7TUCdKIq6KsDt1hH/1m6gC1tBjvzFTO7fqhaiWHfhNOjjM7makschdhg6DkWQMA== - dependencies: - d3 "~3.5.0" - -cacache@^10.0.4: - version "10.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" - integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA== - dependencies: - bluebird "^3.5.1" - chownr "^1.0.1" - glob "^7.1.2" - graceful-fs "^4.1.11" - lru-cache "^4.1.1" - mississippi "^2.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.2" - ssri "^5.2.4" - unique-filename "^1.1.0" - y18n "^4.0.0" - -camelcase@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - -caniuse-api@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" - integrity sha1-tTTnxzTE+B7F++isoq0kNUuWLGw= - dependencies: - browserslist "^1.3.6" - caniuse-db "^1.0.30000529" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30001312" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001312.tgz#efb31cb54e5f4714126d8c35292666c9b7290c87" - integrity sha512-4eJfCSGxsF9JcQXBLdHclxkpLWv+Va7Y6QESYCWSdrR8b8x16TxUjCoOK/kU7SFC0BdcuK0nvt6ZkM59Q03LjQ== - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chownr@^1.0.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -clap@^1.0.9: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" - integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA== - dependencies: - chalk "^1.1.3" - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -coa@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" - integrity sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0= - dependencies: - q "^1.1.2" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -color-convert@^1.3.0, color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" - integrity sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE= - dependencies: - color-name "^1.0.0" - -color@^0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" - integrity sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q= - dependencies: - clone "^1.0.2" - color-convert "^1.3.0" - color-string "^0.3.0" - -colormin@^1.0.5: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" - integrity sha1-6i90IKcrlogaOKrlnsEkpvcpgTM= - dependencies: - color "^0.11.0" - css-color-names "0.0.4" - has "^1.0.1" - -colors@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= - -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -copy-anything@^2.0.1: - version "2.0.6" - resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" - integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== - dependencies: - is-what "^3.14.1" - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-color-names@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - -css-loader@^0.28.11: - version "0.28.11" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" - integrity sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg== - dependencies: - babel-code-frame "^6.26.0" - css-selector-tokenizer "^0.7.0" - cssnano "^3.10.0" - icss-utils "^2.1.0" - loader-utils "^1.0.2" - lodash.camelcase "^4.3.0" - object-assign "^4.1.1" - postcss "^5.0.6" - postcss-modules-extract-imports "^1.2.0" - postcss-modules-local-by-default "^1.2.0" - postcss-modules-scope "^1.1.0" - postcss-modules-values "^1.3.0" - postcss-value-parser "^3.3.0" - source-list-map "^2.0.0" - -css-selector-tokenizer@^0.7.0: - version "0.7.3" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" - integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg== - dependencies: - cssesc "^3.0.0" - fastparse "^1.1.2" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssnano@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" - integrity sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg= - dependencies: - autoprefixer "^6.3.1" - decamelize "^1.1.2" - defined "^1.0.0" - has "^1.0.1" - object-assign "^4.0.1" - postcss "^5.0.14" - postcss-calc "^5.2.0" - postcss-colormin "^2.1.8" - postcss-convert-values "^2.3.4" - postcss-discard-comments "^2.0.4" - postcss-discard-duplicates "^2.0.1" - postcss-discard-empty "^2.0.1" - postcss-discard-overridden "^0.1.1" - postcss-discard-unused "^2.2.1" - postcss-filter-plugins "^2.0.0" - postcss-merge-idents "^2.1.5" - postcss-merge-longhand "^2.0.1" - postcss-merge-rules "^2.0.3" - postcss-minify-font-values "^1.0.2" - postcss-minify-gradients "^1.0.1" - postcss-minify-params "^1.0.4" - postcss-minify-selectors "^2.0.4" - postcss-normalize-charset "^1.1.0" - postcss-normalize-url "^3.0.7" - postcss-ordered-values "^2.1.0" - postcss-reduce-idents "^2.2.2" - postcss-reduce-initial "^1.0.0" - postcss-reduce-transforms "^1.0.3" - postcss-svgo "^2.1.1" - postcss-unique-selectors "^2.0.2" - postcss-value-parser "^3.2.3" - postcss-zindex "^2.0.1" - -csso@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" - integrity sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U= - dependencies: - clap "^1.0.9" - source-map "^0.5.3" - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - -d3@^3.5.17, d3@~3.5.0: - version "3.5.17" - resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" - integrity sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g= - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.2.6: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.1.1, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -diff@~5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@centerforopenscience/list-of-licenses@npm:^1.1.0": + version: 1.1.0 + resolution: "@centerforopenscience/list-of-licenses@npm:1.1.0" + checksum: 10c0/49254d7a30edfb52b6a681afd25a22b92275a45a61698de8804126176113d6094fd7a25baeec686e88a81652a8bd9b8f0ce9345df4ba5c04ec831349e96f65be + languageName: node + linkType: hard + +"@centerforopenscience/osf-style@npm:1.9.0": + version: 1.9.0 + resolution: "@centerforopenscience/osf-style@npm:1.9.0" + checksum: 10c0/243cc3e560329fed8c6448f91db8937b14d7f58fa94ac9f8cd74ada1d01cf621b990223bb75bd355e0b291b256804699889db7a3dcc96db858331a17d4018ff6 + languageName: node + linkType: hard + +"@fortawesome/fontawesome-common-types@npm:7.0.1": + version: 7.0.1 + resolution: "@fortawesome/fontawesome-common-types@npm:7.0.1" + checksum: 10c0/1cebe9727950f8fcea581e115ed91f9b2bf287114077adde0cc1fb32d25c2c2ec282a8cff291b22ca558cbb1264af7fad04b85c5afcb899745584b2874df4151 + languageName: node + linkType: hard + +"@fortawesome/fontawesome-free@npm:^7.0.1": + version: 7.0.1 + resolution: "@fortawesome/fontawesome-free@npm:7.0.1" + checksum: 10c0/60170c84f56f5e190ea532f4205b53a8b902b34b46e59fcacf4a8d8a97ec566c5bfc246c5b80393cd7e1c24e1faa895c57456bcaffc0177962fc07922756a1d5 + languageName: node + linkType: hard + +"@fortawesome/fontawesome-svg-core@npm:^7.0.1": + version: 7.0.1 + resolution: "@fortawesome/fontawesome-svg-core@npm:7.0.1" + dependencies: + "@fortawesome/fontawesome-common-types": "npm:7.0.1" + checksum: 10c0/adf72373e45ec0b81e9a60e74a6aeadd70cd7da31ecf37736e6288ef956148699272155935d97d7bf02f37e2fefd8f9b8c34b626e59fcca54a5947be46ff06fe + languageName: node + linkType: hard + +"@fortawesome/free-brands-svg-icons@npm:^7.0.1": + version: 7.0.1 + resolution: "@fortawesome/free-brands-svg-icons@npm:7.0.1" + dependencies: + "@fortawesome/fontawesome-common-types": "npm:7.0.1" + checksum: 10c0/a05058f7ff8aaf86952a96877d270e52293c5da5804ae21cf127b28063dfedfa4a1bb260040f774ccd81c3e55a045d36e2137686ea93ad84c8310ffd6a2303ba + languageName: node + linkType: hard + +"@fortawesome/react-fontawesome@npm:^3.0.2": + version: 3.0.2 + resolution: "@fortawesome/react-fontawesome@npm:3.0.2" + peerDependencies: + "@fortawesome/fontawesome-svg-core": ~6 || ~7 + react: ^18.0.0 || ^19.0.0 + checksum: 10c0/0a6a99ab16af74189232b01986d882ce3b2265836297a949709517f0f9b3d7c11dcf67e130200f09aca9d0e015abff21248d105796d768660901273a8ee232db + languageName: node + linkType: hard + +"@gar/promise-retry@npm:^1.0.0": + version: 1.0.3 + resolution: "@gar/promise-retry@npm:1.0.3" + checksum: 10c0/885b02c8b0d75b2d215da25f3b639158c4fbe8fefe0d79163304534b9a6d0710db4b7699f7cd3cc1a730792bff04cbe19f4850a62d3e105a663eaeec88f38332 + languageName: node + linkType: hard + +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/agent@npm:4.0.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^11.2.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10c0/f7b5ce0f3dd42c3f8c6546e8433573d8049f67ef11ec22aa4704bc41483122f68bf97752e06302c455ead667af5cb753e6a09bff06632bc465c1cfd4c4b75a53 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^5.0.0": + version: 5.0.0 + resolution: "@npmcli/fs@npm:5.0.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/26e376d780f60ff16e874a0ac9bc3399186846baae0b6e1352286385ac134d900cc5dafaded77f38d77f86898fc923ae1cee9d7399f0275b1aa24878915d722b + languageName: node + linkType: hard + +"@npmcli/redact@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/redact@npm:4.0.0" + checksum: 10c0/a1e9ba9c70a6b40e175bda2c3dd8cfdaf096e6b7f7a132c855c083c8dfe545c3237cd56702e2e6627a580b1d63373599d49a1192c4078a85bf47bbde824df31c + languageName: node + linkType: hard + +"OSF@workspace:.": + version: 0.0.0-use.local + resolution: "OSF@workspace:." + dependencies: + "@centerforopenscience/list-of-licenses": "npm:^1.1.0" + "@centerforopenscience/osf-style": "npm:1.9.0" + "@fortawesome/fontawesome-free": "npm:^7.0.1" + "@fortawesome/fontawesome-svg-core": "npm:^7.0.1" + "@fortawesome/free-brands-svg-icons": "npm:^7.0.1" + "@fortawesome/react-fontawesome": "npm:^3.0.2" + URIjs: "npm:^1.14.1" + assets-webpack-plugin: "npm:^2.3.0" + bootbox: "npm:^5.5.2" + bootstrap: "npm:3.3.7" + bower: "npm:^1.8.8" + css-loader: "npm:^0.28.11" + diff: "npm:~5.0.0" + dropzone: "https://github.com/CenterForOpenScience/dropzone.git#aba21eb6b82cc823ac7a7a53d6e035791c082bae" + exports-loader: "npm:0.6.3" + file-loader: "npm:^0.11.2" + gsap: "npm:3.9.1" + highlight.js: "npm:~9.18.2" + imports-loader: "npm:^0.6.3" + js-cookie: "npm:3.0.1" + js-md5: "npm:^0.7.3" + jstimezonedetect: "npm:^1.0.6" + knockout: "npm:~3.4.2" + knockout.validation: "npm:^2.0.2" + less: "npm:^4.1.2" + linkifyjs: "npm:^3.0.5" + loaders.css: "npm:^0.1.2" + lodash.find: "npm:^4.3.0" + lodash.get: "npm:^4.2.1" + lodash.has: "npm:^4.5.2" + lodash.includes: "npm:^4.3.0" + lodash.set: "npm:^4.3.2" + mime-types: "npm:~2.1.34" + mithril: "npm:0.2.0" + moment: "npm:^2.14.1" + object-assign: "npm:^3.0.0" + pikaday: "npm:^1.3.2" + raw-loader: "npm:~0.5.0" + select2: "npm:3.5.1" + style-loader: "npm:^0.23.1" + treebeard: "https://github.com/CenterForOpenScience/treebeard.git#d2bb8f6f8104fcac040402727f431c26722b269e" + typeahead.js: "npm:^0.11.1" + url-loader: "npm:~0.6.2" + webpack: "npm:3.12.0" + zxcvbn: "npm:^4.2.0" + languageName: unknown + linkType: soft + +"URIjs@npm:^1.14.1": + version: 1.16.1 + resolution: "URIjs@npm:1.16.1" + checksum: 10c0/4709474a384394d4b28987b845989ca56297f07afed3ad58204ba309727530a3aa0106cc5a90b0d784cda390b0ca500575981951f1fa065e8e766a4ffec26f08 + languageName: node + linkType: hard + +"abbrev@npm:^4.0.0": + version: 4.0.0 + resolution: "abbrev@npm:4.0.0" + checksum: 10c0/b4cc16935235e80702fc90192e349e32f8ef0ed151ef506aa78c81a7c455ec18375c4125414b99f84b2e055199d66383e787675f0bcd87da7a4dbd59f9eac1d5 + languageName: node + linkType: hard + +"acorn-dynamic-import@npm:^2.0.0": + version: 2.0.2 + resolution: "acorn-dynamic-import@npm:2.0.2" + dependencies: + acorn: "npm:^4.0.3" + checksum: 10c0/5dcac220ae8ddc8f8439402691c6da21f4e44f3a91b5645884cd2a5f03c8e39a40006a189de9ccd50fdfcdeda6c52724db45cd2100e56e9e9656d7b19e2bfd22 + languageName: node + linkType: hard + +"acorn@npm:^4.0.3": + version: 4.0.13 + resolution: "acorn@npm:4.0.13" + bin: + acorn: ./bin/acorn + checksum: 10c0/ed73e42711474f80d7f2f94d68109e83a40d48c9596f0bcfd1a4c64e086636495259432421357524d04bfe317eed6de5b6202d2ab30f1b1c26bca12684979aa5 + languageName: node + linkType: hard + +"acorn@npm:^5.0.0": + version: 5.7.4 + resolution: "acorn@npm:5.7.4" + bin: + acorn: bin/acorn + checksum: 10c0/b29e61d48fa31ae69d38d74bb213b77b32de6317f125890a6cb76b44d173adccbcd3a07fc9a86acdfe8ab0a80f42b5ec6290df8b7944e0506504ac3b716232bd + languageName: node + linkType: hard + +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 10c0/c2c9ab7599692d594b6a161559ada307b7a624fa4c7b03e3afdb5a5e31cd0e53269115b620fcab024c5ac6a6f37fa5eb2e004f076ad30f5f7e6b8b671f7b35fe + languageName: node + linkType: hard + +"ajv-errors@npm:^1.0.0": + version: 1.0.1 + resolution: "ajv-errors@npm:1.0.1" + peerDependencies: + ajv: ">=5.0.0" + checksum: 10c0/de2d6e8100c8707ea063ee4785d53adf599b457c0d4f72c3592244d67ad16448a6d35f7ce45f12bdd2819939447c876e8ef2f1c0800896d7f2aa25c3838acdf1 + languageName: node + linkType: hard + +"ajv-keywords@npm:^3.1.0": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 + languageName: node + linkType: hard + +"ajv@npm:^5.0.0": + version: 5.5.2 + resolution: "ajv@npm:5.5.2" + dependencies: + co: "npm:^4.6.0" + fast-deep-equal: "npm:^1.0.0" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.3.0" + checksum: 10c0/9b8f762cd6b9da3935987b82418402247e76925e39814ca0d62088656117129db7e0cdc1d3e4aa6a3c4aa5ff67021551299ee4771735bcccb6cdd3f85061e565 + languageName: node + linkType: hard + +"ajv@npm:^6.1.0": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + +"alphanum-sort@npm:^1.0.1, alphanum-sort@npm:^1.0.2": + version: 1.0.2 + resolution: "alphanum-sort@npm:1.0.2" + checksum: 10c0/2944e7ae4d36328a2df071017c01cd1d06ef6a5d87c8fbbeffd9075d42f4da48051bde79a5e3d863b98f37778c76e8eebd4353c1e7bbba2480382096953ec2b8 + languageName: node + linkType: hard + +"amdefine@npm:>=0.0.4": + version: 1.0.1 + resolution: "amdefine@npm:1.0.1" + checksum: 10c0/ba8aa5d4ff5248b2ed067111e72644b36b5b7ae88d9a5a2c4223dddb3bdc9102db67291e0b414f59f12c6479ac6a365886bac72c7965e627cbc732e0962dd1ab + languageName: node + linkType: hard + +"ansi-regex@npm:^2.0.0": + version: 2.1.1 + resolution: "ansi-regex@npm:2.1.1" + checksum: 10c0/78cebaf50bce2cb96341a7230adf28d804611da3ce6bf338efa7b72f06cc6ff648e29f80cd95e582617ba58d5fdbec38abfeed3500a98bce8381a9daec7c548b + languageName: node + linkType: hard + +"ansi-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "ansi-regex@npm:3.0.0" + checksum: 10c0/c6a2b226d009965decc65d330b953290039f0f2b31d200516a9a79b6010f5f8f9d6acbaa0917d925c578df0c0feaddcb56569aad05776f99e2918116d4233121 + languageName: node + linkType: hard + +"ansi-styles@npm:^2.2.1": + version: 2.2.1 + resolution: "ansi-styles@npm:2.2.1" + checksum: 10c0/7c68aed4f1857389e7a12f85537ea5b40d832656babbf511cc7ecd9efc52889b9c3e5653a71a6aade783c3c5e0aa223ad4ff8e83c27ac8a666514e6c79068cab + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.0" + checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b + languageName: node + linkType: hard + +"aproba@npm:^1.1.1": + version: 1.2.0 + resolution: "aproba@npm:1.2.0" + checksum: 10c0/2d34f008c9edfa991f42fe4b667d541d38a474a39ae0e24805350486d76744cd91ee45313283c1d39a055b14026dd0fc4d0cbfc13f210855d59d7e8b5a61dc51 + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + +"asn1.js@npm:^5.2.0": + version: 5.4.1 + resolution: "asn1.js@npm:5.4.1" + dependencies: + bn.js: "npm:^4.0.0" + inherits: "npm:^2.0.1" + minimalistic-assert: "npm:^1.0.0" + safer-buffer: "npm:^2.1.0" + checksum: 10c0/b577232fa6069cc52bb128e564002c62b2b1fe47f7137bdcd709c0b8495aa79cee0f8cc458a831b2d8675900eea0d05781b006be5e1aa4f0ae3577a73ec20324 + languageName: node + linkType: hard + +"assert@npm:^1.1.1": + version: 1.5.0 + resolution: "assert@npm:1.5.0" + dependencies: + object-assign: "npm:^4.1.1" + util: "npm:0.10.3" + checksum: 10c0/188da37d63be479a3b14657c01080db90cdf7fa004e346af916cf8beebcaffb11359c596d0c9c3cd8174c9125a6225796ef1ce533487edc97f8ce3b18c1ab590 + languageName: node + linkType: hard + +"assets-webpack-plugin@npm:^2.3.0": + version: 2.3.0 + resolution: "assets-webpack-plugin@npm:2.3.0" + dependencies: + camelcase: "npm:^1.2.1" + escape-string-regexp: "npm:^1.0.3" + mkdirp: "npm:^0.5.1" + checksum: 10c0/7d5a1fb70f1c7ef0eb59c6d84bc4046a6b2b9913d66e153960dd63e8ca40f27024ecdf130d0dd87db9b7384b7ba060e66a1c7d45ef658a1f4bf7df81356bc3fb + languageName: node + linkType: hard + +"async@npm:^2.1.2": + version: 2.6.3 + resolution: "async@npm:2.6.3" + dependencies: + lodash: "npm:^4.17.14" + checksum: 10c0/06c917c74a55f9036ff79dedfc51dfc9c52c2dee2f80866b600495d2fd3037251dbcfde6592f23fc47398c44d844174004e0ee532f94c32a888bb89fd1cf0f25 + languageName: node + linkType: hard + +"autoprefixer@npm:^6.3.1": + version: 6.7.7 + resolution: "autoprefixer@npm:6.7.7" + dependencies: + browserslist: "npm:^1.7.6" + caniuse-db: "npm:^1.0.30000634" + normalize-range: "npm:^0.1.2" + num2fraction: "npm:^1.2.2" + postcss: "npm:^5.2.16" + postcss-value-parser: "npm:^3.2.3" + checksum: 10c0/bdcf8e53eacef1feb54940bbe33fcb67e12eb07d5572d5f0fbadb638b84be15ca91b3a343763962a2ce6ed12ba611e039c62e871d12e29b956b8f2b189c263ae + languageName: node + linkType: hard + +"babel-code-frame@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-code-frame@npm:6.26.0" + dependencies: + chalk: "npm:^1.1.3" + esutils: "npm:^2.0.2" + js-tokens: "npm:^3.0.2" + checksum: 10c0/7fecc128e87578cf1b96e78d2b25e0b260e202bdbbfcefa2eac23b7f8b7b2f7bc9276a14599cde14403cc798cc2a38e428e2cab50b77658ab49228b09ae92473 + languageName: node + linkType: hard + +"balanced-match@npm:^0.4.2": + version: 0.4.2 + resolution: "balanced-match@npm:0.4.2" + checksum: 10c0/cd4e15add0f4ef14c4fe960d9f4a343052d7c0f7939e1b5e54c8f24417a501bde1f17e191b676daebd16ae316955c918f93b8ed0414bb03d038dd0159c9998e5 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"balanced-match@npm:^4.0.2": + version: 4.0.4 + resolution: "balanced-match@npm:4.0.4" + checksum: 10c0/07e86102a3eb2ee2a6a1a89164f29d0dbaebd28f2ca3f5ca786f36b8b23d9e417eb3be45a4acf754f837be5ac0a2317de90d3fcb7f4f4dc95720a1f36b26a17b + languageName: node + linkType: hard + +"base64-js@npm:^1.0.2": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + +"big.js@npm:^3.1.3": + version: 3.2.0 + resolution: "big.js@npm:3.2.0" + checksum: 10c0/de0b8e275171060a37846b521e8ebfe077c650532306c2470474da6720feb04351cc8588ef26088756b224923782946ae67e817b90122cc85692bbda7ccd2d0d + languageName: node + linkType: hard + +"big.js@npm:^5.2.2": + version: 5.2.2 + resolution: "big.js@npm:5.2.2" + checksum: 10c0/230520f1ff920b2d2ce3e372d77a33faa4fa60d802fe01ca4ffbc321ee06023fe9a741ac02793ee778040a16b7e497f7d60c504d1c402b8fdab6f03bb785a25f + languageName: node + linkType: hard + +"bluebird@npm:^3.5.1": + version: 3.7.2 + resolution: "bluebird@npm:3.7.2" + checksum: 10c0/680de03adc54ff925eaa6c7bb9a47a0690e8b5de60f4792604aae8ed618c65e6b63a7893b57ca924beaf53eee69c5af4f8314148c08124c550fe1df1add897d2 + languageName: node + linkType: hard + +"bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.9": + version: 4.12.0 + resolution: "bn.js@npm:4.12.0" + checksum: 10c0/9736aaa317421b6b3ed038ff3d4491935a01419ac2d83ddcfebc5717385295fcfcf0c57311d90fe49926d0abbd7a9dbefdd8861e6129939177f7e67ebc645b21 + languageName: node + linkType: hard + +"bn.js@npm:^5.0.0, bn.js@npm:^5.1.1": + version: 5.2.0 + resolution: "bn.js@npm:5.2.0" + checksum: 10c0/67e17b1934d9c7a73aed9b89222dc8c1c8e3aff46cca6609b8c2ab04fa22c6b8db42c7774b039d09fa63136d8866b777ab88af0d64d8ea3839a94e69193a6b13 + languageName: node + linkType: hard + +"bootbox@npm:^5.5.2": + version: 5.5.2 + resolution: "bootbox@npm:5.5.2" + dependencies: + bootstrap: "npm:^4.4.0" + jquery: "npm:^3.5.1" + popper.js: "npm:^1.16.0" + checksum: 10c0/a282c1349cf11cfc36260ac8301613517ffb407ade77d4b402d1eeaddddb1677008dcfa984a98ab9b21502cf833b3be02105cb784a25545bf48645cfe06e70ac + languageName: node + linkType: hard + +"bootstrap@npm:3.3.7": + version: 3.3.7 + resolution: "bootstrap@npm:3.3.7" + checksum: 10c0/6e711d39551d32a3fa2b7d6b22d59769266b4b5fccc20c18f6e6c8289d901a67cd23d00760415eedcd77a122db1bf5c46f6e8e9df1cea2fe2ada04741599ddbd + languageName: node + linkType: hard + +"bootstrap@npm:^3.3.7": + version: 3.4.1 + resolution: "bootstrap@npm:3.4.1" + checksum: 10c0/3ac443985a432fd77f1d6df2972d8f0a06e93bb0e10893fa890e6503e6d2b36e601f4a9894429223afa867c2232ead1af5c55ded4c23a64dc706ca25e49dc2da + languageName: node + linkType: hard + +"bower@npm:^1.8.8": + version: 1.8.13 + resolution: "bower@npm:1.8.13" + bin: + bower: bin/bower + checksum: 10c0/17724eb65745b7c4de57be0116eb06b4931bbdfaa152b40b1f1ab522d358b2036cd9fb30fb0e26ad0885586528c8ff6b872a3953649d6ce8bfa8a538c5e4a486 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"brace-expansion@npm:^5.0.2": + version: 5.0.4 + resolution: "brace-expansion@npm:5.0.4" + dependencies: + balanced-match: "npm:^4.0.2" + checksum: 10c0/359cbcfa80b2eb914ca1f3440e92313fbfe7919ee6b274c35db55bec555aded69dac5ee78f102cec90c35f98c20fa43d10936d0cd9978158823c249257e1643a + languageName: node + linkType: hard + +"brorand@npm:^1.0.1, brorand@npm:^1.1.0": + version: 1.1.0 + resolution: "brorand@npm:1.1.0" + checksum: 10c0/6f366d7c4990f82c366e3878492ba9a372a73163c09871e80d82fb4ae0d23f9f8924cb8a662330308206e6b3b76ba1d528b4601c9ef73c2166b440b2ea3b7571 + languageName: node + linkType: hard + +"browserify-aes@npm:^1.0.0, browserify-aes@npm:^1.0.4": + version: 1.2.0 + resolution: "browserify-aes@npm:1.2.0" + dependencies: + buffer-xor: "npm:^1.0.3" + cipher-base: "npm:^1.0.0" + create-hash: "npm:^1.1.0" + evp_bytestokey: "npm:^1.0.3" + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + checksum: 10c0/967f2ae60d610b7b252a4cbb55a7a3331c78293c94b4dd9c264d384ca93354c089b3af9c0dd023534efdc74ffbc82510f7ad4399cf82bc37bc07052eea485f18 + languageName: node + linkType: hard + +"browserify-cipher@npm:^1.0.0": + version: 1.0.1 + resolution: "browserify-cipher@npm:1.0.1" + dependencies: + browserify-aes: "npm:^1.0.4" + browserify-des: "npm:^1.0.0" + evp_bytestokey: "npm:^1.0.0" + checksum: 10c0/aa256dcb42bc53a67168bbc94ab85d243b0a3b56109dee3b51230b7d010d9b78985ffc1fb36e145c6e4db151f888076c1cfc207baf1525d3e375cbe8187fe27d + languageName: node + linkType: hard + +"browserify-des@npm:^1.0.0": + version: 1.0.2 + resolution: "browserify-des@npm:1.0.2" + dependencies: + cipher-base: "npm:^1.0.1" + des.js: "npm:^1.0.0" + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: 10c0/943eb5d4045eff80a6cde5be4e5fbb1f2d5002126b5a4789c3c1aae3cdddb1eb92b00fb92277f512288e5c6af330730b1dbabcf7ce0923e749e151fcee5a074d + languageName: node + linkType: hard + +"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.0.1": + version: 4.1.0 + resolution: "browserify-rsa@npm:4.1.0" + dependencies: + bn.js: "npm:^5.0.0" + randombytes: "npm:^2.0.1" + checksum: 10c0/fb2b5a8279d8a567a28d8ee03fb62e448428a906bab5c3dc9e9c3253ace551b5ea271db15e566ac78f1b1d71b243559031446604168b9235c351a32cae99d02a + languageName: node + linkType: hard + +"browserify-sign@npm:^4.0.0": + version: 4.2.1 + resolution: "browserify-sign@npm:4.2.1" + dependencies: + bn.js: "npm:^5.1.1" + browserify-rsa: "npm:^4.0.1" + create-hash: "npm:^1.2.0" + create-hmac: "npm:^1.1.7" + elliptic: "npm:^6.5.3" + inherits: "npm:^2.0.4" + parse-asn1: "npm:^5.1.5" + readable-stream: "npm:^3.6.0" + safe-buffer: "npm:^5.2.0" + checksum: 10c0/8f00a370e3e97060977dc58e51251d3ca398ee73523994a44430321e8de2c7d85395362d59014b2b07efe4190f369baee2ff28eb8f405ff4660b776651cf052d + languageName: node + linkType: hard + +"browserify-zlib@npm:^0.2.0": + version: 0.2.0 + resolution: "browserify-zlib@npm:0.2.0" + dependencies: + pako: "npm:~1.0.5" + checksum: 10c0/9ab10b6dc732c6c5ec8ebcbe5cb7fe1467f97402c9b2140113f47b5f187b9438f93a8e065d8baf8b929323c18324fbf1105af479ee86d9d36cab7d7ef3424ad9 + languageName: node + linkType: hard + +"browserslist@npm:^1.3.6, browserslist@npm:^1.5.2, browserslist@npm:^1.7.6": + version: 1.7.7 + resolution: "browserslist@npm:1.7.7" + dependencies: + caniuse-db: "npm:^1.0.30000639" + electron-to-chromium: "npm:^1.2.7" + bin: + browserslist: ./cli.js + checksum: 10c0/1caae2f00800711b3c18a834b84ab3109b955836f23e00a7eb0227e54c22a101b95a9606c1347a04ec882524a724ba57691f856a7aba3fde6dd197b867b8cd41 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 + languageName: node + linkType: hard + +"buffer-xor@npm:^1.0.3": + version: 1.0.3 + resolution: "buffer-xor@npm:1.0.3" + checksum: 10c0/fd269d0e0bf71ecac3146187cfc79edc9dbb054e2ee69b4d97dfb857c6d997c33de391696d04bdd669272751fa48e7872a22f3a6c7b07d6c0bc31dbe02a4075c + languageName: node + linkType: hard + +"buffer@npm:^4.3.0": + version: 4.9.2 + resolution: "buffer@npm:4.9.2" + dependencies: + base64-js: "npm:^1.0.2" + ieee754: "npm:^1.1.4" + isarray: "npm:^1.0.0" + checksum: 10c0/dc443d7e7caab23816b58aacdde710b72f525ad6eecd7d738fcaa29f6d6c12e8d9c13fed7219fd502be51ecf0615f5c077d4bdc6f9308dde2e53f8e5393c5b21 + languageName: node + linkType: hard + +"builtin-status-codes@npm:^3.0.0": + version: 3.0.0 + resolution: "builtin-status-codes@npm:3.0.0" + checksum: 10c0/c37bbba11a34c4431e56bd681b175512e99147defbe2358318d8152b3a01df7bf25e0305873947e5b350073d5ef41a364a22b37e48f1fb6d2fe6d5286a0f348c + languageName: node + linkType: hard + +"cacache@npm:^10.0.4": + version: 10.0.4 + resolution: "cacache@npm:10.0.4" + dependencies: + bluebird: "npm:^3.5.1" + chownr: "npm:^1.0.1" + glob: "npm:^7.1.2" + graceful-fs: "npm:^4.1.11" + lru-cache: "npm:^4.1.1" + mississippi: "npm:^2.0.0" + mkdirp: "npm:^0.5.1" + move-concurrently: "npm:^1.0.1" + promise-inflight: "npm:^1.0.1" + rimraf: "npm:^2.6.2" + ssri: "npm:^5.2.4" + unique-filename: "npm:^1.1.0" + y18n: "npm:^4.0.0" + checksum: 10c0/4c82d037ecc0ef87f58f96ecd3662bdb24aaedd18fa96d749363bc20dee3ac9f623e2c41e09bf894a3f62de1612a8cea8ddae22563a91ce2ef5cb69fe4cf54dd + languageName: node + linkType: hard + +"cacache@npm:^20.0.1": + version: 20.0.4 + resolution: "cacache@npm:20.0.4" + dependencies: + "@npmcli/fs": "npm:^5.0.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^13.0.0" + lru-cache: "npm:^11.1.0" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^7.0.2" + ssri: "npm:^13.0.0" + checksum: 10c0/539bf4020e44ba9ca5afc2ec435623ed7e0dd80c020097677e6b4a0545df5cc9d20b473212d01209c8b4aea43c0d095af0bb6da97bcb991642ea6fac0d7c462b + languageName: node + linkType: hard + +"camelcase@npm:^1.2.1": + version: 1.2.1 + resolution: "camelcase@npm:1.2.1" + checksum: 10c0/dec70dfd46be8e31c5f8a4616f441cc3902da9b807f843c2ad4f2a0c79a8907d91914184b40166e2111bfa76cb66de6107924c0529017204e810ef14390381fa + languageName: node + linkType: hard + +"camelcase@npm:^4.1.0": + version: 4.1.0 + resolution: "camelcase@npm:4.1.0" + checksum: 10c0/54c0b6a85b54fb4e96a9d834a9d0d8f760fd608ab6752a6789042b5e1c38d3dd60f878d2c590d005046445d32d77f6e05e568a91fe8db3e282da0a1560d83058 + languageName: node + linkType: hard + +"caniuse-api@npm:^1.5.2": + version: 1.6.1 + resolution: "caniuse-api@npm:1.6.1" + dependencies: + browserslist: "npm:^1.3.6" + caniuse-db: "npm:^1.0.30000529" + lodash.memoize: "npm:^4.1.2" + lodash.uniq: "npm:^4.5.0" + checksum: 10c0/0769ffb827dcc9d7f6fb1d9616d6ac9dcb0a271cfacd3b1026459f0c5052491ef5a458bdaca12c2204b65bf65aa0c43b880b9bfbe497a0469e319cb48f5da4fb + languageName: node + linkType: hard + +"caniuse-db@npm:^1.0.30000529, caniuse-db@npm:^1.0.30000634, caniuse-db@npm:^1.0.30000639": + version: 1.0.30001312 + resolution: "caniuse-db@npm:1.0.30001312" + checksum: 10c0/15ff3c027d64e26cd665f7f7c8b90b8f12de00929f063cc73f7a23f6afbc36ce7488209ad1537f9771ba0a87979f31ff28e5cc2ed6bc897e769e4c04a3a546c7 + languageName: node + linkType: hard + +"chalk@npm:^1.1.3": + version: 1.1.3 + resolution: "chalk@npm:1.1.3" + dependencies: + ansi-styles: "npm:^2.2.1" + escape-string-regexp: "npm:^1.0.2" + has-ansi: "npm:^2.0.0" + strip-ansi: "npm:^3.0.0" + supports-color: "npm:^2.0.0" + checksum: 10c0/28c3e399ec286bb3a7111fd4225ebedb0d7b813aef38a37bca7c498d032459c265ef43404201d5fbb8d888d29090899c95335b4c0cda13e8b126ff15c541cef8 + languageName: node + linkType: hard + +"chalk@npm:^2.4.1": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: "npm:^3.2.1" + escape-string-regexp: "npm:^1.0.5" + supports-color: "npm:^5.3.0" + checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 + languageName: node + linkType: hard + +"chownr@npm:^1.0.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 10c0/ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db + languageName: node + linkType: hard + +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + +"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": + version: 1.0.4 + resolution: "cipher-base@npm:1.0.4" + dependencies: + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + checksum: 10c0/d8d005f8b64d8a77b3d3ce531301ae7b45902c9cab4ec8b66bdbd2bf2a1d9fceb9a2133c293eb3c060b2d964da0f14c47fb740366081338aa3795dd1faa8984b + languageName: node + linkType: hard + +"clap@npm:^1.0.9": + version: 1.2.3 + resolution: "clap@npm:1.2.3" + dependencies: + chalk: "npm:^1.1.3" + checksum: 10c0/55da8d6a8b60e4718652e7b4310773cb618fbc0386c7648e57a2639a5696f409cb7b5e079b058759232de80cfda32d01fb38934520bbf7c07cd49898fb74bae2 + languageName: node + linkType: hard + +"cliui@npm:^3.2.0": + version: 3.2.0 + resolution: "cliui@npm:3.2.0" + dependencies: + string-width: "npm:^1.0.1" + strip-ansi: "npm:^3.0.1" + wrap-ansi: "npm:^2.0.0" + checksum: 10c0/07b121fac7fd33ff8dbf3523f0d3dca0329d4e457e57dee54502aa5f27a33cbd9e66aa3e248f0260d8a1431b65b2bad8f510cd97fb8ab6a8e0506310a92e18d5 + languageName: node + linkType: hard + +"clone@npm:^1.0.2": + version: 1.0.4 + resolution: "clone@npm:1.0.4" + checksum: 10c0/2176952b3649293473999a95d7bebfc9dc96410f6cbd3d2595cf12fd401f63a4bf41a7adbfd3ab2ff09ed60cb9870c58c6acdd18b87767366fabfc163700f13b + languageName: node + linkType: hard + +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: 10c0/c0e85ea0ca8bf0a50cbdca82efc5af0301240ca88ebe3644a6ffb8ffe911f34d40f8fbcf8f1d52c5ddd66706abd4d3bfcd64259f1e8e2371d4f47573b0dc8c28 + languageName: node + linkType: hard + +"coa@npm:~1.0.1": + version: 1.0.4 + resolution: "coa@npm:1.0.4" + dependencies: + q: "npm:^1.1.2" + checksum: 10c0/b15bb8d10f8a29b364fa6e4980aff1fee1da7ae4fe721ca9d806d04ddd95e394dcc9b6390028077b1911675e9cae26ea13c0d3fc332cdc3bb0a64e58547f7e60 + languageName: node + linkType: hard + +"code-point-at@npm:^1.0.0": + version: 1.1.0 + resolution: "code-point-at@npm:1.1.0" + checksum: 10c0/33f6b234084e46e6e369b6f0b07949392651b4dde70fc6a592a8d3dafa08d5bb32e3981a02f31f6fc323a26bc03a4c063a9d56834848695bda7611c2417ea2e6 + languageName: node + linkType: hard + +"color-convert@npm:^1.3.0, color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: "npm:1.1.3" + checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 + languageName: node + linkType: hard + +"color-name@npm:^1.0.0": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"color-string@npm:^0.3.0": + version: 0.3.0 + resolution: "color-string@npm:0.3.0" + dependencies: + color-name: "npm:^1.0.0" + checksum: 10c0/836bbbf58358c541cc5558ecb0376a4c857f08ed37519c2ab63f3d57ec205b52af929629f3d2d58b7d6f7fb7b6769697d83694454b667698be4eb46654f1f818 + languageName: node + linkType: hard + +"color@npm:^0.11.0": + version: 0.11.4 + resolution: "color@npm:0.11.4" + dependencies: + clone: "npm:^1.0.2" + color-convert: "npm:^1.3.0" + color-string: "npm:^0.3.0" + checksum: 10c0/93abcc7e2eb7c254d42b96a889aab887d2bf6fedf901fc13af88f8885377b84a0f0f11a033c3e9ef9e37dca65214466261acc781f00fdec1c8d221d20c4120ee + languageName: node + linkType: hard + +"colormin@npm:^1.0.5": + version: 1.1.2 + resolution: "colormin@npm:1.1.2" + dependencies: + color: "npm:^0.11.0" + css-color-names: "npm:0.0.4" + has: "npm:^1.0.1" + checksum: 10c0/3488aca21bb100864c28b8070d5f86387fd4966bff93f552bb10cdc506a8ed9d42c4e239975b224c70eb664f170f543c74d8bda62f28216268141e8dba12777a + languageName: node + linkType: hard + +"colors@npm:~1.1.2": + version: 1.1.2 + resolution: "colors@npm:1.1.2" + checksum: 10c0/21fa4c575e636d889187b4666988ff16a6464a845089ff7b5e0263883da8cfa9140029300ba67bc3e231f67a4eb610725f9e77cc1d74df47741b691a695aea11 + languageName: node + linkType: hard + +"commander@npm:~2.13.0": + version: 2.13.0 + resolution: "commander@npm:2.13.0" + checksum: 10c0/e3441096034439e506493ca1e5e9d5d5723ee0eadc3b2b92b3dd332b1d8fcbe72b70a1127f6790e6b3bedde3054316e9fe2cb36cef6ac051000b01559a16ba58 + languageName: node + linkType: hard + +"commondir@npm:^1.0.1": + version: 1.0.1 + resolution: "commondir@npm:1.0.1" + checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"concat-stream@npm:^1.5.0": + version: 1.6.2 + resolution: "concat-stream@npm:1.6.2" + dependencies: + buffer-from: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^2.2.2" + typedarray: "npm:^0.0.6" + checksum: 10c0/2e9864e18282946dabbccb212c5c7cec0702745e3671679eb8291812ca7fd12023f7d8cb36493942a62f770ac96a7f90009dc5c82ad69893438371720fa92617 + languageName: node + linkType: hard + +"console-browserify@npm:^1.1.0": + version: 1.2.0 + resolution: "console-browserify@npm:1.2.0" + checksum: 10c0/89b99a53b7d6cee54e1e64fa6b1f7ac24b844b4019c5d39db298637e55c1f4ffa5c165457ad984864de1379df2c8e1886cbbdac85d9dbb6876a9f26c3106f226 + languageName: node + linkType: hard + +"constants-browserify@npm:^1.0.0": + version: 1.0.0 + resolution: "constants-browserify@npm:1.0.0" + checksum: 10c0/ab49b1d59a433ed77c964d90d19e08b2f77213fb823da4729c0baead55e3c597f8f97ebccfdfc47bd896d43854a117d114c849a6f659d9986420e97da0f83ac5 + languageName: node + linkType: hard + +"copy-anything@npm:^2.0.1": + version: 2.0.6 + resolution: "copy-anything@npm:2.0.6" + dependencies: + is-what: "npm:^3.14.1" + checksum: 10c0/2702998a8cc015f9917385b7f16b0d85f1f6e5e2fd34d99f14df584838f492f49aa0c390d973684c687e895c5c58d08b308a0400ac3e1e3d6fa1e5884a5402ad + languageName: node + linkType: hard + +"copy-concurrently@npm:^1.0.0": + version: 1.0.5 + resolution: "copy-concurrently@npm:1.0.5" + dependencies: + aproba: "npm:^1.1.1" + fs-write-stream-atomic: "npm:^1.0.8" + iferr: "npm:^0.1.5" + mkdirp: "npm:^0.5.1" + rimraf: "npm:^2.5.4" + run-queue: "npm:^1.0.0" + checksum: 10c0/c2ce213cb27ee3df584d16eb6c9bfe99cfb531585007533c3e4c752521b4fbf0b2f7f90807d79c496683330808ecd9fdbd9ab9ddfa0913150b7f5097423348ce + languageName: node + linkType: hard + +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 + languageName: node + linkType: hard + +"create-ecdh@npm:^4.0.0": + version: 4.0.4 + resolution: "create-ecdh@npm:4.0.4" + dependencies: + bn.js: "npm:^4.1.0" + elliptic: "npm:^6.5.3" + checksum: 10c0/77b11a51360fec9c3bce7a76288fc0deba4b9c838d5fb354b3e40c59194d23d66efe6355fd4b81df7580da0661e1334a235a2a5c040b7569ba97db428d466e7f + languageName: node + linkType: hard + +"create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": + version: 1.2.0 + resolution: "create-hash@npm:1.2.0" + dependencies: + cipher-base: "npm:^1.0.1" + inherits: "npm:^2.0.1" + md5.js: "npm:^1.3.4" + ripemd160: "npm:^2.0.1" + sha.js: "npm:^2.4.0" + checksum: 10c0/d402e60e65e70e5083cb57af96d89567954d0669e90550d7cec58b56d49c4b193d35c43cec8338bc72358198b8cbf2f0cac14775b651e99238e1cf411490f915 + languageName: node + linkType: hard + +"create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": + version: 1.1.7 + resolution: "create-hmac@npm:1.1.7" + dependencies: + cipher-base: "npm:^1.0.3" + create-hash: "npm:^1.1.0" + inherits: "npm:^2.0.1" + ripemd160: "npm:^2.0.0" + safe-buffer: "npm:^5.0.1" + sha.js: "npm:^2.4.8" + checksum: 10c0/24332bab51011652a9a0a6d160eed1e8caa091b802335324ae056b0dcb5acbc9fcf173cf10d128eba8548c3ce98dfa4eadaa01bd02f44a34414baee26b651835 + languageName: node + linkType: hard + +"cross-spawn@npm:^5.0.1": + version: 5.1.0 + resolution: "cross-spawn@npm:5.1.0" + dependencies: + lru-cache: "npm:^4.0.1" + shebang-command: "npm:^1.2.0" + which: "npm:^1.2.9" + checksum: 10c0/1918621fddb9f8c61e02118b2dbf81f611ccd1544ceaca0d026525341832b8511ce2504c60f935dbc06b35e5ef156fe8c1e72708c27dd486f034e9c0e1e07201 + languageName: node + linkType: hard + +"crypto-browserify@npm:^3.11.0": + version: 3.12.0 + resolution: "crypto-browserify@npm:3.12.0" + dependencies: + browserify-cipher: "npm:^1.0.0" + browserify-sign: "npm:^4.0.0" + create-ecdh: "npm:^4.0.0" + create-hash: "npm:^1.1.0" + create-hmac: "npm:^1.1.0" + diffie-hellman: "npm:^5.0.0" + inherits: "npm:^2.0.1" + pbkdf2: "npm:^3.0.3" + public-encrypt: "npm:^4.0.0" + randombytes: "npm:^2.0.0" + randomfill: "npm:^1.0.3" + checksum: 10c0/0c20198886576050a6aa5ba6ae42f2b82778bfba1753d80c5e7a090836890dc372bdc780986b2568b4fb8ed2a91c958e61db1f0b6b1cc96af4bd03ffc298ba92 + languageName: node + linkType: hard + +"css-color-names@npm:0.0.4": + version: 0.0.4 + resolution: "css-color-names@npm:0.0.4" + checksum: 10c0/88ef97c25bcfb217469cdff428049022438cc546eb208210f0edec03b75050723db3ba02cd0f4959c84cd0659be0b43af3323eff80d1ba5fb15c2accf09ccbe2 + languageName: node + linkType: hard + +"css-loader@npm:^0.28.11": + version: 0.28.11 + resolution: "css-loader@npm:0.28.11" + dependencies: + babel-code-frame: "npm:^6.26.0" + css-selector-tokenizer: "npm:^0.7.0" + cssnano: "npm:^3.10.0" + icss-utils: "npm:^2.1.0" + loader-utils: "npm:^1.0.2" + lodash.camelcase: "npm:^4.3.0" + object-assign: "npm:^4.1.1" + postcss: "npm:^5.0.6" + postcss-modules-extract-imports: "npm:^1.2.0" + postcss-modules-local-by-default: "npm:^1.2.0" + postcss-modules-scope: "npm:^1.1.0" + postcss-modules-values: "npm:^1.3.0" + postcss-value-parser: "npm:^3.3.0" + source-list-map: "npm:^2.0.0" + checksum: 10c0/36434d7fafde8a4de3995c444713a455df17f74cfe10f089481cb7918db6f206267301daf2ae0496544809ca35bb226df47aa4edeb9580704c96281a07091f8b + languageName: node + linkType: hard + +"css-selector-tokenizer@npm:^0.7.0": + version: 0.7.3 + resolution: "css-selector-tokenizer@npm:0.7.3" + dependencies: + cssesc: "npm:^3.0.0" + fastparse: "npm:^1.1.2" + checksum: 10c0/bc4d14204bf5716f70085526bf370cbdd1c643dcb2e7366ba96212649fa5a07885e3f5dc2bde53646bac557ded79a60c7118cf7cf5d4dda898353a9e08277649 + languageName: node + linkType: hard + +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7 + languageName: node + linkType: hard + +"cssnano@npm:^3.10.0": + version: 3.10.0 + resolution: "cssnano@npm:3.10.0" + dependencies: + autoprefixer: "npm:^6.3.1" + decamelize: "npm:^1.1.2" + defined: "npm:^1.0.0" + has: "npm:^1.0.1" + object-assign: "npm:^4.0.1" + postcss: "npm:^5.0.14" + postcss-calc: "npm:^5.2.0" + postcss-colormin: "npm:^2.1.8" + postcss-convert-values: "npm:^2.3.4" + postcss-discard-comments: "npm:^2.0.4" + postcss-discard-duplicates: "npm:^2.0.1" + postcss-discard-empty: "npm:^2.0.1" + postcss-discard-overridden: "npm:^0.1.1" + postcss-discard-unused: "npm:^2.2.1" + postcss-filter-plugins: "npm:^2.0.0" + postcss-merge-idents: "npm:^2.1.5" + postcss-merge-longhand: "npm:^2.0.1" + postcss-merge-rules: "npm:^2.0.3" + postcss-minify-font-values: "npm:^1.0.2" + postcss-minify-gradients: "npm:^1.0.1" + postcss-minify-params: "npm:^1.0.4" + postcss-minify-selectors: "npm:^2.0.4" + postcss-normalize-charset: "npm:^1.1.0" + postcss-normalize-url: "npm:^3.0.7" + postcss-ordered-values: "npm:^2.1.0" + postcss-reduce-idents: "npm:^2.2.2" + postcss-reduce-initial: "npm:^1.0.0" + postcss-reduce-transforms: "npm:^1.0.3" + postcss-svgo: "npm:^2.1.1" + postcss-unique-selectors: "npm:^2.0.2" + postcss-value-parser: "npm:^3.2.3" + postcss-zindex: "npm:^2.0.1" + checksum: 10c0/1231f79be4761fa61478fb2a51d1aa95798eb426e33cde95341b5e9c71ec56c170fcc4c8d0618a8961033efb9da6230539eea933431c983ef065c014865e50f4 + languageName: node + linkType: hard + +"csso@npm:~2.3.1": + version: 2.3.2 + resolution: "csso@npm:2.3.2" + dependencies: + clap: "npm:^1.0.9" + source-map: "npm:^0.5.3" + bin: + csso: ./bin/csso + checksum: 10c0/e36a1cae8f371327cbf22d6770b8827291fa4f372bbaab938d5afc869e73f0a452ba4e87738bf03bfbb3bba27770efa04a6b4acaf5f36e94f88e8c481b9df7fa + languageName: node + linkType: hard + +"cyclist@npm:^1.0.1": + version: 1.0.1 + resolution: "cyclist@npm:1.0.1" + checksum: 10c0/3381d3b66a3b268e6e0abcc1fa8fbeeb9a98391d8455677509f9833813d7680cc737a10141f54c229e42f5b3133250f36f1aa04f56ef4ba9b29fa728c3c48c01 + languageName: node + linkType: hard + +"d@npm:1, d@npm:^1.0.1": + version: 1.0.1 + resolution: "d@npm:1.0.1" + dependencies: + es5-ext: "npm:^0.10.50" + type: "npm:^1.0.1" + checksum: 10c0/1fedcb3b956a461f64d86b94b347441beff5cef8910b6ac4ec509a2c67eeaa7093660a98b26601ac91f91260238add73bdf25867a9c0cb783774642bc4c1523f + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.3.4": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 + languageName: node + linkType: hard + +"debug@npm:^3.2.6": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + languageName: node + linkType: hard + +"decamelize@npm:^1.1.1, decamelize@npm:^1.1.2": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: 10c0/85c39fe8fbf0482d4a1e224ef0119db5c1897f8503bcef8b826adff7a1b11414972f6fef2d7dec2ee0b4be3863cf64ac1439137ae9e6af23a3d8dcbe26a5b4b2 + languageName: node + linkType: hard + +"defined@npm:^1.0.0": + version: 1.0.0 + resolution: "defined@npm:1.0.0" + checksum: 10c0/2b9929414857729a97cfcc77987e65005e03b3fd92747e1d6a743b054c1387b62e669dc453b53e3a8105f1398df6aad54c07eed984871c93be8c7f4560a1828b + languageName: node + linkType: hard + +"des.js@npm:^1.0.0": + version: 1.0.1 + resolution: "des.js@npm:1.0.1" + dependencies: + inherits: "npm:^2.0.1" + minimalistic-assert: "npm:^1.0.0" + checksum: 10c0/69bf742d1c381e01d75151bdcaac71a18d251d7debfc9b6ae5ee4b4edaf39691ae203c5ec9173ba89aedb3ddc622cdff4fca065448c6c2afb1140d9fb826339d + languageName: node + linkType: hard + +"diff@npm:~5.0.0": + version: 5.0.0 + resolution: "diff@npm:5.0.0" + checksum: 10c0/08c5904779bbababcd31f1707657b1ad57f8a9b65e6f88d3fb501d09a965d5f8d73066898a7d3f35981f9e4101892c61d99175d421f3b759533213c253d91134 + languageName: node + linkType: hard + +"diffie-hellman@npm:^5.0.0": + version: 5.0.3 + resolution: "diffie-hellman@npm:5.0.3" + dependencies: + bn.js: "npm:^4.1.0" + miller-rabin: "npm:^4.0.0" + randombytes: "npm:^2.0.0" + checksum: 10c0/ce53ccafa9ca544b7fc29b08a626e23a9b6562efc2a98559a0c97b4718937cebaa9b5d7d0a05032cc9c1435e9b3c1532b9e9bf2e0ede868525922807ad6e1ecf + languageName: node + linkType: hard + +"domain-browser@npm:^1.1.1": + version: 1.2.0 + resolution: "domain-browser@npm:1.2.0" + checksum: 10c0/a955f482f4b4710fbd77c12a33e77548d63603c30c80f61a80519f27e3db1ba8530b914584cc9e9365d2038753d6b5bd1f4e6c81e432b007b0ec95b8b5e69b1b + languageName: node + linkType: hard "dropzone@https://github.com/CenterForOpenScience/dropzone.git#aba21eb6b82cc823ac7a7a53d6e035791c082bae": - version "4.3.0" - resolved "https://github.com/CenterForOpenScience/dropzone.git#aba21eb6b82cc823ac7a7a53d6e035791c082bae" - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -electron-to-chromium@^1.2.7: - version "1.4.71" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz#17056914465da0890ce00351a3b946fd4cd51ff6" - integrity sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw== - -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" - integrity sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24= - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - object-assign "^4.0.1" - tapable "^0.2.7" - -errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -error-ex@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14: - version "0.10.53" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" - integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.3" - next-tick "~1.0.0" - -es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA= - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE= - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= - dependencies: - d "1" - es5-ext "~0.10.14" - -es6-symbol@^3.1.1, es6-symbol@~3.1.1, es6-symbol@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -es6-weak-map@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" - integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== - dependencies: - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - es6-symbol "^3.1.1" - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM= - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= - -esrecurse@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= - dependencies: - d "1" - es5-ext "~0.10.14" - -events@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -exports-loader@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.6.3.tgz#57dc78917f709b96f247fa91e69b554c855013c8" - integrity sha1-V9x4kX9wm5byR/qR5ptVTIVQE8g= - dependencies: - loader-utils "0.2.x" - source-map "0.1.x" - -ext@^1.1.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" - integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== - dependencies: - type "^2.5.0" - -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fastparse@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" - integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== - -file-loader@^0.11.2: - version "0.11.2" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.11.2.tgz#4ff1df28af38719a6098093b88c82c71d1794a34" - integrity sha512-N+uhF3mswIFeziHQjGScJ/yHXYt3DiLBeC+9vWW+WjUBiClMSOlV1YrXQi+7KM2aA3Rn4Bybgv+uXFQbfkzpvg== - dependencies: - loader-utils "^1.0.2" - -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= - dependencies: - commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" - integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^7.1.2, glob@^7.1.3: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== - -gsap@3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/gsap/-/gsap-3.9.1.tgz#d4c7443540497afee9ddc0824fd0180224e33360" - integrity sha512-JSGVYoC6da4pIjdF/yxFU6Rz8OojOIDkbooveZlfNg0+JIoFoRruyfWAEi6R/gUeNcuOiTqUIb0gi1nCNrHf8w== - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= - -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has@^1.0.1, has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -highlight.js@~9.18.2: - version "9.18.5" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" - integrity sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -iconv-lite@0.4.24, iconv-lite@^0.4.4: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-replace-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" - integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= - -icss-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" - integrity sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI= - dependencies: - postcss "^6.0.1" - -ieee754@^1.1.4: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - -image-size@~0.5.0: - version "0.5.5" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" - integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= - -imports-loader@^0.6.3: - version "0.6.5" - resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.6.5.tgz#ae74653031d59e37b3c2fb2544ac61aeae3530a6" - integrity sha1-rnRlMDHVnjezwvslRKxhrq41MKY= - dependencies: - loader-utils "0.2.x" - source-map "0.1.x" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= - -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== - dependencies: - has "^1.0.3" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-svg@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" - integrity sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk= - dependencies: - html-comment-regex "^1.1.0" - -is-what@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" - integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== - -isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -jquery-ui@>=1.10.4: - version "1.13.1" - resolved "https://registry.yarnpkg.com/jquery-ui/-/jquery-ui-1.13.1.tgz#d0b7a42e73a04c31bb5706adf86f6f8942f64eaa" - integrity sha512-2VlU59N5P4HaumDK1Z3XEVjSvegFbEOQRgpHUBaB2Ak98Axl3hFhJ6RFcNQNuk9SfL6WxIbuLst8dW/U56NSiA== - dependencies: - jquery ">=1.8.0 <4.0.0" - -jquery@>=1.11.0, jquery@>=1.7, "jquery@>=1.8.0 <4.0.0", jquery@^3.5.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" - integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw== - -js-base64@^2.1.9: - version "2.6.4" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" - integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== - -js-cookie@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.1.tgz#9e39b4c6c2f56563708d7d31f6f5f21873a92414" - integrity sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw== - -js-md5@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/js-md5/-/js-md5-0.7.3.tgz#b4f2fbb0b327455f598d6727e38ec272cd09c3f2" - integrity sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ== - -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -js-yaml@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" - integrity sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A= - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - -json-loader@^0.5.4: - version "0.5.7" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" - integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== - -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json5@^0.5.0, json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -jstimezonedetect@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/jstimezonedetect/-/jstimezonedetect-1.0.7.tgz#54bc13ff9960a6510288665cc9596244e21bd29d" - integrity sha512-ARADHortktl9IZ1tr4GHwGPIAzgz3mLNCbR/YjWtRtc/O0o634O3NeFlpLjv95EvuDA5dc8z6yfgbS8nUc4zcQ== - -keen-dataviz@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/keen-dataviz/-/keen-dataviz-1.2.1.tgz#6f7595a2051652e1bece2ce2296e47ffa5d79dd9" - integrity sha1-b3WVogUWUuG+ziziKW5H/6XXndk= - dependencies: - c3 "^0.4.18" - d3 "^3.5.17" - -knockout.validation@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/knockout.validation/-/knockout.validation-2.0.4.tgz#e87f82f41b5bdcb7029ea6be3fef2a903054558b" - integrity sha512-64eDuEvALXf5GsRK5b2WIetF/eSIlTsw/ZDerrhKt+3eRBBk95SXdczTLhcoNL4Hi8Gym14YYIjj7vLCXEeHDA== - -knockout@~3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/knockout/-/knockout-3.4.2.tgz#e87958de77ad1e936f7ce645bab8b5d7c456d937" - integrity sha1-6HlY3netHpNvfOZFuri118RW2Tc= - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - -less@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/less/-/less-4.1.2.tgz#6099ee584999750c2624b65f80145f8674e4b4b0" - integrity sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA== - dependencies: - copy-anything "^2.0.1" - parse-node-version "^1.0.1" - tslib "^2.3.0" - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - make-dir "^2.1.0" - mime "^1.4.1" - needle "^2.5.2" - source-map "~0.6.0" - -linkifyjs@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-3.0.5.tgz#99e51a3a0c0e232fcb63ebb89eea3ff923378f34" - integrity sha512-1Y9XQH65eQKA9p2xtk+zxvnTeQBG7rdAXSkUG97DmuI/Xhji9uaUzaWxRj6rf9YC0v8KKHkxav7tnLX82Sz5Fg== - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -loader-runner@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - -loader-utils@0.2.x: - version "0.2.17" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" - integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - object-assign "^4.0.1" - -loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -loaders.css@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/loaders.css/-/loaders.css-0.1.2.tgz#3a9fb43726c73334a38142af9d0629019b658743" - integrity sha1-Op+0NybHMzSjgUKvnQYpAZtlh0M= - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - -lodash.chunk@^4.0.6: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" - integrity sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw= - -lodash.find@^4.3.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" - integrity sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E= - -lodash.get@^4.2.1: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - -lodash.has@^4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" - integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= - -lodash.includes@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" - integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.set@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" - integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= - -lodash@^4.17.14: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lru-cache@^4.0.1, lru-cache@^4.1.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" - -make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -math-expression-evaluator@^1.2.14: - version "1.3.14" - resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.3.14.tgz#0ebeaccf65fea0f6f5a626f88df41814e5fcd9bf" - integrity sha512-M6AMrvq9bO8uL42KvQHPA2/SbAobA0R7gviUmPrcTcGfdwpaLitz4q2Euzx2lP9Oy88vxK3HOrsISgSwKsYS4A== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= - dependencies: - mimic-fn "^1.0.0" - -memory-fs@^0.4.0, memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.51.0: - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@~2.1.24: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== - dependencies: - mime-db "1.51.0" - -mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@^1.4.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@^3.0.4: - version "3.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.5.tgz#4da8f1290ee0f0f8e83d60ca69f8f134068604a3" - integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mississippi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" - integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^2.0.1" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mithril@0.2.0, mithril@>=0.2: - version "0.2.0" - resolved "https://registry.yarnpkg.com/mithril/-/mithril-0.2.0.tgz#98e007699a15b243a26b3b522f61bee90fa5ffb9" - integrity sha1-mOAHaZoVskOiaztSL2G+6Q+l/7k= - -mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -moment@^2.14.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" - integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -needle@^2.5.2: - version "2.9.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" - integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -next-tick@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - -node-libs-browser@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-url@^1.4.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -object-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I= - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - -parse-node-version@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pikaday@^1.3.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/pikaday/-/pikaday-1.8.2.tgz#72cc73fab7ccc068cbdf7dcaa1ce400fcfd894e3" - integrity sha512-TNtsE+34BIax3WtkB/qqu5uepV1McKYEgvL3kWzU7aqPCpMEN6rBF3AOwu4WCwAealWlBGobXny/9kJb49C1ew== - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - -popper.js@^1.16.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" - integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== - -postcss-calc@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" - integrity sha1-d7rnypKK2FcW4v2kLyYb98HWW14= - dependencies: - postcss "^5.0.2" - postcss-message-helpers "^2.0.0" - reduce-css-calc "^1.2.6" - -postcss-colormin@^2.1.8: - version "2.2.2" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" - integrity sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks= - dependencies: - colormin "^1.0.5" - postcss "^5.0.13" - postcss-value-parser "^3.2.3" - -postcss-convert-values@^2.3.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" - integrity sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0= - dependencies: - postcss "^5.0.11" - postcss-value-parser "^3.1.2" - -postcss-discard-comments@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" - integrity sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0= - dependencies: - postcss "^5.0.14" - -postcss-discard-duplicates@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" - integrity sha1-uavye4isGIFYpesSq8riAmO5GTI= - dependencies: - postcss "^5.0.4" - -postcss-discard-empty@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" - integrity sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU= - dependencies: - postcss "^5.0.14" - -postcss-discard-overridden@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" - integrity sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg= - dependencies: - postcss "^5.0.16" - -postcss-discard-unused@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" - integrity sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM= - dependencies: - postcss "^5.0.14" - uniqs "^2.0.0" - -postcss-filter-plugins@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" - integrity sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ== - dependencies: - postcss "^5.0.4" - -postcss-merge-idents@^2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" - integrity sha1-TFUwMTwI4dWzu/PSu8dH4njuonA= - dependencies: - has "^1.0.1" - postcss "^5.0.10" - postcss-value-parser "^3.1.1" - -postcss-merge-longhand@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" - integrity sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg= - dependencies: - postcss "^5.0.4" - -postcss-merge-rules@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" - integrity sha1-0d9d+qexrMO+VT8OnhDofGG19yE= - dependencies: - browserslist "^1.5.2" - caniuse-api "^1.5.2" - postcss "^5.0.4" - postcss-selector-parser "^2.2.2" - vendors "^1.0.0" - -postcss-message-helpers@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" - integrity sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4= - -postcss-minify-font-values@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" - integrity sha1-S1jttWZB66fIR0qzUmyv17vey2k= - dependencies: - object-assign "^4.0.1" - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-minify-gradients@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" - integrity sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE= - dependencies: - postcss "^5.0.12" - postcss-value-parser "^3.3.0" - -postcss-minify-params@^1.0.4: - version "1.2.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" - integrity sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM= - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.2" - postcss-value-parser "^3.0.2" - uniqs "^2.0.0" - -postcss-minify-selectors@^2.0.4: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" - integrity sha1-ssapjAByz5G5MtGkllCBFDEXNb8= - dependencies: - alphanum-sort "^1.0.2" - has "^1.0.1" - postcss "^5.0.14" - postcss-selector-parser "^2.0.0" - -postcss-modules-extract-imports@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a" - integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw== - dependencies: - postcss "^6.0.1" - -postcss-modules-local-by-default@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" - integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= - dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" - -postcss-modules-scope@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" - integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= - dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" - -postcss-modules-values@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" - integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= - dependencies: - icss-replace-symbols "^1.1.0" - postcss "^6.0.1" - -postcss-normalize-charset@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" - integrity sha1-757nEhLX/nWceO0WL2HtYrXLk/E= - dependencies: - postcss "^5.0.5" - -postcss-normalize-url@^3.0.7: - version "3.0.8" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" - integrity sha1-EI90s/L82viRov+j6kWSJ5/HgiI= - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^1.4.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - -postcss-ordered-values@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" - integrity sha1-7sbCpntsQSqNsgQud/6NpD+VwR0= - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.1" - -postcss-reduce-idents@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" - integrity sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM= - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-reduce-initial@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" - integrity sha1-aPgGlfBF0IJjqHmtJA343WT2ROo= - dependencies: - postcss "^5.0.4" - -postcss-reduce-transforms@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" - integrity sha1-/3b02CEkN7McKYpC0uFEQCV3GuE= - dependencies: - has "^1.0.1" - postcss "^5.0.8" - postcss-value-parser "^3.0.1" - -postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" - integrity sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A= - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-svgo@^2.1.1: - version "2.1.6" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" - integrity sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0= - dependencies: - is-svg "^2.0.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - svgo "^0.7.0" - -postcss-unique-selectors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" - integrity sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0= - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - -postcss-zindex@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" - integrity sha1-0hCd3AVbka9n/EyzsCWUZjnSryI= - dependencies: - has "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: - version "5.2.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" - integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== - dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.2.3" - -postcss@^6.0.1: - version "6.0.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" - integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== - dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.4.0" - -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -pretty-data@^0.40.0: - version "0.40.0" - resolved "https://registry.yarnpkg.com/pretty-data/-/pretty-data-0.40.0.tgz#572aa8ea23467467ab94b6b5266a6fd9c8fddd72" - integrity sha1-Vyqo6iNGdGerlLa1Jmpv2cj93XI= - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0, pump@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -qs@6.9.7: - version "6.9.7" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" - integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== - -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -raw-body@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" - integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== - dependencies: - bytes "3.1.2" - http-errors "1.8.1" - iconv-lite "0.4.24" - unpipe "1.0.0" - -raw-loader@~0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" - integrity sha1-DD0L6u2KAclm2Xh793goElKpeao= - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -reduce-css-calc@^1.2.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" - integrity sha1-dHyRTgSWFKTJz7umKYca0dKSdxY= - dependencies: - balanced-match "^0.4.2" - math-expression-evaluator "^1.2.14" - reduce-function-call "^1.0.1" - -reduce-function-call@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.3.tgz#60350f7fb252c0a67eb10fd4694d16909971300f" - integrity sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ== - dependencies: - balanced-match "^1.0.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - -resolve@^1.10.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== - dependencies: - is-core-module "^2.8.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -rimraf@^2.5.4, rimraf@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4, sax@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -schema-utils@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" - integrity sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8= - dependencies: - ajv "^5.0.0" - -schema-utils@^0.4.5: - version "0.4.7" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" - integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -select2@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/select2/-/select2-3.5.1.tgz#f2819489bbc65fd6d328be72bbe2b95dd7e87cfe" - integrity sha1-8oGUibvGX9bTKL5yu+K5XdfofP4= - -"semver@2 || 3 || 4 || 5", semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -serialize-javascript@^1.4.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" - integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -signal-exit@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= - dependencies: - is-plain-obj "^1.0.0" - -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - -source-map@0.1.x: - version "0.1.43" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" - integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.3, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -ssri@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" - integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== - dependencies: - safe-buffer "^5.1.1" - -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -style-loader@^0.23.1: - version "0.23.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" - integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== - dependencies: - loader-utils "^1.1.0" - schema-utils "^1.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= - dependencies: - has-flag "^1.0.0" - -supports-color@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= - dependencies: - has-flag "^2.0.0" - -supports-color@^5.3.0, supports-color@^5.4.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svgo@^0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" - integrity sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U= - dependencies: - coa "~1.0.1" - colors "~1.1.2" - csso "~2.3.1" - js-yaml "~3.7.0" - mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" - -tapable@^0.2.7: - version "0.2.9" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8" - integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A== - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + version: 4.3.0 + resolution: "dropzone@https://github.com/CenterForOpenScience/dropzone.git#commit=aba21eb6b82cc823ac7a7a53d6e035791c082bae" + checksum: 10c0/3512cf3c01a4bacfccebb9e9e99c78af0a1e5adf5e89a31fd5316b9d1cd396562f86727a7cb65d1dc57626a9557db6c8f11d96b98d405a2cf1409f35ede85590 + languageName: node + linkType: hard + +"duplexify@npm:^3.4.2, duplexify@npm:^3.6.0": + version: 3.7.1 + resolution: "duplexify@npm:3.7.1" + dependencies: + end-of-stream: "npm:^1.0.0" + inherits: "npm:^2.0.1" + readable-stream: "npm:^2.0.0" + stream-shift: "npm:^1.0.0" + checksum: 10c0/59d1440c1b4e3a4db35ae96933392703ce83518db1828d06b9b6322920d6cbbf0b7159e88be120385fe459e77f1eb0c7622f26e9ec1f47c9ff05c2b35747dbd3 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.2.7": + version: 1.4.71 + resolution: "electron-to-chromium@npm:1.4.71" + checksum: 10c0/849e48d95b26a458485c5581c051fcd61594b6cb5a461871019d986097f8abe1efc405db9add00f73fbfdbf92bb0025c8c64410b06fecce835430c3bb88f7fdb + languageName: node + linkType: hard + +"elliptic@npm:^6.5.3": + version: 6.5.4 + resolution: "elliptic@npm:6.5.4" + dependencies: + bn.js: "npm:^4.11.9" + brorand: "npm:^1.1.0" + hash.js: "npm:^1.0.0" + hmac-drbg: "npm:^1.0.1" + inherits: "npm:^2.0.4" + minimalistic-assert: "npm:^1.0.1" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10c0/5f361270292c3b27cf0843e84526d11dec31652f03c2763c6c2b8178548175ff5eba95341dd62baff92b2265d1af076526915d8af6cc9cb7559c44a62f8ca6e2 + languageName: node + linkType: hard + +"emojis-list@npm:^2.0.0": + version: 2.1.0 + resolution: "emojis-list@npm:2.1.0" + checksum: 10c0/bbb941223bfb3e38054cb52ed1b3098a8dac0a90fdd2699eb8a3af3b2172cdc4af0932e05c3edd52e814997c8f45cf1d7f5e86e9ecdcd4e2390a0f27e6914db5 + languageName: node + linkType: hard + +"emojis-list@npm:^3.0.0": + version: 3.0.0 + resolution: "emojis-list@npm:3.0.0" + checksum: 10c0/7dc4394b7b910444910ad64b812392159a21e1a7ecc637c775a440227dcb4f80eff7fe61f4453a7d7603fa23d23d30cc93fe9e4b5ed985b88d6441cd4a35117b + languageName: node + linkType: hard + +"end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: 10c0/870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 + languageName: node + linkType: hard + +"enhanced-resolve@npm:^3.4.0": + version: 3.4.1 + resolution: "enhanced-resolve@npm:3.4.1" + dependencies: + graceful-fs: "npm:^4.1.2" + memory-fs: "npm:^0.4.0" + object-assign: "npm:^4.0.1" + tapable: "npm:^0.2.7" + checksum: 10c0/91f2da7e8e5ab2376823843a0e0176f683cfdb5749efbb6e1f26580b285593bb5b69006a1ae5e068c21ab1eb90271eec8b8fd6aa3ac36cc6f1f6de4d37a06456 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"errno@npm:^0.1.1, errno@npm:^0.1.3, errno@npm:~0.1.7": + version: 0.1.8 + resolution: "errno@npm:0.1.8" + dependencies: + prr: "npm:~1.0.1" + bin: + errno: cli.js + checksum: 10c0/83758951967ec57bf00b5f5b7dc797e6d65a6171e57ea57adcf1bd1a0b477fd9b5b35fae5be1ff18f4090ed156bce1db749fe7e317aac19d485a5d150f6a4936 + languageName: node + linkType: hard + +"error-ex@npm:^1.2.0": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + languageName: node + linkType: hard + +"es5-ext@npm:^0.10.35, es5-ext@npm:^0.10.46, es5-ext@npm:^0.10.50, es5-ext@npm:~0.10.14": + version: 0.10.53 + resolution: "es5-ext@npm:0.10.53" + dependencies: + es6-iterator: "npm:~2.0.3" + es6-symbol: "npm:~3.1.3" + next-tick: "npm:~1.0.0" + checksum: 10c0/02989b89e777264756696baf64b6daf54e0be631b09870dfab8473e81129303c2791a001bf1f06bb38bf008403a0daad02e8001cb419ad8e4430452400ecd771 + languageName: node + linkType: hard + +"es6-iterator@npm:^2.0.3, es6-iterator@npm:~2.0.1, es6-iterator@npm:~2.0.3": + version: 2.0.3 + resolution: "es6-iterator@npm:2.0.3" + dependencies: + d: "npm:1" + es5-ext: "npm:^0.10.35" + es6-symbol: "npm:^3.1.1" + checksum: 10c0/91f20b799dba28fb05bf623c31857fc1524a0f1c444903beccaf8929ad196c8c9ded233e5ac7214fc63a92b3f25b64b7f2737fcca8b1f92d2d96cf3ac902f5d8 + languageName: node + linkType: hard + +"es6-map@npm:^0.1.3": + version: 0.1.5 + resolution: "es6-map@npm:0.1.5" + dependencies: + d: "npm:1" + es5-ext: "npm:~0.10.14" + es6-iterator: "npm:~2.0.1" + es6-set: "npm:~0.1.5" + es6-symbol: "npm:~3.1.1" + event-emitter: "npm:~0.3.5" + checksum: 10c0/62fe1a90ead1704bed699cb9c975e642023f590d5338c2a640d60ce0a846de7d5197561393ac03dd11473b96087cf8793c9e4836fe05ad4d2ef6afda6b9a3511 + languageName: node + linkType: hard + +"es6-set@npm:~0.1.5": + version: 0.1.5 + resolution: "es6-set@npm:0.1.5" + dependencies: + d: "npm:1" + es5-ext: "npm:~0.10.14" + es6-iterator: "npm:~2.0.1" + es6-symbol: "npm:3.1.1" + event-emitter: "npm:~0.3.5" + checksum: 10c0/a1fe925f77bd529b7b5135ca1a8bc9ff378fa0e3fd9686f3ac1b8e87eb00fbffc100e81a3c44262cd324cbfcc772d7a75ca5471e3fb24247ac85c5beb6af0d14 + languageName: node + linkType: hard + +"es6-symbol@npm:3.1.1": + version: 3.1.1 + resolution: "es6-symbol@npm:3.1.1" + dependencies: + d: "npm:1" + es5-ext: "npm:~0.10.14" + checksum: 10c0/eb4ec788a99dc2c04e5e9abd90f478991425a881eced99a7165eada0c832bfc9a8fbb76b688c3c3b6e103f94d23e8e19addf9cf18abb537fb918d066d5ce1d7f + languageName: node + linkType: hard + +"es6-symbol@npm:^3.1.1, es6-symbol@npm:~3.1.1, es6-symbol@npm:~3.1.3": + version: 3.1.3 + resolution: "es6-symbol@npm:3.1.3" + dependencies: + d: "npm:^1.0.1" + ext: "npm:^1.1.2" + checksum: 10c0/22982f815f00df553a89f4fb74c5048fed85df598482b4bd38dbd173174247949c72982a7d7132a58b147525398400e5f182db59b0916cb49f1e245fb0e22233 + languageName: node + linkType: hard + +"es6-weak-map@npm:^2.0.1": + version: 2.0.3 + resolution: "es6-weak-map@npm:2.0.3" + dependencies: + d: "npm:1" + es5-ext: "npm:^0.10.46" + es6-iterator: "npm:^2.0.3" + es6-symbol: "npm:^3.1.1" + checksum: 10c0/460932be9542473dbbddd183e21c15a66cfec1b2c17dae2b514e190d6fb2896b7eb683783d4b36da036609d2e1c93d2815f21b374dfccaf02a8978694c2f7b67 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.3, escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 + languageName: node + linkType: hard + +"escope@npm:^3.6.0": + version: 3.6.0 + resolution: "escope@npm:3.6.0" + dependencies: + es6-map: "npm:^0.1.3" + es6-weak-map: "npm:^2.0.1" + esrecurse: "npm:^4.1.0" + estraverse: "npm:^4.1.1" + checksum: 10c0/79cbb30bf126628eb7e586575b2f5fd31b14ea108cd2379c571fe4dc09ea5208f42dacf1cd43a702b59efccb128e9c9e7762d5cd670d2d184a889947aea509e5 + languageName: node + linkType: hard + +"esprima@npm:^2.6.0": + version: 2.7.3 + resolution: "esprima@npm:2.7.3" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/6e1e99f280eed2ecd521ae28217c5f7c7a03fd0a1ac913bffd4a4ba278caf32cb8d9fc01e41d4b4bc904617282873dea297d60e1f93ea20156f29994c348a04f + languageName: node + linkType: hard + +"esrecurse@npm:^4.1.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d + languageName: node + linkType: hard + +"estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"event-emitter@npm:~0.3.5": + version: 0.3.5 + resolution: "event-emitter@npm:0.3.5" + dependencies: + d: "npm:1" + es5-ext: "npm:~0.10.14" + checksum: 10c0/75082fa8ffb3929766d0f0a063bfd6046bd2a80bea2666ebaa0cfd6f4a9116be6647c15667bea77222afc12f5b4071b68d393cf39fdaa0e8e81eda006160aff0 + languageName: node + linkType: hard + +"events@npm:^3.0.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 + languageName: node + linkType: hard + +"evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3": + version: 1.0.3 + resolution: "evp_bytestokey@npm:1.0.3" + dependencies: + md5.js: "npm:^1.3.4" + node-gyp: "npm:latest" + safe-buffer: "npm:^5.1.1" + checksum: 10c0/77fbe2d94a902a80e9b8f5a73dcd695d9c14899c5e82967a61b1fc6cbbb28c46552d9b127cff47c45fcf684748bdbcfa0a50410349109de87ceb4b199ef6ee99 + languageName: node + linkType: hard + +"execa@npm:^0.7.0": + version: 0.7.0 + resolution: "execa@npm:0.7.0" + dependencies: + cross-spawn: "npm:^5.0.1" + get-stream: "npm:^3.0.0" + is-stream: "npm:^1.1.0" + npm-run-path: "npm:^2.0.0" + p-finally: "npm:^1.0.0" + signal-exit: "npm:^3.0.0" + strip-eof: "npm:^1.0.0" + checksum: 10c0/812f1776e2a6b2226532e43c1af87d8a12e26de03a06e7e043f653acf5565e0656f5f6c64d66726fefa17178ac129caaa419a50905934e7c4a846417abb25d4a + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.3 + resolution: "exponential-backoff@npm:3.1.3" + checksum: 10c0/77e3ae682b7b1f4972f563c6dbcd2b0d54ac679e62d5d32f3e5085feba20483cf28bd505543f520e287a56d4d55a28d7874299941faf637e779a1aa5994d1267 + languageName: node + linkType: hard + +"exports-loader@npm:0.6.3": + version: 0.6.3 + resolution: "exports-loader@npm:0.6.3" + dependencies: + loader-utils: "npm:0.2.x" + source-map: "npm:0.1.x" + checksum: 10c0/b793b51b9845e57b207533a02544cf25a35dde1aa71d69f25fa7607294768a3190e52155abf405bcd4a270b524063405ec548c7410e3028d1200c8d1b4d1c338 + languageName: node + linkType: hard + +"ext@npm:^1.1.2": + version: 1.6.0 + resolution: "ext@npm:1.6.0" + dependencies: + type: "npm:^2.5.0" + checksum: 10c0/d6ff29ca86fbe4e69743d10702ece124e0239faa435a6c3b2833282787b9eace2c8cbf5d8439d0c85312255d5472d251bf3cd4c4d1b9de8f8a8090e6b43db948 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^1.0.0": + version: 1.1.0 + resolution: "fast-deep-equal@npm:1.1.0" + checksum: 10c0/2cdcb17ca3c28ea199863de4ff0f4de14722c63bb19d716c1bbb4a661479413a0cbfb27e8596d34204e4525f0de11ff7c8ac6a27673c961bd0f37d0e48f9c743 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fastparse@npm:^1.1.2": + version: 1.1.2 + resolution: "fastparse@npm:1.1.2" + checksum: 10c0/c08d6e7ef10c0928426c1963dd4593e2baaf44d223ab1e5ba5d7b30470144b3a4ecb3605958b73754cea3f857ecef00b67c885f07ca2c312b38b67d9d88b84b5 + languageName: node + linkType: hard + +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f + languageName: node + linkType: hard + +"file-loader@npm:^0.11.2": + version: 0.11.2 + resolution: "file-loader@npm:0.11.2" + dependencies: + loader-utils: "npm:^1.0.2" + checksum: 10c0/55ce4c44ee84926cd8f913ba2e55f55c21425f47bf64b130d46d7d7f1cfb32571c997f726c46b6446b7364f062f90d9a4587792b6114afc4b55460b26915c055 + languageName: node + linkType: hard + +"find-cache-dir@npm:^1.0.0": + version: 1.0.0 + resolution: "find-cache-dir@npm:1.0.0" + dependencies: + commondir: "npm:^1.0.1" + make-dir: "npm:^1.0.0" + pkg-dir: "npm:^2.0.0" + checksum: 10c0/264b706771f30b39385cf921a5576c80ef95cb4c8ef2df8761b8be62326a1537ea63feecf0deac52cd84d6937b312a8d9554b4012a092937ade43a165cd5b6f9 + languageName: node + linkType: hard + +"find-up@npm:^2.0.0, find-up@npm:^2.1.0": + version: 2.1.0 + resolution: "find-up@npm:2.1.0" + dependencies: + locate-path: "npm:^2.0.0" + checksum: 10c0/c080875c9fe28eb1962f35cbe83c683796a0321899f1eed31a37577800055539815de13d53495049697d3ba313013344f843bb9401dd337a1b832be5edfc6840 + languageName: node + linkType: hard + +"flatten@npm:^1.0.2": + version: 1.0.3 + resolution: "flatten@npm:1.0.3" + checksum: 10c0/9f9b1f3dcd05be057bb83ec27f2513da5306e7bfc0cf8bd839ab423eb1b0f99683a25c97b48fafd5959819159659ce9f1397623a46f89a8577ba095fcf5fb753 + languageName: node + linkType: hard + +"flush-write-stream@npm:^1.0.0": + version: 1.1.1 + resolution: "flush-write-stream@npm:1.1.1" + dependencies: + inherits: "npm:^2.0.3" + readable-stream: "npm:^2.3.6" + checksum: 10c0/2cd4f65b728d5f388197a03dafabc6a5e4f0c2ed1a2d912e288f7aa1c2996dd90875e55b50cf32c78dca55ad2e2dfae5d3db09b223838388033d87cf5920dd87 + languageName: node + linkType: hard + +"from2@npm:^2.1.0": + version: 2.3.0 + resolution: "from2@npm:2.3.0" + dependencies: + inherits: "npm:^2.0.1" + readable-stream: "npm:^2.0.0" + checksum: 10c0/f87f7a2e4513244d551454a7f8324ef1f7837864a8701c536417286ec19ff4915606b1dfa8909a21b7591ebd8440ffde3642f7c303690b9a4d7c832d62248aa1 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fs-write-stream-atomic@npm:^1.0.8": + version: 1.0.10 + resolution: "fs-write-stream-atomic@npm:1.0.10" + dependencies: + graceful-fs: "npm:^4.1.2" + iferr: "npm:^0.1.5" + imurmurhash: "npm:^0.1.4" + readable-stream: "npm:1 || 2" + checksum: 10c0/293b2b4ed346d35a28f8637a20cb2aef31be86503da501c42c2eda8fefed328bac16ce0e5daa7019f9329d73930c58031eaea2ce0c70f1680943fbfb7cff808b + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"function-bind@npm:^1.1.1": + version: 1.1.1 + resolution: "function-bind@npm:1.1.1" + checksum: 10c0/60b74b2407e1942e1ed7f8c284f8ef714d0689dcfce5319985a5b7da3fc727f40b4a59ec72dc55aa83365ad7b8fa4fac3a30d93c850a2b452f29ae03dbc10a1e + languageName: node + linkType: hard + +"get-caller-file@npm:^1.0.1": + version: 1.0.3 + resolution: "get-caller-file@npm:1.0.3" + checksum: 10c0/763dcee2de8ff60ae7e13a4bad8306205a2fbe108e555686344ddd9ef211b8bebfe459d3a739669257014c59e7cc1e7a44003c21af805c1214673e6a45f06c51 + languageName: node + linkType: hard + +"get-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "get-stream@npm:3.0.0" + checksum: 10c0/003f5f3b8870da59c6aafdf6ed7e7b07b48c2f8629cd461bd3900726548b6b8cfa2e14d6b7814fbb08f07a42f4f738407fa70b989928b2783a76b278505bba22 + languageName: node + linkType: hard + +"glob-to-regexp@npm:^0.4.1": + version: 0.4.1 + resolution: "glob-to-regexp@npm:0.4.1" + checksum: 10c0/0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 + languageName: node + linkType: hard + +"glob@npm:^13.0.0": + version: 13.0.6 + resolution: "glob@npm:13.0.6" + dependencies: + minimatch: "npm:^10.2.2" + minipass: "npm:^7.1.3" + path-scurry: "npm:^2.0.2" + checksum: 10c0/269c236f11a9b50357fe7a8c6aadac667e01deb5242b19c84975628f05f4438d8ee1354bb62c5d6c10f37fd59911b54d7799730633a2786660d8c69f1d18120a + languageName: node + linkType: hard + +"glob@npm:^7.1.2, glob@npm:^7.1.3": + version: 7.2.0 + resolution: "glob@npm:7.2.0" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.0.4" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/478b40e38be5a3d514e64950e1e07e0ac120585add6a37c98d0ed24d72d9127d734d2a125786073c8deb687096e84ae82b641c441a869ada3a9cc91b68978632 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2": + version: 4.2.9 + resolution: "graceful-fs@npm:4.2.9" + checksum: 10c0/2a66760ce6677ca18a24a1ef15d440cfd970086446af1e78c9e9de083c48122d8bd9c3fdc37f8f80f34aae833fa0d9dd52725e75a1c3f433ddd34eece39e7376 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"gsap@npm:3.9.1": + version: 3.9.1 + resolution: "gsap@npm:3.9.1" + checksum: 10c0/0be73e9e46972e9456b8af16f9f4eb666cef81a1a56b73f0d1a267ee121d95356cff3d068001b182d71bf20bb1efe3d751161d96ca49d54294d89e56f9f71735 + languageName: node + linkType: hard + +"has-ansi@npm:^2.0.0": + version: 2.0.0 + resolution: "has-ansi@npm:2.0.0" + dependencies: + ansi-regex: "npm:^2.0.0" + checksum: 10c0/f54e4887b9f8f3c4bfefd649c48825b3c093987c92c27880ee9898539e6f01aed261e82e73153c3f920fde0db5bf6ebd58deb498ed1debabcb4bc40113ccdf05 + languageName: node + linkType: hard + +"has-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "has-flag@npm:1.0.0" + checksum: 10c0/d0ad4bebbbc005edccfa1e2c0600c89375be5663d23f49a129e0f817187405748b0b515abfc5b3c209c92692e39bb0481c83c0ee4df69433d6ffd0242183100b + languageName: node + linkType: hard + +"has-flag@npm:^2.0.0": + version: 2.0.0 + resolution: "has-flag@npm:2.0.0" + checksum: 10c0/5e1f136c7f801c2719048bedfabcf834a1ed46276cd4c98c6fcddb89a482f5d6a16df0771a38805cfc2d9010b4de157909e1a71b708e1d339b6e311041bde9b4 + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 + languageName: node + linkType: hard + +"has@npm:^1.0.1, has@npm:^1.0.3": + version: 1.0.3 + resolution: "has@npm:1.0.3" + dependencies: + function-bind: "npm:^1.1.1" + checksum: 10c0/e1da0d2bd109f116b632f27782cf23182b42f14972ca9540e4c5aa7e52647407a0a4a76937334fddcb56befe94a3494825ec22b19b51f5e5507c3153fd1a5e1b + languageName: node + linkType: hard + +"hash-base@npm:^3.0.0": + version: 3.1.0 + resolution: "hash-base@npm:3.1.0" + dependencies: + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.6.0" + safe-buffer: "npm:^5.2.0" + checksum: 10c0/663eabcf4173326fbb65a1918a509045590a26cc7e0964b754eef248d281305c6ec9f6b31cb508d02ffca383ab50028180ce5aefe013e942b44a903ac8dc80d0 + languageName: node + linkType: hard + +"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": + version: 1.1.7 + resolution: "hash.js@npm:1.1.7" + dependencies: + inherits: "npm:^2.0.3" + minimalistic-assert: "npm:^1.0.1" + checksum: 10c0/41ada59494eac5332cfc1ce6b7ebdd7b88a3864a6d6b08a3ea8ef261332ed60f37f10877e0c825aaa4bddebf164fbffa618286aeeec5296675e2671cbfa746c4 + languageName: node + linkType: hard + +"highlight.js@npm:~9.18.2": + version: 9.18.5 + resolution: "highlight.js@npm:9.18.5" + checksum: 10c0/bad99a5bfd31825769f76718e54372d291b9c3ad197df3c3102066c5baa08ee611f6a2aa6ffdc7e1cd24c7d4025b0b6db965837a14cbc4d4d06f2ad2fbf07a3d + languageName: node + linkType: hard + +"hmac-drbg@npm:^1.0.1": + version: 1.0.1 + resolution: "hmac-drbg@npm:1.0.1" + dependencies: + hash.js: "npm:^1.0.3" + minimalistic-assert: "npm:^1.0.0" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10c0/f3d9ba31b40257a573f162176ac5930109816036c59a09f901eb2ffd7e5e705c6832bedfff507957125f2086a0ab8f853c0df225642a88bf1fcaea945f20600d + languageName: node + linkType: hard + +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 + languageName: node + linkType: hard + +"html-comment-regex@npm:^1.1.0": + version: 1.1.2 + resolution: "html-comment-regex@npm:1.1.2" + checksum: 10c0/c6fe47e7efbb2e853217854cdf352e53a6d414f87a6029456010250179f9ac2c77ef657dd4e26f4d3930f8def0e2fad015c233a3181a195a59fb4eeda6d333f9 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.2.0 + resolution: "http-cache-semantics@npm:4.2.0" + checksum: 10c0/45b66a945cf13ec2d1f29432277201313babf4a01d9e52f44b31ca923434083afeca03f18417f599c9ab3d0e7b618ceb21257542338b57c54b710463b4a53e37 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"https-browserify@npm:^1.0.0": + version: 1.0.0 + resolution: "https-browserify@npm:1.0.0" + checksum: 10c0/e17b6943bc24ea9b9a7da5714645d808670af75a425f29baffc3284962626efdc1eb3aa9bbffaa6e64028a6ad98af5b09fabcb454a8f918fb686abfdc9e9b8ae + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:4" + checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac + languageName: node + linkType: hard + +"iconv-lite@npm:^0.4.4": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.7.2": + version: 0.7.2 + resolution: "iconv-lite@npm:0.7.2" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/3c228920f3bd307f56bf8363706a776f4a060eb042f131cd23855ceca962951b264d0997ab38a1ad340e1c5df8499ed26e1f4f0db6b2a2ad9befaff22f14b722 + languageName: node + linkType: hard + +"icss-replace-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "icss-replace-symbols@npm:1.1.0" + checksum: 10c0/aaa5b67f82781fccc77bf6df14eaa9177ce3944462ef82b2b9e3b9f17d8fcd90f8851ffd5e6e249ebc5c464bfda07c2eccce2d122274c51c9d5b359b087f7049 + languageName: node + linkType: hard + +"icss-utils@npm:^2.1.0": + version: 2.1.0 + resolution: "icss-utils@npm:2.1.0" + dependencies: + postcss: "npm:^6.0.1" + checksum: 10c0/69d3b8fdea58fbf5c26d8dc2d1b7d8ded34fd8fb0800ed60b390e0ae5f596e77b155c587fb62e7642d1064d2d72fc672676df58ef935eba7303d79467e43edbf + languageName: node + linkType: hard + +"ieee754@npm:^1.1.4": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + +"iferr@npm:^0.1.5": + version: 0.1.5 + resolution: "iferr@npm:0.1.5" + checksum: 10c0/e0669b1757d0501b43a158321945d1cc1fe56f28a972df2f88a5818f05c8853c7669ba5d6cfbbf9a1a312850699de6e528626df108d559005df7e15d16ee334c + languageName: node + linkType: hard + +"image-size@npm:~0.5.0": + version: 0.5.5 + resolution: "image-size@npm:0.5.5" + bin: + image-size: bin/image-size.js + checksum: 10c0/655204163af06732f483a9fe7cce9dff4a29b7b2e88f5c957a5852e8143fa750f5e54b1955a2ca83de99c5220dbd680002d0d4e09140b01433520f4d5a0b1f4c + languageName: node + linkType: hard + +"imports-loader@npm:^0.6.3": + version: 0.6.5 + resolution: "imports-loader@npm:0.6.5" + dependencies: + loader-utils: "npm:0.2.x" + source-map: "npm:0.1.x" + checksum: 10c0/177b4a74af7ee4ae058ee3e49c8590ef3f0dfab7ca9e87ef762bf7c7a502235d32108dc4e1641c6fc869581815caff050282693aa47bf3479cade6fd6ff87a5f + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"indexes-of@npm:^1.0.1": + version: 1.0.1 + resolution: "indexes-of@npm:1.0.1" + checksum: 10c0/1ea1d2d00173fa38f728acfa00303657e1115361481e52f6cbae47c5d603219006c9357abf6bc323f1fb0fbe937e363bbb19e5c66c12578eea6ec6b7e892bdba + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"inherits@npm:2.0.1": + version: 2.0.1 + resolution: "inherits@npm:2.0.1" + checksum: 10c0/bfc7b37c21a2cddb272adc65b053b1716612d408bb2c9a4e5c32679dc2b08032aadd67880c405be3dff060a62e45b353fc3d9fa79a3067ad7a3deb6a283cc5c6 + languageName: node + linkType: hard + +"inherits@npm:2.0.3": + version: 2.0.3 + resolution: "inherits@npm:2.0.3" + checksum: 10c0/6e56402373149ea076a434072671f9982f5fad030c7662be0332122fe6c0fa490acb3cc1010d90b6eff8d640b1167d77674add52dfd1bb85d545cf29e80e73e7 + languageName: node + linkType: hard + +"interpret@npm:^1.0.0": + version: 1.4.0 + resolution: "interpret@npm:1.4.0" + checksum: 10c0/08c5ad30032edeec638485bc3f6db7d0094d9b3e85e0f950866600af3c52e9fd69715416d29564731c479d9f4d43ff3e4d302a178196bdc0e6837ec147640450 + languageName: node + linkType: hard + +"invert-kv@npm:^1.0.0": + version: 1.0.0 + resolution: "invert-kv@npm:1.0.0" + checksum: 10c0/9ccef12ada8494c56175cc0380b4cea18b6c0a368436f324a30e43a332db90bdfb83cd3a7987b71df359cdf931ce45b7daf35b677da56658565d61068e4bc20b + languageName: node + linkType: hard + +"ip-address@npm:^10.0.1": + version: 10.1.0 + resolution: "ip-address@npm:10.1.0" + checksum: 10c0/0103516cfa93f6433b3bd7333fa876eb21263912329bfa47010af5e16934eeeff86f3d2ae700a3744a137839ddfad62b900c7a445607884a49b5d1e32a3d7566 + languageName: node + linkType: hard + +"is-absolute-url@npm:^2.0.0": + version: 2.1.0 + resolution: "is-absolute-url@npm:2.1.0" + checksum: 10c0/2c324c3118752d82c18afadffbea14d35224e76f37a2ee80e05b209386c46d19bef77b58ede41f7b3be552cde16c6cdb0d884807175a6eb40e8c61281dc67c2f + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 + languageName: node + linkType: hard + +"is-core-module@npm:^2.8.1": + version: 2.8.1 + resolution: "is-core-module@npm:2.8.1" + dependencies: + has: "npm:^1.0.3" + checksum: 10c0/f1139970deb2ec159c54be154d35cd17d71b9b56c60221ff7c8c328ca7efe20b6d676cef43d08c21966e162bfd5068dcd0ce23e64c77b76a19824563ecd82e0e + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^1.0.0": + version: 1.0.0 + resolution: "is-fullwidth-code-point@npm:1.0.0" + dependencies: + number-is-nan: "npm:^1.0.0" + checksum: 10c0/12acfcf16142f2d431bf6af25d68569d3198e81b9799b4ae41058247aafcc666b0127d64384ea28e67a746372611fcbe9b802f69175287aba466da3eddd5ba0f + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^2.0.0": + version: 2.0.0 + resolution: "is-fullwidth-code-point@npm:2.0.0" + checksum: 10c0/e58f3e4a601fc0500d8b2677e26e9fe0cd450980e66adb29d85b6addf7969731e38f8e43ed2ec868a09c101a55ac3d8b78902209269f38c5286bc98f5bc1b4d9 + languageName: node + linkType: hard + +"is-plain-obj@npm:^1.0.0": + version: 1.1.0 + resolution: "is-plain-obj@npm:1.1.0" + checksum: 10c0/daaee1805add26f781b413fdf192fc91d52409583be30ace35c82607d440da63cc4cac0ac55136716688d6c0a2c6ef3edb2254fecbd1fe06056d6bd15975ee8c + languageName: node + linkType: hard + +"is-stream@npm:^1.1.0": + version: 1.1.0 + resolution: "is-stream@npm:1.1.0" + checksum: 10c0/b8ae7971e78d2e8488d15f804229c6eed7ed36a28f8807a1815938771f4adff0e705218b7dab968270433f67103e4fef98062a0beea55d64835f705ee72c7002 + languageName: node + linkType: hard + +"is-svg@npm:^2.0.0": + version: 2.1.0 + resolution: "is-svg@npm:2.1.0" + dependencies: + html-comment-regex: "npm:^1.1.0" + checksum: 10c0/b2709e619c6159dabd27731c7ff69b73319bc8694b1dd27dc886026a6e1f895f04c1cc9903ca90310d3766a5f2d01a959735ae9a69be71f3cc9545f8206e1bb9 + languageName: node + linkType: hard + +"is-what@npm:^3.14.1": + version: 3.14.1 + resolution: "is-what@npm:3.14.1" + checksum: 10c0/4b770b85454c877b6929a84fd47c318e1f8c2ff70fd72fd625bc3fde8e0c18a6e57345b6e7aa1ee9fbd1c608d27cfe885df473036c5c2e40cd2187250804a2c7 + languageName: node + linkType: hard + +"isarray@npm:^1.0.0, isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^4.0.0": + version: 4.0.0 + resolution: "isexe@npm:4.0.0" + checksum: 10c0/5884815115bceac452877659a9c7726382531592f43dc29e5d48b7c4100661aed54018cb90bd36cb2eaeba521092570769167acbb95c18d39afdccbcca06c5ce + languageName: node + linkType: hard + +"jquery-ui@npm:>=1.10.4": + version: 1.13.1 + resolution: "jquery-ui@npm:1.13.1" + dependencies: + jquery: "npm:>=1.8.0 <4.0.0" + checksum: 10c0/8e3935b47eaab3a29a8ec3fb93287fae23ffebc2600d6537eda4ab246a19b2b31d7663c0baefbc3af339fa434df80037bb2c7945af41c00f732c00812edde3f3 + languageName: node + linkType: hard + +"jquery@npm:>=1.11.0, jquery@npm:>=1.7, jquery@npm:>=1.8.0 <4.0.0, jquery@npm:^3.5.1": + version: 3.6.0 + resolution: "jquery@npm:3.6.0" + checksum: 10c0/45a63f8376a8918087c0277b2394dd382fcacff765c41ccbb5009a9336f8c971bf41c6a0519062edc1dff6333d96959c3a3ec55c95eb6c94d5372253d6cbf82f + languageName: node + linkType: hard + +"js-base64@npm:^2.1.9": + version: 2.6.4 + resolution: "js-base64@npm:2.6.4" + checksum: 10c0/95d93c4eca0bbe0f2d5ffe8682d9acd23051e5c0ad71873ff5a48dd46a5f19025de9f7b36e63fa3f02f342ae4a8ca4c56e7b590d7300ebb6639ce09675e0fd02 + languageName: node + linkType: hard + +"js-cookie@npm:3.0.1": + version: 3.0.1 + resolution: "js-cookie@npm:3.0.1" + checksum: 10c0/a7dab91286c49610fb198bcc0d78fbafe9be869cf3cea6f7eaea515abdfdc9d347982fe22316e34666b479a0701119482d46faa3a350a3a3404eb954405edf72 + languageName: node + linkType: hard + +"js-md5@npm:^0.7.3": + version: 0.7.3 + resolution: "js-md5@npm:0.7.3" + checksum: 10c0/3e7048590c40edb0b8fb290e13a81d6eebbd682c70c520c4853820ae8fe3a3c5e375cfa0ca9a731aa8d8e0ba82cd8f922fea34c737caf72a7f9ab819bb8382a7 + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.2": + version: 3.0.2 + resolution: "js-tokens@npm:3.0.2" + checksum: 10c0/e3c3ee4d12643d90197628eb022a2884a15f08ea7dcac1ce97fdeee43031fbfc7ede674f2cdbbb582dcd4c94388b22e52d56c6cbeb2ac7d1b57c2f33c405e2ba + languageName: node + linkType: hard + +"js-yaml@npm:~3.7.0": + version: 3.7.0 + resolution: "js-yaml@npm:3.7.0" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^2.6.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/e236852d4439c7750c810f217ca80631844cfb0e4ab4993349c3e612ee273256d9895e1bb06b3990a3cc42fa1105ffcaa55a6b711f25901c0d803287bdcf52e1 + languageName: node + linkType: hard + +"json-loader@npm:^0.5.4": + version: 0.5.7 + resolution: "json-loader@npm:0.5.7" + checksum: 10c0/b155b81f644693b5418e595c127c552c34373f749d2d125df24cfe753de6b3b0af88dda5d58e7b65940ed03ec46c19fc3d09f53b932b45c9ae3ca1fb55e44a15 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.3.0": + version: 0.3.1 + resolution: "json-schema-traverse@npm:0.3.1" + checksum: 10c0/462316de759d3dd9278959de17861e8d214c3722e1f0bf3c510daac990009bc2b0e11e89f9b299d765cd52569db74c8fa1a371a2b08c514a07998fb2f10eb57e + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json5@npm:^0.5.0, json5@npm:^0.5.1": + version: 0.5.1 + resolution: "json5@npm:0.5.1" + bin: + json5: lib/cli.js + checksum: 10c0/aca0ab7ccf1883d3fc2ecc16219bc389716a773f774552817deaadb549acc0bb502e317a81946fc0a48f9eb6e0822cf1dc5a097009203f2c94de84c8db02a1f3 + languageName: node + linkType: hard + +"json5@npm:^1.0.1": + version: 1.0.1 + resolution: "json5@npm:1.0.1" + dependencies: + minimist: "npm:^1.2.0" + bin: + json5: lib/cli.js + checksum: 10c0/7f75dd797151680a4e14c4224c1343b32a43272aa6e6333ddec2b0822df4ea116971689b251879a1248592da24f7929902c13f83d7390c3f3d44f18e8e9719f5 + languageName: node + linkType: hard + +"jstimezonedetect@npm:^1.0.6": + version: 1.0.7 + resolution: "jstimezonedetect@npm:1.0.7" + checksum: 10c0/8ea4eb123e007bf585cd5ed82ef8033bdeb5dcd4f4ffdec4cd9c69dbb1c7497370db931f024721edcab659eabe89c8f9ef1f882e84369e70aec1630584e4f019 + languageName: node + linkType: hard + +"knockout.validation@npm:^2.0.2": + version: 2.0.4 + resolution: "knockout.validation@npm:2.0.4" + peerDependencies: + knockout: ">=2.3.0" + checksum: 10c0/fac8708108303b307b37b4382c4206004bdf216b85226835e868d731e872981dcd8c222ec91cc6028874e00ae43f29c1297bb60a87b17f06e5e72525c150763b + languageName: node + linkType: hard + +"knockout@npm:~3.4.2": + version: 3.4.2 + resolution: "knockout@npm:3.4.2" + checksum: 10c0/dd2f4973f72f54eeef2fd4306957a7158910c6046d636432ac0decae796be66925bf7d227b1f0b5c1fe3da479d7fbe15f6d518e4d5cfd812dd7bb8511907a465 + languageName: node + linkType: hard + +"lcid@npm:^1.0.0": + version: 1.0.0 + resolution: "lcid@npm:1.0.0" + dependencies: + invert-kv: "npm:^1.0.0" + checksum: 10c0/87fb32196c3c80458778f34f71c042e114f3134a3c86c0d60ee9c94f0750e467d7ca0c005a5224ffd9d49a6e449b5e5c31e1544f1827765a0ba8747298f5980e + languageName: node + linkType: hard + +"less@npm:^4.1.2": + version: 4.1.2 + resolution: "less@npm:4.1.2" + dependencies: + copy-anything: "npm:^2.0.1" + errno: "npm:^0.1.1" + graceful-fs: "npm:^4.1.2" + image-size: "npm:~0.5.0" + make-dir: "npm:^2.1.0" + mime: "npm:^1.4.1" + needle: "npm:^2.5.2" + parse-node-version: "npm:^1.0.1" + source-map: "npm:~0.6.0" + tslib: "npm:^2.3.0" + dependenciesMeta: + errno: + optional: true + graceful-fs: + optional: true + image-size: + optional: true + make-dir: + optional: true + mime: + optional: true + needle: + optional: true + source-map: + optional: true + bin: + lessc: bin/lessc + checksum: 10c0/fa5ea22f81ce12d127881742d7a2b6666727751214c6f014a7793ebb7e406a153a46bb3c77c86adf68e1b79bc7477a156f84b01dfff56c532591fbb094194b5a + languageName: node + linkType: hard + +"linkifyjs@npm:^3.0.5": + version: 3.0.5 + resolution: "linkifyjs@npm:3.0.5" + checksum: 10c0/a5d6565e457fabcae73400923f9999cf0651108378e61bb112b0d651d0d260450d22107d31127fcc38cfe9c3604bb59dfcc25db388a1eeabc09d53a5177da7fc + languageName: node + linkType: hard + +"load-json-file@npm:^2.0.0": + version: 2.0.0 + resolution: "load-json-file@npm:2.0.0" + dependencies: + graceful-fs: "npm:^4.1.2" + parse-json: "npm:^2.2.0" + pify: "npm:^2.0.0" + strip-bom: "npm:^3.0.0" + checksum: 10c0/15cf1259361325fadfc54cd4ecc5d6729103c8873492001ba5473fb1ef753000f680c887db6c86fec69a4ede009efeb8c0c0c77b2a31bc54d2793767e25577c9 + languageName: node + linkType: hard + +"loader-runner@npm:^2.3.0": + version: 2.4.0 + resolution: "loader-runner@npm:2.4.0" + checksum: 10c0/1f723bd8318453c2d073d7befbf891ba6d2a02f22622688bf7d22e7ba527a0f9476c7fdfedc6bfa2b55c0389d9f406f3a5239ed1b33c9088d77cfed085086a1e + languageName: node + linkType: hard + +"loader-utils@npm:0.2.x": + version: 0.2.17 + resolution: "loader-utils@npm:0.2.17" + dependencies: + big.js: "npm:^3.1.3" + emojis-list: "npm:^2.0.0" + json5: "npm:^0.5.0" + object-assign: "npm:^4.0.1" + checksum: 10c0/d6b65a0d460d2c8621f72e0471127895f4a25ea3a5d2caabf0710c8e58a904af5876834c6ad89d2fbab35e74c6e7f2f4f8137559e6e4e84b74957f4592bcab0b + languageName: node + linkType: hard + +"loader-utils@npm:^1.0.2, loader-utils@npm:^1.1.0": + version: 1.4.0 + resolution: "loader-utils@npm:1.4.0" + dependencies: + big.js: "npm:^5.2.2" + emojis-list: "npm:^3.0.0" + json5: "npm:^1.0.1" + checksum: 10c0/b3f383612c23c0adf535d61709fb3eaf864afa54dae45608e3831156b89b4b05a0a4ddc6db7d742071babe872750ba3f4f9ce89326d94f6e096dbed978fa424e + languageName: node + linkType: hard + +"loaders.css@npm:^0.1.2": + version: 0.1.2 + resolution: "loaders.css@npm:0.1.2" + checksum: 10c0/962b49327a906fa3d9dd4551ef46c6ba8e0f56fb700b1ab20843169a0dc90b1992a08fa55ddaf42feb5700833ecf8b389cb6f1b8c20dd2594037b1d74a5e9e50 + languageName: node + linkType: hard + +"locate-path@npm:^2.0.0": + version: 2.0.0 + resolution: "locate-path@npm:2.0.0" + dependencies: + p-locate: "npm:^2.0.0" + path-exists: "npm:^3.0.0" + checksum: 10c0/24efa0e589be6aa3c469b502f795126b26ab97afa378846cb508174211515633b770aa0ba610cab113caedab8d2a4902b061a08aaed5297c12ab6f5be4df0133 + languageName: node + linkType: hard + +"lodash.camelcase@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.camelcase@npm:4.3.0" + checksum: 10c0/fcba15d21a458076dd309fce6b1b4bf611d84a0ec252cb92447c948c533ac250b95d2e00955801ebc367e5af5ed288b996d75d37d2035260a937008e14eaf432 + languageName: node + linkType: hard + +"lodash.find@npm:^4.3.0": + version: 4.6.0 + resolution: "lodash.find@npm:4.6.0" + checksum: 10c0/0238f3abc0b87aa441820ab0ab31a81156e1809a66285f454fbea18cbdf4d16572d504dd9e96c22df8a36b81d0272bca9205d09d217d61f9b53fa3358023377f + languageName: node + linkType: hard + +"lodash.get@npm:^4.2.1": + version: 4.4.2 + resolution: "lodash.get@npm:4.4.2" + checksum: 10c0/48f40d471a1654397ed41685495acb31498d5ed696185ac8973daef424a749ca0c7871bf7b665d5c14f5cc479394479e0307e781f61d5573831769593411be6e + languageName: node + linkType: hard + +"lodash.has@npm:^4.5.2": + version: 4.5.2 + resolution: "lodash.has@npm:4.5.2" + checksum: 10c0/3ffa9e549f321996a5fdf6204494c035ff550b2df703f936a448c553131bbb55492b4e7995bb13500648b50b268ed8afc974a7a0c0a43744d28d61cc95cb1ffe + languageName: node + linkType: hard + +"lodash.includes@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.includes@npm:4.3.0" + checksum: 10c0/7ca498b9b75bf602d04e48c0adb842dfc7d90f77bcb2a91a2b2be34a723ad24bc1c8b3683ec6b2552a90f216c723cdea530ddb11a3320e08fa38265703978f4b + languageName: node + linkType: hard + +"lodash.memoize@npm:^4.1.2": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 10c0/c8713e51eccc650422716a14cece1809cfe34bc5ab5e242b7f8b4e2241c2483697b971a604252807689b9dd69bfe3a98852e19a5b89d506b000b4187a1285df8 + languageName: node + linkType: hard + +"lodash.set@npm:^4.3.2": + version: 4.3.2 + resolution: "lodash.set@npm:4.3.2" + checksum: 10c0/c641d31905e51df43170dce8a1d11a1cff11356e2e2e75fe2615995408e9687d58c3e1d64c3c284c2df2bc519f79a98af737d2944d382ff82ffd244ff6075c29 + languageName: node + linkType: hard + +"lodash.uniq@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.uniq@npm:4.5.0" + checksum: 10c0/262d400bb0952f112162a320cc4a75dea4f66078b9e7e3075ffbc9c6aa30b3e9df3cf20e7da7d566105e1ccf7804e4fbd7d804eee0b53de05d83f16ffbf41c5e + languageName: node + linkType: hard + +"lodash@npm:^4.17.14": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + languageName: node + linkType: hard + +"lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1": + version: 11.2.7 + resolution: "lru-cache@npm:11.2.7" + checksum: 10c0/549cdb59488baa617135fc12159cafb1a97f91079f35093bb3bcad72e849fc64ace636d244212c181dfdf1a99bbfa90757ff303f98561958ee4d0f885d9bd5f7 + languageName: node + linkType: hard + +"lru-cache@npm:^4.0.1, lru-cache@npm:^4.1.1": + version: 4.1.5 + resolution: "lru-cache@npm:4.1.5" + dependencies: + pseudomap: "npm:^1.0.2" + yallist: "npm:^2.1.2" + checksum: 10c0/1ca5306814e5add9ec63556d6fd9b24a4ecdeaef8e9cea52cbf30301e6b88c8d8ddc7cab45b59b56eb763e6c45af911585dc89925a074ab65e1502e3fe8103cf + languageName: node + linkType: hard + +"make-dir@npm:^1.0.0": + version: 1.3.0 + resolution: "make-dir@npm:1.3.0" + dependencies: + pify: "npm:^3.0.0" + checksum: 10c0/5eb94f47d7ef41d89d1b8eef6539b8950d5bd99eeba093a942bfd327faa37d2d62227526b88b73633243a2ec7972d21eb0f4e5d62ae4e02a79e389f4a7bb3022 + languageName: node + linkType: hard + +"make-dir@npm:^2.1.0": + version: 2.1.0 + resolution: "make-dir@npm:2.1.0" + dependencies: + pify: "npm:^4.0.1" + semver: "npm:^5.6.0" + checksum: 10c0/ada869944d866229819735bee5548944caef560d7a8536ecbc6536edca28c72add47cc4f6fc39c54fb25d06b58da1f8994cf7d9df7dadea047064749efc085d8 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^15.0.0": + version: 15.0.5 + resolution: "make-fetch-happen@npm:15.0.5" + dependencies: + "@gar/promise-retry": "npm:^1.0.0" + "@npmcli/agent": "npm:^4.0.0" + "@npmcli/redact": "npm:^4.0.0" + cacache: "npm:^20.0.1" + http-cache-semantics: "npm:^4.1.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^5.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^1.0.0" + proc-log: "npm:^6.0.0" + ssri: "npm:^13.0.0" + checksum: 10c0/527580eb5e5476e6ad07a4e3bd017d13e935f4be815674b442081ae5a721c13d3af5715006619e6be79a85723067e047f83a0c9e699f41d8cec43609a8de4f7b + languageName: node + linkType: hard + +"math-expression-evaluator@npm:^1.2.14": + version: 1.3.14 + resolution: "math-expression-evaluator@npm:1.3.14" + checksum: 10c0/a98dcb54510f57d9d78c66f73c6ee5e8e3a69d7dcfd3f0e611bc6957a764f23fed3b342888fca79ed49b865b09338581d19bb3acc4d788ee308618c7c7cdca10 + languageName: node + linkType: hard + +"md5.js@npm:^1.3.4": + version: 1.3.5 + resolution: "md5.js@npm:1.3.5" + dependencies: + hash-base: "npm:^3.0.0" + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: 10c0/b7bd75077f419c8e013fc4d4dada48be71882e37d69a44af65a2f2804b91e253441eb43a0614423a1c91bb830b8140b0dc906bc797245e2e275759584f4efcc5 + languageName: node + linkType: hard + +"mem@npm:^1.1.0": + version: 1.1.0 + resolution: "mem@npm:1.1.0" + dependencies: + mimic-fn: "npm:^1.0.0" + checksum: 10c0/f5150bb975a7d641375d3c1962426bf338952142a429ce01e9792b03df9b63d5911d3feb7e5e50f406531ace646f3fbe39b7dc716c729d617a28b3bbdc799649 + languageName: node + linkType: hard + +"memory-fs@npm:^0.4.0, memory-fs@npm:~0.4.1": + version: 0.4.1 + resolution: "memory-fs@npm:0.4.1" + dependencies: + errno: "npm:^0.1.3" + readable-stream: "npm:^2.0.1" + checksum: 10c0/f114c44ad8285103cb0e71420cf5bb628d3eb6cbd918197f5951590ff56ba2072f4a97924949c170320cdf180d2da4e8d16a0edd92ba0ca2d2de51dc932841e2 + languageName: node + linkType: hard + +"miller-rabin@npm:^4.0.0": + version: 4.0.1 + resolution: "miller-rabin@npm:4.0.1" + dependencies: + bn.js: "npm:^4.0.0" + brorand: "npm:^1.0.1" + bin: + miller-rabin: bin/miller-rabin + checksum: 10c0/26b2b96f6e49dbcff7faebb78708ed2f5f9ae27ac8cbbf1d7c08f83cf39bed3d418c0c11034dce997da70d135cc0ff6f3a4c15dc452f8e114c11986388a64346 + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-types@npm:~2.1.34": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mime@npm:^1.4.1": + version: 1.6.0 + resolution: "mime@npm:1.6.0" + bin: + mime: cli.js + checksum: 10c0/b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 + languageName: node + linkType: hard + +"mimic-fn@npm:^1.0.0": + version: 1.2.0 + resolution: "mimic-fn@npm:1.2.0" + checksum: 10c0/ad55214aec6094c0af4c0beec1a13787556f8116ed88807cf3f05828500f21f93a9482326bcd5a077ae91e3e8795b4e76b5b4c8bb12237ff0e4043a365516cba + languageName: node + linkType: hard + +"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd + languageName: node + linkType: hard + +"minimalistic-crypto-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-crypto-utils@npm:1.0.1" + checksum: 10c0/790ecec8c5c73973a4fbf2c663d911033e8494d5fb0960a4500634766ab05d6107d20af896ca2132e7031741f19888154d44b2408ada0852446705441383e9f8 + languageName: node + linkType: hard + +"minimatch@npm:^10.2.2": + version: 10.2.4 + resolution: "minimatch@npm:10.2.4" + dependencies: + brace-expansion: "npm:^5.0.2" + checksum: 10c0/35f3dfb7b99b51efd46afd378486889f590e7efb10e0f6a10ba6800428cf65c9a8dedb74427d0570b318d749b543dc4e85f06d46d2858bc8cac7e1eb49a95945 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4": + version: 3.0.5 + resolution: "minimatch@npm:3.0.5" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/f398652d0d260137c289c270a4ac98ebe0a27cd316fa0fac72b096e96cbdc89f71d80d47ac7065c716ba3b0b730783b19180bd85a35f9247535d2adfe96bba76 + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.5": + version: 1.2.5 + resolution: "minimist@npm:1.2.5" + checksum: 10c0/c143b0c199af4df7a55c7a37b6465cdd438acdc6a3a345ba0fe9d94dfcc2042263f650879bc73be607c843deeaeaadf39c864e55bc6d80b36a025eca1a062ee7 + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^5.0.0": + version: 5.0.2 + resolution: "minipass-fetch@npm:5.0.2" + dependencies: + iconv-lite: "npm:^0.7.2" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^2.0.0" + minizlib: "npm:^3.0.1" + dependenciesMeta: + iconv-lite: + optional: true + checksum: 10c0/ce4ab9f21cfabaead2097d95dd33f485af8072fbc6b19611bce694965393453a1639d641c2bcf1c48f2ea7d41ea7fab8278373f1d0bee4e63b0a5b2cdd0ef649 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^2.0.0": + version: 2.0.0 + resolution: "minipass-sized@npm:2.0.0" + dependencies: + minipass: "npm:^7.1.2" + checksum: 10c0/f9201696a6f6d68610d04c9c83e3d2e5cb9c026aae1c8cbf7e17f386105cb79c1bb088dbc21bf0b1eb4f3fb5df384fd1e7aa3bf1f33868c416ae8c8a92679db8 + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2, minipass@npm:^7.1.3": + version: 7.1.3 + resolution: "minipass@npm:7.1.3" + checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb + languageName: node + linkType: hard + +"minizlib@npm:^3.0.1, minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" + dependencies: + minipass: "npm:^7.1.2" + checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec + languageName: node + linkType: hard + +"mississippi@npm:^2.0.0": + version: 2.0.0 + resolution: "mississippi@npm:2.0.0" + dependencies: + concat-stream: "npm:^1.5.0" + duplexify: "npm:^3.4.2" + end-of-stream: "npm:^1.1.0" + flush-write-stream: "npm:^1.0.0" + from2: "npm:^2.1.0" + parallel-transform: "npm:^1.1.0" + pump: "npm:^2.0.1" + pumpify: "npm:^1.3.3" + stream-each: "npm:^1.1.0" + through2: "npm:^2.0.0" + checksum: 10c0/f84beaa40491c2466c4a3d15025ceb1ecc822a8e5ef4f6e5622aeb832b32e4eda056c3982337ae2c1e4b3b77fb431af4d3874923c26dee0c026601547589b2db + languageName: node + linkType: hard + +"mithril@npm:0.2.0": + version: 0.2.0 + resolution: "mithril@npm:0.2.0" + checksum: 10c0/9abb48c285f1d31744bcafd4cb3f6631bf3dc6ff3c653cf97ee01b646d4736f0b25f7aef9423740b23a13e6dd0a6593a6807e2faa2f021a285ae855a72f1952f + languageName: node + linkType: hard + +"mkdirp@npm:^0.5.1, mkdirp@npm:~0.5.0, mkdirp@npm:~0.5.1": + version: 0.5.5 + resolution: "mkdirp@npm:0.5.5" + dependencies: + minimist: "npm:^1.2.5" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/4469faeeba703bc46b7cdbe3097d6373747a581eb8b556ce41c8fd25a826eb3254466c6522ba823c2edb0b6f0da7beb91cf71f040bc4e361534a3e67f0994bd0 + languageName: node + linkType: hard + +"moment@npm:^2.14.1": + version: 2.29.1 + resolution: "moment@npm:2.29.1" + checksum: 10c0/2617e383c0e0f910696214d026b9742173ea1916775d2023b39fd7d5fc3fae694f67c17876d154e246b139ad2a8028c42b2898c66cd665316b61c18453a5103f + languageName: node + linkType: hard + +"move-concurrently@npm:^1.0.1": + version: 1.0.1 + resolution: "move-concurrently@npm:1.0.1" + dependencies: + aproba: "npm:^1.1.1" + copy-concurrently: "npm:^1.0.0" + fs-write-stream-atomic: "npm:^1.0.8" + mkdirp: "npm:^0.5.1" + rimraf: "npm:^2.5.4" + run-queue: "npm:^1.0.3" + checksum: 10c0/0fe81acf3bbbc322013c2f4ee4a48cf8d180a7d925fb9284c0f1f444e862d7eb0421ee074b68d35357a12f0d5e94a322049dc9da480672331b5b8895743eb66a + languageName: node + linkType: hard + +"ms@npm:^2.1.1, ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"needle@npm:^2.5.2": + version: 2.9.1 + resolution: "needle@npm:2.9.1" + dependencies: + debug: "npm:^3.2.6" + iconv-lite: "npm:^0.4.4" + sax: "npm:^1.2.4" + bin: + needle: ./bin/needle + checksum: 10c0/65a7eaeaf4ca3410de492957474592af9838e02875273d9232ff6cff331393c58a95e48c592bd9a05f575e5bb9b08543d6cfd19eb96595dbd3d7da2c5fe1accb + languageName: node + linkType: hard + +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b + languageName: node + linkType: hard + +"next-tick@npm:~1.0.0": + version: 1.0.0 + resolution: "next-tick@npm:1.0.0" + checksum: 10c0/851058d7af979a94743ae0ae4c71f0257662a2b7129e0a159273d13782401823c154ee2e49a790e979e5b92126dbc2b5eb522eaff631b997ddf95903e7c5e9cc + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 12.2.0 + resolution: "node-gyp@npm:12.2.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^15.0.0" + nopt: "npm:^9.0.0" + proc-log: "npm:^6.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.5.4" + tinyglobby: "npm:^0.2.12" + which: "npm:^6.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/3ed046746a5a7d90950cd8b0547332b06598443f31fe213ef4332a7174c7b7d259e1704835feda79b87d3f02e59d7791842aac60642ede4396ab25fdf0f8f759 + languageName: node + linkType: hard + +"node-libs-browser@npm:^2.0.0": + version: 2.2.1 + resolution: "node-libs-browser@npm:2.2.1" + dependencies: + assert: "npm:^1.1.1" + browserify-zlib: "npm:^0.2.0" + buffer: "npm:^4.3.0" + console-browserify: "npm:^1.1.0" + constants-browserify: "npm:^1.0.0" + crypto-browserify: "npm:^3.11.0" + domain-browser: "npm:^1.1.1" + events: "npm:^3.0.0" + https-browserify: "npm:^1.0.0" + os-browserify: "npm:^0.3.0" + path-browserify: "npm:0.0.1" + process: "npm:^0.11.10" + punycode: "npm:^1.2.4" + querystring-es3: "npm:^0.2.0" + readable-stream: "npm:^2.3.3" + stream-browserify: "npm:^2.0.1" + stream-http: "npm:^2.7.2" + string_decoder: "npm:^1.0.0" + timers-browserify: "npm:^2.0.4" + tty-browserify: "npm:0.0.0" + url: "npm:^0.11.0" + util: "npm:^0.11.0" + vm-browserify: "npm:^1.0.1" + checksum: 10c0/0e05321a6396408903ed642231d2bca7dd96492d074c7af161ba06a63c95378bd3de50b4105eccbbc02d93ba3da69f0ff5e624bc2a8c92ca462ceb6a403e7986 + languageName: node + linkType: hard + +"nopt@npm:^9.0.0": + version: 9.0.0 + resolution: "nopt@npm:9.0.0" + dependencies: + abbrev: "npm:^4.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/1822eb6f9b020ef6f7a7516d7b64a8036e09666ea55ac40416c36e4b2b343122c3cff0e2f085675f53de1d2db99a2a89a60ccea1d120bcd6a5347bf6ceb4a7fd + languageName: node + linkType: hard + +"normalize-package-data@npm:^2.3.2": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" + dependencies: + hosted-git-info: "npm:^2.1.4" + resolve: "npm:^1.10.0" + semver: "npm:2 || 3 || 4 || 5" + validate-npm-package-license: "npm:^3.0.1" + checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 + languageName: node + linkType: hard + +"normalize-range@npm:^0.1.2": + version: 0.1.2 + resolution: "normalize-range@npm:0.1.2" + checksum: 10c0/bf39b73a63e0a42ad1a48c2bd1bda5a07ede64a7e2567307a407674e595bcff0fa0d57e8e5f1e7fa5e91000797c7615e13613227aaaa4d6d6e87f5bd5cc95de6 + languageName: node + linkType: hard + +"normalize-url@npm:^1.4.0": + version: 1.9.1 + resolution: "normalize-url@npm:1.9.1" + dependencies: + object-assign: "npm:^4.0.1" + prepend-http: "npm:^1.0.0" + query-string: "npm:^4.1.0" + sort-keys: "npm:^1.0.0" + checksum: 10c0/5ecd525f743c3fb5370d2bab8e78446f3e3bd7c0c97a5fd3f0bc0c5f396fbd117d13c9118766128d25ed575755cb539dc33a38419f18ca9d8577c8d1cd7a8daf + languageName: node + linkType: hard + +"npm-run-path@npm:^2.0.0": + version: 2.0.2 + resolution: "npm-run-path@npm:2.0.2" + dependencies: + path-key: "npm:^2.0.0" + checksum: 10c0/95549a477886f48346568c97b08c4fda9cdbf7ce8a4fbc2213f36896d0d19249e32d68d7451bdcbca8041b5fba04a6b2c4a618beaf19849505c05b700740f1de + languageName: node + linkType: hard + +"num2fraction@npm:^1.2.2": + version: 1.2.2 + resolution: "num2fraction@npm:1.2.2" + checksum: 10c0/3bf17b44af00508a2b0370146629710645c3e3ff3c052893680efe3f4a6ff5c953ce9e54734013b02b35744a49352d54fbc5d8b455fac979047ef17dd8ec74bd + languageName: node + linkType: hard + +"number-is-nan@npm:^1.0.0": + version: 1.0.1 + resolution: "number-is-nan@npm:1.0.1" + checksum: 10c0/cb97149006acc5cd512c13c1838223abdf202e76ddfa059c5e8e7507aff2c3a78cd19057516885a2f6f5b576543dc4f7b6f3c997cc7df53ae26c260855466df5 + languageName: node + linkType: hard + +"object-assign@npm:^3.0.0": + version: 3.0.0 + resolution: "object-assign@npm:3.0.0" + checksum: 10c0/88d1b93de35a2073df309239486829b8b3252ef86196a0d5e06fae20f9e6e5830a33ccaa1c675bd63191eec4310961797ff577fa586583a92a09ece53e668416 + languageName: node + linkType: hard + +"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 + languageName: node + linkType: hard + +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"os-browserify@npm:^0.3.0": + version: 0.3.0 + resolution: "os-browserify@npm:0.3.0" + checksum: 10c0/6ff32cb1efe2bc6930ad0fd4c50e30c38010aee909eba8d65be60af55efd6cbb48f0287e3649b4e3f3a63dce5a667b23c187c4293a75e557f0d5489d735bcf52 + languageName: node + linkType: hard + +"os-locale@npm:^2.0.0": + version: 2.1.0 + resolution: "os-locale@npm:2.1.0" + dependencies: + execa: "npm:^0.7.0" + lcid: "npm:^1.0.0" + mem: "npm:^1.1.0" + checksum: 10c0/6f1acc060552a59f477ab541e9149a712f93a4d7b5262d070698dbe98cf047f35c7685d759a86dc56c12b76fdfbab1bf7216a74232263efbe7365de2a5d70834 + languageName: node + linkType: hard + +"p-finally@npm:^1.0.0": + version: 1.0.0 + resolution: "p-finally@npm:1.0.0" + checksum: 10c0/6b8552339a71fe7bd424d01d8451eea92d379a711fc62f6b2fe64cad8a472c7259a236c9a22b4733abca0b5666ad503cb497792a0478c5af31ded793d00937e7 + languageName: node + linkType: hard + +"p-limit@npm:^1.1.0": + version: 1.3.0 + resolution: "p-limit@npm:1.3.0" + dependencies: + p-try: "npm:^1.0.0" + checksum: 10c0/5c1b1d53d180b2c7501efb04b7c817448e10efe1ba46f4783f8951994d5027e4cd88f36ad79af50546682594c4ebd11702ac4b9364c47f8074890e2acad0edee + languageName: node + linkType: hard + +"p-locate@npm:^2.0.0": + version: 2.0.0 + resolution: "p-locate@npm:2.0.0" + dependencies: + p-limit: "npm:^1.1.0" + checksum: 10c0/82da4be88fb02fd29175e66021610c881938d3cc97c813c71c1a605fac05617d57fd5d3b337494a6106c0edb2a37c860241430851411f1b265108cead34aee67 + languageName: node + linkType: hard + +"p-map@npm:^7.0.2": + version: 7.0.4 + resolution: "p-map@npm:7.0.4" + checksum: 10c0/a5030935d3cb2919d7e89454d1ce82141e6f9955413658b8c9403cfe379283770ed3048146b44cde168aa9e8c716505f196d5689db0ae3ce9a71521a2fef3abd + languageName: node + linkType: hard + +"p-try@npm:^1.0.0": + version: 1.0.0 + resolution: "p-try@npm:1.0.0" + checksum: 10c0/757ba31de5819502b80c447826fac8be5f16d3cb4fbf9bc8bc4971dba0682e84ac33e4b24176ca7058c69e29f64f34d8d9e9b08e873b7b7bb0aa89d620fa224a + languageName: node + linkType: hard + +"pako@npm:~1.0.5": + version: 1.0.11 + resolution: "pako@npm:1.0.11" + checksum: 10c0/86dd99d8b34c3930345b8bbeb5e1cd8a05f608eeb40967b293f72fe469d0e9c88b783a8777e4cc7dc7c91ce54c5e93d88ff4b4f060e6ff18408fd21030d9ffbe + languageName: node + linkType: hard + +"parallel-transform@npm:^1.1.0": + version: 1.2.0 + resolution: "parallel-transform@npm:1.2.0" + dependencies: + cyclist: "npm:^1.0.1" + inherits: "npm:^2.0.3" + readable-stream: "npm:^2.1.5" + checksum: 10c0/ab0e58569e73681ca4b9c9228189bdb6cbea535295fae344cf0d8342fd33a950961914f3c414f81894c1498fb9ad1c079b4625d2b7ceae9e6ab812f22e3bea3f + languageName: node + linkType: hard + +"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.5": + version: 5.1.6 + resolution: "parse-asn1@npm:5.1.6" + dependencies: + asn1.js: "npm:^5.2.0" + browserify-aes: "npm:^1.0.0" + evp_bytestokey: "npm:^1.0.0" + pbkdf2: "npm:^3.0.3" + safe-buffer: "npm:^5.1.1" + checksum: 10c0/4ed1d9b9e120c5484d29d67bb90171aac0b73422bc016d6294160aea983275c28a27ab85d862059a36a86a97dd31b7ddd97486802ca9fac67115fe3409e9dcbd + languageName: node + linkType: hard + +"parse-json@npm:^2.2.0": + version: 2.2.0 + resolution: "parse-json@npm:2.2.0" + dependencies: + error-ex: "npm:^1.2.0" + checksum: 10c0/7a90132aa76016f518a3d5d746a21b3f1ad0f97a68436ed71b6f995b67c7151141f5464eea0c16c59aec9b7756519a0e3007a8f98cf3714632d509ec07736df6 + languageName: node + linkType: hard + +"parse-node-version@npm:^1.0.1": + version: 1.0.1 + resolution: "parse-node-version@npm:1.0.1" + checksum: 10c0/999cd3d7da1425c2e182dce82b226c6dc842562d3ed79ec47f5c719c32a7f6c1a5352495b894fc25df164be7f2ede4224758255da9902ddef81f2b77ba46bb2c + languageName: node + linkType: hard + +"path-browserify@npm:0.0.1": + version: 0.0.1 + resolution: "path-browserify@npm:0.0.1" + checksum: 10c0/3d59710cddeea06509d91935196185900f3d9d29376dff68ff0e146fbd41d0fb304e983d0158f30cabe4dd2ffcc6a7d3d977631994ee984c88e66aed50a1ccd3 + languageName: node + linkType: hard + +"path-exists@npm:^3.0.0": + version: 3.0.0 + resolution: "path-exists@npm:3.0.0" + checksum: 10c0/17d6a5664bc0a11d48e2b2127d28a0e58822c6740bde30403f08013da599182289c56518bec89407e3f31d3c2b6b296a4220bc3f867f0911fee6952208b04167 + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-key@npm:^2.0.0": + version: 2.0.1 + resolution: "path-key@npm:2.0.1" + checksum: 10c0/dd2044f029a8e58ac31d2bf34c34b93c3095c1481942960e84dd2faa95bbb71b9b762a106aead0646695330936414b31ca0bd862bf488a937ad17c8c5d73b32b + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-scurry@npm:^2.0.2": + version: 2.0.2 + resolution: "path-scurry@npm:2.0.2" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10c0/b35ad37cf6557a87fd057121ce2be7695380c9138d93e87ae928609da259ea0a170fac6f3ef1eb3ece8a068e8b7f2f3adf5bb2374cf4d4a57fe484954fcc9482 + languageName: node + linkType: hard + +"path-type@npm:^2.0.0": + version: 2.0.0 + resolution: "path-type@npm:2.0.0" + dependencies: + pify: "npm:^2.0.0" + checksum: 10c0/e475cead839e65a2f8fdde634b24a4116b49daea3917470552e19d49c63e59ef17963bec2f57df2c72a85fcd1f86c8850d9742e68dba9c9c8d9bcac38bab03d6 + languageName: node + linkType: hard + +"pbkdf2@npm:^3.0.3": + version: 3.1.2 + resolution: "pbkdf2@npm:3.1.2" + dependencies: + create-hash: "npm:^1.1.2" + create-hmac: "npm:^1.1.4" + ripemd160: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + sha.js: "npm:^2.4.8" + checksum: 10c0/5a30374e87d33fa080a92734d778cf172542cc7e41b96198c4c88763997b62d7850de3fbda5c3111ddf79805ee7c1da7046881c90ac4920b5e324204518b05fd + languageName: node + linkType: hard + +"picomatch@npm:^4.0.3": + version: 4.0.3 + resolution: "picomatch@npm:4.0.3" + checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 + languageName: node + linkType: hard + +"pify@npm:^2.0.0": + version: 2.3.0 + resolution: "pify@npm:2.3.0" + checksum: 10c0/551ff8ab830b1052633f59cb8adc9ae8407a436e06b4a9718bcb27dc5844b83d535c3a8512b388b6062af65a98c49bdc0dd523d8b2617b188f7c8fee457158dc + languageName: node + linkType: hard + +"pify@npm:^3.0.0": + version: 3.0.0 + resolution: "pify@npm:3.0.0" + checksum: 10c0/fead19ed9d801f1b1fcd0638a1ac53eabbb0945bf615f2f8806a8b646565a04a1b0e7ef115c951d225f042cca388fdc1cd3add46d10d1ed6951c20bd2998af10 + languageName: node + linkType: hard + +"pify@npm:^4.0.1": + version: 4.0.1 + resolution: "pify@npm:4.0.1" + checksum: 10c0/6f9d404b0d47a965437403c9b90eca8bb2536407f03de165940e62e72c8c8b75adda5516c6b9b23675a5877cc0bcac6bdfb0ef0e39414cd2476d5495da40e7cf + languageName: node + linkType: hard + +"pikaday@npm:^1.3.2": + version: 1.8.2 + resolution: "pikaday@npm:1.8.2" + checksum: 10c0/c3c8ec32b18ad941f91ef0e9e24f80b785749428373137ef1592ee2ac1e2f0d858fcd240063f6d6f15c4f3d361b1653879fee7868ebf6415900ecef9c0ed0d7d + languageName: node + linkType: hard + +"pkg-dir@npm:^2.0.0": + version: 2.0.0 + resolution: "pkg-dir@npm:2.0.0" + dependencies: + find-up: "npm:^2.1.0" + checksum: 10c0/7cdc46c4921bf2c5f9a438851d16243ddde9906928116647ec7784982dd9038ea61c964fbca6f489201845742188180ecd1001b4f69781de1d1dc7d100b14089 + languageName: node + linkType: hard + +"popper.js@npm:^1.16.0": + version: 1.16.1 + resolution: "popper.js@npm:1.16.1" + checksum: 10c0/1c1a826f757edb5b8c2049dfd7a9febf6ae1e9d0e51342fc715b49a0c1020fced250d26484619883651e097c5764bbcacd2f31496e3646027f079dd83e072681 + languageName: node + linkType: hard + +"postcss-calc@npm:^5.2.0": + version: 5.3.1 + resolution: "postcss-calc@npm:5.3.1" + dependencies: + postcss: "npm:^5.0.2" + postcss-message-helpers: "npm:^2.0.0" + reduce-css-calc: "npm:^1.2.6" + checksum: 10c0/96444e979f0e7ef2c6e15d545a05c4ebc05eaa00d1743c9181c1008fb0cc06c926242e50b600ef627d9bd418c3fd24adb6732c482eeed0de8e60b64c1c105176 + languageName: node + linkType: hard + +"postcss-colormin@npm:^2.1.8": + version: 2.2.2 + resolution: "postcss-colormin@npm:2.2.2" + dependencies: + colormin: "npm:^1.0.5" + postcss: "npm:^5.0.13" + postcss-value-parser: "npm:^3.2.3" + checksum: 10c0/defcfa7e3c8daa0c116747acd01346867374505347e802115b2e7b476b6f74df4e67820bcd98743a0c02cd92159005d41db42e428700f873bb54647e54417e95 + languageName: node + linkType: hard + +"postcss-convert-values@npm:^2.3.4": + version: 2.6.1 + resolution: "postcss-convert-values@npm:2.6.1" + dependencies: + postcss: "npm:^5.0.11" + postcss-value-parser: "npm:^3.1.2" + checksum: 10c0/3efbc1c5feaa6c2eb56da61ad2c9e784c50aad1524d9c6a5a5992da43a276ead2b2d2986c8f8647fad484eefe3e22855993b2fe1984b392c45fd82aa92e7bfb9 + languageName: node + linkType: hard + +"postcss-discard-comments@npm:^2.0.4": + version: 2.0.4 + resolution: "postcss-discard-comments@npm:2.0.4" + dependencies: + postcss: "npm:^5.0.14" + checksum: 10c0/436039351e2e6fba1358077728f51c5923cf943584394fc38b441444fe572980f08c5c7d1733a2e48fa17096cb98e8180e73b45ed2aea7baabc162943ed403dc + languageName: node + linkType: hard + +"postcss-discard-duplicates@npm:^2.0.1": + version: 2.1.0 + resolution: "postcss-discard-duplicates@npm:2.1.0" + dependencies: + postcss: "npm:^5.0.4" + checksum: 10c0/0da451c605fa8b26981f2c8a059f9231eade6616026e01834dd5b305ad6ffbaae28916d3de5fe91b6d9810e0bff69e70ffe44cae3a908e12493bc4295cbf4a6f + languageName: node + linkType: hard + +"postcss-discard-empty@npm:^2.0.1": + version: 2.1.0 + resolution: "postcss-discard-empty@npm:2.1.0" + dependencies: + postcss: "npm:^5.0.14" + checksum: 10c0/e2008b574f80cc3621c3e318e59e36895077865a48800f1c25eb688128f8d43f0402c8effc21143533fd114200e532dcfbaca9813f0d07f9e71e32b6a859afbd + languageName: node + linkType: hard + +"postcss-discard-overridden@npm:^0.1.1": + version: 0.1.1 + resolution: "postcss-discard-overridden@npm:0.1.1" + dependencies: + postcss: "npm:^5.0.16" + checksum: 10c0/e1fd38e98045966be5f64252cbd553a597bc7678f64101025b850abe66851f35219320095321e4b0e9632843b6fc64e8bfe9b390064d9725a60a623a4a88b28d + languageName: node + linkType: hard + +"postcss-discard-unused@npm:^2.2.1": + version: 2.2.3 + resolution: "postcss-discard-unused@npm:2.2.3" + dependencies: + postcss: "npm:^5.0.14" + uniqs: "npm:^2.0.0" + checksum: 10c0/0058b5f15363a5a6a0d01e28aaea98506639e52e42b49878ffc80d75ab9c4c9a8136c99ca2b5c9bf4d734469620ff5c84ab4f811a7bf9bc2e7dfd5f76e6d68fb + languageName: node + linkType: hard + +"postcss-filter-plugins@npm:^2.0.0": + version: 2.0.3 + resolution: "postcss-filter-plugins@npm:2.0.3" + dependencies: + postcss: "npm:^5.0.4" + checksum: 10c0/a6d92215995486878dddab275ef65e55fd4432f779cc27ed435df49a22232743dad3285b9db8a5b32e4a618279d3f7415a501a9a4556411ee9d408bac447c5a0 + languageName: node + linkType: hard + +"postcss-merge-idents@npm:^2.1.5": + version: 2.1.7 + resolution: "postcss-merge-idents@npm:2.1.7" + dependencies: + has: "npm:^1.0.1" + postcss: "npm:^5.0.10" + postcss-value-parser: "npm:^3.1.1" + checksum: 10c0/5ef35d2ab59ceb32ca38d597753f8468dafb0782308930df820c96f3b23e4b4e36318ad29d76f88559c6a69d9c8d6283f1900617c0b6e4504bb5ab7523c120f8 + languageName: node + linkType: hard + +"postcss-merge-longhand@npm:^2.0.1": + version: 2.0.2 + resolution: "postcss-merge-longhand@npm:2.0.2" + dependencies: + postcss: "npm:^5.0.4" + checksum: 10c0/84145e5fee9e3064f1b22bde14fe5448449e519e3866a4c59cab42866309e3912638cc7e3d900c16090577a5f94899a2b46ed3a77c721592038671ce86e5395c + languageName: node + linkType: hard + +"postcss-merge-rules@npm:^2.0.3": + version: 2.1.2 + resolution: "postcss-merge-rules@npm:2.1.2" + dependencies: + browserslist: "npm:^1.5.2" + caniuse-api: "npm:^1.5.2" + postcss: "npm:^5.0.4" + postcss-selector-parser: "npm:^2.2.2" + vendors: "npm:^1.0.0" + checksum: 10c0/aa825593d06079de4776f8ec71a05276c145aab734b66fbdea2c42bb545c2ec9fe075912ecb28d18d9c3b506784e8cf7db0951f9af287bc090f3ed7e6e72c332 + languageName: node + linkType: hard + +"postcss-message-helpers@npm:^2.0.0": + version: 2.0.0 + resolution: "postcss-message-helpers@npm:2.0.0" + checksum: 10c0/5696c59befc408b208853a57994224f717c3a81a5b7129205c3087ad2af8159e209f29b66bfed7d79a1afc709cad76c3fbba06616ca71aeec77d7d029440dc72 + languageName: node + linkType: hard + +"postcss-minify-font-values@npm:^1.0.2": + version: 1.0.5 + resolution: "postcss-minify-font-values@npm:1.0.5" + dependencies: + object-assign: "npm:^4.0.1" + postcss: "npm:^5.0.4" + postcss-value-parser: "npm:^3.0.2" + checksum: 10c0/375fc0b1943b1d1e3c61bc33c19a70853ac2cebfdb0dcac23e5324edb218cf989bd7a8877cf846eafbb2d2e7cec4b7bc70922ac9300f9304c2422d807ccd4a85 + languageName: node + linkType: hard + +"postcss-minify-gradients@npm:^1.0.1": + version: 1.0.5 + resolution: "postcss-minify-gradients@npm:1.0.5" + dependencies: + postcss: "npm:^5.0.12" + postcss-value-parser: "npm:^3.3.0" + checksum: 10c0/ce5ed6151349ee4546b860cf9f7af38d8bfb942c32b45025b82c332603e2c49f6ee76ac9bda0cf8279cd2492baa4925b3298776deea7324f5efbd6a85782f0bc + languageName: node + linkType: hard + +"postcss-minify-params@npm:^1.0.4": + version: 1.2.2 + resolution: "postcss-minify-params@npm:1.2.2" + dependencies: + alphanum-sort: "npm:^1.0.1" + postcss: "npm:^5.0.2" + postcss-value-parser: "npm:^3.0.2" + uniqs: "npm:^2.0.0" + checksum: 10c0/e48823f55e60e8dc2c44fb7810a323146bd5f9aa3384a203ee56c08b77a84d5227446a005b84371e8560dd0d6cefed667acc8cf020367c6934c7233fd890f7c8 + languageName: node + linkType: hard + +"postcss-minify-selectors@npm:^2.0.4": + version: 2.1.1 + resolution: "postcss-minify-selectors@npm:2.1.1" + dependencies: + alphanum-sort: "npm:^1.0.2" + has: "npm:^1.0.1" + postcss: "npm:^5.0.14" + postcss-selector-parser: "npm:^2.0.0" + checksum: 10c0/3fd37f12d4d4518a4c7e3e4c9a6ab8cf4757faff6d388700e5d148b9b7b6f1d1f28a6be0ffda5f0077a4e4d509fec65cef3e1343ff72d02e1945a1fba2543ac1 + languageName: node + linkType: hard + +"postcss-modules-extract-imports@npm:^1.2.0": + version: 1.2.1 + resolution: "postcss-modules-extract-imports@npm:1.2.1" + dependencies: + postcss: "npm:^6.0.1" + checksum: 10c0/5746702936c1e1b78a7b31c4e20092197aa89c4e59c156249aea861c84cd0781c11c8c4648b95bcfdce010c48c8edd83b94eb9103f7c72ef8eb96c4b15716ed3 + languageName: node + linkType: hard + +"postcss-modules-local-by-default@npm:^1.2.0": + version: 1.2.0 + resolution: "postcss-modules-local-by-default@npm:1.2.0" + dependencies: + css-selector-tokenizer: "npm:^0.7.0" + postcss: "npm:^6.0.1" + checksum: 10c0/9139846ccefbb089cff17abda76e199c4d464d899816265f0b3939f5cf588b8ba59f9119b87eccaf3bfde3049bddd6ac5989f46e6d8fa9ba936cc6ccb27b89bd + languageName: node + linkType: hard + +"postcss-modules-scope@npm:^1.1.0": + version: 1.1.0 + resolution: "postcss-modules-scope@npm:1.1.0" + dependencies: + css-selector-tokenizer: "npm:^0.7.0" + postcss: "npm:^6.0.1" + checksum: 10c0/ef0328204912f2a3b98322ac5f3d377c234c391a2afd29f51ec83961ad0e0c4dc01192968649ce47c75c85a6c922dd8c608b137c1cce548fe5d92d6fb4454bb2 + languageName: node + linkType: hard + +"postcss-modules-values@npm:^1.3.0": + version: 1.3.0 + resolution: "postcss-modules-values@npm:1.3.0" + dependencies: + icss-replace-symbols: "npm:^1.1.0" + postcss: "npm:^6.0.1" + checksum: 10c0/11bb1af2478291b72f6cc106ba48dc566079021976b2da8c7989db6dca643db6fe81653aba43d4cfb0467754853d77d1eb0e3593a621affe62a1cc2d72541c70 + languageName: node + linkType: hard + +"postcss-normalize-charset@npm:^1.1.0": + version: 1.1.1 + resolution: "postcss-normalize-charset@npm:1.1.1" + dependencies: + postcss: "npm:^5.0.5" + checksum: 10c0/69e67c67ad2a71b2dee440769a3651c84dee7bfcb713749ebbef544454b0151ef0c84833228513d6f53afd63c721b38cd640c54eca9602e3768139158e0f316a + languageName: node + linkType: hard + +"postcss-normalize-url@npm:^3.0.7": + version: 3.0.8 + resolution: "postcss-normalize-url@npm:3.0.8" + dependencies: + is-absolute-url: "npm:^2.0.0" + normalize-url: "npm:^1.4.0" + postcss: "npm:^5.0.14" + postcss-value-parser: "npm:^3.2.3" + checksum: 10c0/c53225ca485dd10d156e33e5ee5c3a830082f3f68a337b9e48f5a9d5083f6bebdf13008103d056b2025622c56421284bd391d9a86949ca468541cd0e2df682a6 + languageName: node + linkType: hard + +"postcss-ordered-values@npm:^2.1.0": + version: 2.2.3 + resolution: "postcss-ordered-values@npm:2.2.3" + dependencies: + postcss: "npm:^5.0.4" + postcss-value-parser: "npm:^3.0.1" + checksum: 10c0/4d55a1c7f108f01181c22db1cb886ba0d47f71472a0e531f66b6d90094e74754a35a85cae7c142b4f6277066d2d4c586814dbd909ac7bb9d4c9d1180ac34d10b + languageName: node + linkType: hard + +"postcss-reduce-idents@npm:^2.2.2": + version: 2.4.0 + resolution: "postcss-reduce-idents@npm:2.4.0" + dependencies: + postcss: "npm:^5.0.4" + postcss-value-parser: "npm:^3.0.2" + checksum: 10c0/a63b42193dd19298b28411bb6186ec6aa5cc176cbb2a4e4e67567cecf116feaa02407744eb734521a49445be497156afad70d0ab5dcd1d9af772e2aca1fd127c + languageName: node + linkType: hard + +"postcss-reduce-initial@npm:^1.0.0": + version: 1.0.1 + resolution: "postcss-reduce-initial@npm:1.0.1" + dependencies: + postcss: "npm:^5.0.4" + checksum: 10c0/f1c40830ceea191cc31353cc5085a1dab8e94f40ce009d0779b0589329546c8f11a10c0ba3d6514032cbee1439d76dc5e0b49bb841b1ca388827cc8be79b587a + languageName: node + linkType: hard + +"postcss-reduce-transforms@npm:^1.0.3": + version: 1.0.4 + resolution: "postcss-reduce-transforms@npm:1.0.4" + dependencies: + has: "npm:^1.0.1" + postcss: "npm:^5.0.8" + postcss-value-parser: "npm:^3.0.1" + checksum: 10c0/9c8cf2373dd84adb132fcd15ca48379276ef353ab8e51c18506d2e9688658579affff77bcbff19e460e875483b9a7d18fb40488f89f8d15b635f10503da9d875 + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^2.0.0, postcss-selector-parser@npm:^2.2.2": + version: 2.2.3 + resolution: "postcss-selector-parser@npm:2.2.3" + dependencies: + flatten: "npm:^1.0.2" + indexes-of: "npm:^1.0.1" + uniq: "npm:^1.0.1" + checksum: 10c0/dc8aee6807096a93a6a1079bddb8d3e94ca385688889da087156ecfe48f3ad7db7581395fada92737d0d6e6a2cda96697fb2d94bbbf97484adb1acff261efe00 + languageName: node + linkType: hard + +"postcss-svgo@npm:^2.1.1": + version: 2.1.6 + resolution: "postcss-svgo@npm:2.1.6" + dependencies: + is-svg: "npm:^2.0.0" + postcss: "npm:^5.0.14" + postcss-value-parser: "npm:^3.2.3" + svgo: "npm:^0.7.0" + checksum: 10c0/a4e33316888c609b2db8e0dbaa7db49f4c0c880985df364d1a237fc1ef170815f21949433e4ea5684da2c2b3d8ef2f6c0e944d3757c6749b350dbf19d534b5f2 + languageName: node + linkType: hard + +"postcss-unique-selectors@npm:^2.0.2": + version: 2.0.2 + resolution: "postcss-unique-selectors@npm:2.0.2" + dependencies: + alphanum-sort: "npm:^1.0.1" + postcss: "npm:^5.0.4" + uniqs: "npm:^2.0.0" + checksum: 10c0/4d1fac25aec01952390df2746f1cb9392b1cfe29bd167608248408755bd8b510209f95213953bda61b3c1201fb580620acdffd4f29fb85c3986f2a04b9b6bb52 + languageName: node + linkType: hard + +"postcss-value-parser@npm:^3.0.1, postcss-value-parser@npm:^3.0.2, postcss-value-parser@npm:^3.1.1, postcss-value-parser@npm:^3.1.2, postcss-value-parser@npm:^3.2.3, postcss-value-parser@npm:^3.3.0": + version: 3.3.1 + resolution: "postcss-value-parser@npm:3.3.1" + checksum: 10c0/23eed98d8eeadb1f9ef1db4a2757da0f1d8e7c1dac2a38d6b35d971aab9eb3c6d8a967d0e9f435558834ffcd966afbbe875a56bcc5bcdd09e663008c106b3e47 + languageName: node + linkType: hard + +"postcss-zindex@npm:^2.0.1": + version: 2.2.0 + resolution: "postcss-zindex@npm:2.2.0" + dependencies: + has: "npm:^1.0.1" + postcss: "npm:^5.0.4" + uniqs: "npm:^2.0.0" + checksum: 10c0/3c99a8fcd7132ecd5f56df7d8bdbe9a9d78f6c92c784435d522e1909b4e5f624905734c528787b0257a2ae23ec45f5bf435f8e2dcd47733fad8d779b91f2ba09 + languageName: node + linkType: hard + +"postcss@npm:^5.0.10, postcss@npm:^5.0.11, postcss@npm:^5.0.12, postcss@npm:^5.0.13, postcss@npm:^5.0.14, postcss@npm:^5.0.16, postcss@npm:^5.0.2, postcss@npm:^5.0.4, postcss@npm:^5.0.5, postcss@npm:^5.0.6, postcss@npm:^5.0.8, postcss@npm:^5.2.16": + version: 5.2.18 + resolution: "postcss@npm:5.2.18" + dependencies: + chalk: "npm:^1.1.3" + js-base64: "npm:^2.1.9" + source-map: "npm:^0.5.6" + supports-color: "npm:^3.2.3" + checksum: 10c0/1f9f6673dd24d52f1ed33b800248e6ef752d6b6a092fe268021e398df0d7e0956f00fb961781647264d659240c3d67f5bfd3df9bf1b7af985aa996be619d30b1 + languageName: node + linkType: hard + +"postcss@npm:^6.0.1": + version: 6.0.23 + resolution: "postcss@npm:6.0.23" + dependencies: + chalk: "npm:^2.4.1" + source-map: "npm:^0.6.1" + supports-color: "npm:^5.4.0" + checksum: 10c0/45d45184ffbb9d510e7585d9441af9a1a771a56b7553b1d598544e54acdfd31df439a95d5f00a6dc57b85b76d0c8925fec18614b1cc795887c845c3965e32e63 + languageName: node + linkType: hard + +"prepend-http@npm:^1.0.0": + version: 1.0.4 + resolution: "prepend-http@npm:1.0.4" + checksum: 10c0/c6c173ca439e58163ba7bea7cbba52a1ed11e3e3da1c048da296f37d4b7654f78f7304e03f76d5923f4b83af7e2d55533e0f79064209c75b743ccddee13904f8 + languageName: node + linkType: hard + +"proc-log@npm:^6.0.0": + version: 6.1.0 + resolution: "proc-log@npm:6.1.0" + checksum: 10c0/4f178d4062733ead9d71a9b1ab24ebcecdfe2250916a5b1555f04fe2eda972a0ec76fbaa8df1ad9c02707add6749219d118a4fc46dc56bdfe4dde4b47d80bb82 + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 + languageName: node + linkType: hard + +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: 10c0/40c3ce4b7e6d4b8c3355479df77aeed46f81b279818ccdc500124e6a5ab882c0cc81ff7ea16384873a95a74c4570b01b120f287abbdd4c877931460eca6084b3 + languageName: node + linkType: hard + +"promise-inflight@npm:^1.0.1": + version: 1.0.1 + resolution: "promise-inflight@npm:1.0.1" + checksum: 10c0/d179d148d98fbff3d815752fa9a08a87d3190551d1420f17c4467f628214db12235ae068d98cd001f024453676d8985af8f28f002345646c4ece4600a79620bc + languageName: node + linkType: hard + +"prr@npm:~1.0.1": + version: 1.0.1 + resolution: "prr@npm:1.0.1" + checksum: 10c0/5b9272c602e4f4472a215e58daff88f802923b84bc39c8860376bb1c0e42aaf18c25d69ad974bd06ec6db6f544b783edecd5502cd3d184748d99080d68e4be5f + languageName: node + linkType: hard + +"pseudomap@npm:^1.0.2": + version: 1.0.2 + resolution: "pseudomap@npm:1.0.2" + checksum: 10c0/5a91ce114c64ed3a6a553aa7d2943868811377388bb31447f9d8028271bae9b05b340fe0b6961a64e45b9c72946aeb0a4ab635e8f7cb3715ffd0ff2beeb6a679 + languageName: node + linkType: hard + +"public-encrypt@npm:^4.0.0": + version: 4.0.3 + resolution: "public-encrypt@npm:4.0.3" + dependencies: + bn.js: "npm:^4.1.0" + browserify-rsa: "npm:^4.0.0" + create-hash: "npm:^1.1.0" + parse-asn1: "npm:^5.0.0" + randombytes: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: 10c0/6c2cc19fbb554449e47f2175065d6b32f828f9b3badbee4c76585ac28ae8641aafb9bb107afc430c33c5edd6b05dbe318df4f7d6d7712b1093407b11c4280700 + languageName: node + linkType: hard + +"pump@npm:^2.0.0, pump@npm:^2.0.1": + version: 2.0.1 + resolution: "pump@npm:2.0.1" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: 10c0/f1fe8960f44d145f8617ea4c67de05392da4557052980314c8f85081aee26953bdcab64afad58a2b1df0e8ff7203e3710e848cbe81a01027978edc6e264db355 + languageName: node + linkType: hard + +"pumpify@npm:^1.3.3": + version: 1.5.1 + resolution: "pumpify@npm:1.5.1" + dependencies: + duplexify: "npm:^3.6.0" + inherits: "npm:^2.0.3" + pump: "npm:^2.0.0" + checksum: 10c0/0bcabf9e3dbf2d0cc1f9b84ac80d3c75386111caf8963bfd98817a1e2192000ac0ccc804ca6ccd5b2b8430fdb71347b20fb2f014fe3d41adbacb1b502a841c45 + languageName: node + linkType: hard + +"punycode@npm:1.3.2": + version: 1.3.2 + resolution: "punycode@npm:1.3.2" + checksum: 10c0/281fd20eaf4704f79d80cb0dc65065bf6452ee67989b3e8941aed6360a5a9a8a01d3e2ed71d0bde3cd74fb5a5dd9db4160bed5a8c20bed4b6764c24ce4c7d2d2 + languageName: node + linkType: hard + +"punycode@npm:^1.2.4": + version: 1.4.1 + resolution: "punycode@npm:1.4.1" + checksum: 10c0/354b743320518aef36f77013be6e15da4db24c2b4f62c5f1eb0529a6ed02fbaf1cb52925785f6ab85a962f2b590d9cd5ad730b70da72b5f180e2556b8bd3ca08 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.1.1 + resolution: "punycode@npm:2.1.1" + checksum: 10c0/83815ca9b9177f055771f31980cbec7ffaef10257d50a95ab99b4a30f0404846e85fa6887ee1bbc0aaddb7bad6d96e2fa150a016051ff0f6b92be4ad613ddca8 + languageName: node + linkType: hard + +"q@npm:^1.1.2": + version: 1.5.1 + resolution: "q@npm:1.5.1" + checksum: 10c0/7855fbdba126cb7e92ef3a16b47ba998c0786ec7fface236e3eb0135b65df36429d91a86b1fff3ab0927b4ac4ee88a2c44527c7c3b8e2a37efbec9fe34803df4 + languageName: node + linkType: hard + +"query-string@npm:^4.1.0": + version: 4.3.4 + resolution: "query-string@npm:4.3.4" + dependencies: + object-assign: "npm:^4.1.0" + strict-uri-encode: "npm:^1.0.0" + checksum: 10c0/6181c343074c2049fbbcde63f87c1da5d3a49c6e34c8d94a61d692e886e0b8cd1ae4a4be00b598112bb9c4cb819e423ed503a5d246e4d24ecb0990d8bb21570b + languageName: node + linkType: hard + +"querystring-es3@npm:^0.2.0": + version: 0.2.1 + resolution: "querystring-es3@npm:0.2.1" + checksum: 10c0/476938c1adb45c141f024fccd2ffd919a3746e79ed444d00e670aad68532977b793889648980e7ca7ff5ffc7bfece623118d0fbadcaf217495eeb7059ae51580 + languageName: node + linkType: hard + +"querystring@npm:0.2.0": + version: 0.2.0 + resolution: "querystring@npm:0.2.0" + checksum: 10c0/2036c9424beaacd3978bac9e4ba514331cc73163bea7bf3ad7e2c7355e55501938ec195312c607753f9c6e70b1bf9dfcda38db6241bd299c034e27ac639d64ed + languageName: node + linkType: hard + +"randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: "npm:^5.1.0" + checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 + languageName: node + linkType: hard + +"randomfill@npm:^1.0.3": + version: 1.0.4 + resolution: "randomfill@npm:1.0.4" + dependencies: + randombytes: "npm:^2.0.5" + safe-buffer: "npm:^5.1.0" + checksum: 10c0/11aeed35515872e8f8a2edec306734e6b74c39c46653607f03c68385ab8030e2adcc4215f76b5e4598e028c4750d820afd5c65202527d831d2a5f207fe2bc87c + languageName: node + linkType: hard + +"raw-loader@npm:~0.5.0": + version: 0.5.1 + resolution: "raw-loader@npm:0.5.1" + checksum: 10c0/0961d64c0c21c25f8a1ecddd5bf17a4308e5d82addff11044a42c28dde35f14b34c6dbf4665adda7ce3a64922a3132785276c25e1f33c0c62689ff366ab8fb6e + languageName: node + linkType: hard + +"read-pkg-up@npm:^2.0.0": + version: 2.0.0 + resolution: "read-pkg-up@npm:2.0.0" + dependencies: + find-up: "npm:^2.0.0" + read-pkg: "npm:^2.0.0" + checksum: 10c0/6fbb9f8c1a9ed3c8a5764387a77ac4456082f1fe98757d1ed300d8b0a4c70501f28cbb053ae7b3e0de6094930fb7258fbfe099957a53c999337aaf8bc53ff37f + languageName: node + linkType: hard + +"read-pkg@npm:^2.0.0": + version: 2.0.0 + resolution: "read-pkg@npm:2.0.0" + dependencies: + load-json-file: "npm:^2.0.0" + normalize-package-data: "npm:^2.3.2" + path-type: "npm:^2.0.0" + checksum: 10c0/c0d1b66c58e58fadaabe48c83c525fb1966304555e5089fab5ccce2c3dfe0fad726720b170a5fa23ff20452e22d1dbe817f5c63f03546bb85cbfb6b84da84c2b + languageName: node + linkType: hard + +"readable-stream@npm:1 || 2, readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.2, readable-stream@npm:^2.1.5, readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.3, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6": + version: 2.3.7 + resolution: "readable-stream@npm:2.3.7" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 10c0/1708755e6cf9daff6ff60fa5b4575636472289c5b95d38058a91f94732b8d024a940a0d4d955639195ce42c22cab16973ee8fea8deedd24b5fec3dd596465f86 + languageName: node + linkType: hard + +"readable-stream@npm:^3.6.0": + version: 3.6.0 + resolution: "readable-stream@npm:3.6.0" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: 10c0/937bedd29ac8a68331666291922bea892fa2be1a33269e582de9f844a2002f146cf831e39cd49fe6a378d3f0c27358f259ed0e20d20f0bdc6a3f8fc21fce42dc + languageName: node + linkType: hard + +"reduce-css-calc@npm:^1.2.6": + version: 1.3.0 + resolution: "reduce-css-calc@npm:1.3.0" + dependencies: + balanced-match: "npm:^0.4.2" + math-expression-evaluator: "npm:^1.2.14" + reduce-function-call: "npm:^1.0.1" + checksum: 10c0/c0b192bbdc7617ee7e3bcd09332f7f810c2b52f1da8521c4eda03879ead00bcca65bcae78d5bc8cd925610f776532a3457e8b2fd8f4bb936bdb40f057590f20d + languageName: node + linkType: hard + +"reduce-function-call@npm:^1.0.1": + version: 1.0.3 + resolution: "reduce-function-call@npm:1.0.3" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/7e844708d8c3d2946d3df5c537ee1e23c3c60c98ac0dbc724828f36d8d309c391a14995f47ce4f5ba84eea2df5c73d58e4ba100ba331af496920932421a322ed + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"require-main-filename@npm:^1.0.1": + version: 1.0.1 + resolution: "require-main-filename@npm:1.0.1" + checksum: 10c0/1ab87efb72a0e223a667154e92f29ca753fd42eb87f22db142b91c86d134e29ecf18af929111ccd255fd340b57d84a9d39489498d8dfd5136b300ded30a5f0b6 + languageName: node + linkType: hard + +"resolve@npm:^1.10.0": + version: 1.22.0 + resolution: "resolve@npm:1.22.0" + dependencies: + is-core-module: "npm:^2.8.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/efe07a7cd69015a95a5f4e6cc3d372354b93d67a70410ec686413b2054dfa0d5ef16ff52c057a83634debb17f278b99db6dbc60367a4475ae01dda29c6eaa6e4 + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin": + version: 1.22.0 + resolution: "resolve@patch:resolve@npm%3A1.22.0#optional!builtin::version=1.22.0&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.8.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/ef8061e81f40c39070748e8e263c8767d8fcc7c34e9ee85211b29fbc2aedb1ae7cda7d735c2cdbe9367060e9f85ec11c2694e370c121c6bcbb472a7bd0b19555 + languageName: node + linkType: hard + +"rimraf@npm:^2.5.4, rimraf@npm:^2.6.2": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: ./bin.js + checksum: 10c0/4eef73d406c6940927479a3a9dee551e14a54faf54b31ef861250ac815172bade86cc6f7d64a4dc5e98b65e4b18a2e1c9ff3b68d296be0c748413f092bb0dd40 + languageName: node + linkType: hard + +"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": + version: 2.0.2 + resolution: "ripemd160@npm:2.0.2" + dependencies: + hash-base: "npm:^3.0.0" + inherits: "npm:^2.0.1" + checksum: 10c0/f6f0df78817e78287c766687aed4d5accbebc308a8e7e673fb085b9977473c1f139f0c5335d353f172a915bb288098430755d2ad3c4f30612f4dd0c901cd2c3a + languageName: node + linkType: hard + +"run-queue@npm:^1.0.0, run-queue@npm:^1.0.3": + version: 1.0.3 + resolution: "run-queue@npm:1.0.3" + dependencies: + aproba: "npm:^1.1.1" + checksum: 10c0/4e8964279d8f160f9ffaabe82eaad11a1d4c0db596a0f2b5257ae9d2b900c7e1ffcece3e5719199436f50718e1e7f45bb4bf7a82e331a4e734d67c2588a90cbb + languageName: node + linkType: hard + +"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.1.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"sax@npm:^1.2.4, sax@npm:~1.2.1": + version: 1.2.4 + resolution: "sax@npm:1.2.4" + checksum: 10c0/6e9b05ff443ee5e5096ce92d31c0740a20d33002fad714ebcb8fc7a664d9ee159103ebe8f7aef0a1f7c5ecacdd01f177f510dff95611c589399baf76437d3fe3 + languageName: node + linkType: hard + +"schema-utils@npm:^0.3.0": + version: 0.3.0 + resolution: "schema-utils@npm:0.3.0" + dependencies: + ajv: "npm:^5.0.0" + checksum: 10c0/dd0694d6cfec83372273dcc73eeaab3cc8a8026cb0f57e896ea8ef3832421998423c6081ceea04e361ae95b40b6e5e3b9aebc7f3c6d8099ec99dc0a1843d9e67 + languageName: node + linkType: hard + +"schema-utils@npm:^0.4.5": + version: 0.4.7 + resolution: "schema-utils@npm:0.4.7" + dependencies: + ajv: "npm:^6.1.0" + ajv-keywords: "npm:^3.1.0" + checksum: 10c0/0de445cee6bf9a54b7b18b284b5f5ebe5b481f57e71854872c4215bd8eda73811a5f4964718c26f24b50f46a5eafbaf8a391459a7f10b78c242a798a3e0e24c8 + languageName: node + linkType: hard + +"schema-utils@npm:^1.0.0": + version: 1.0.0 + resolution: "schema-utils@npm:1.0.0" + dependencies: + ajv: "npm:^6.1.0" + ajv-errors: "npm:^1.0.0" + ajv-keywords: "npm:^3.1.0" + checksum: 10c0/670e22d7f0ff0b6f4514a4d6fb27c359101b44b7dbfd9563af201af72eb4a9ff06144020cab5f85b16e88821fd09b97cbdae6c893721c6528c8cb704124e6a2f + languageName: node + linkType: hard + +"select2@npm:3.5.1": + version: 3.5.1 + resolution: "select2@npm:3.5.1" + checksum: 10c0/be98375c6c58fea8498f9b0f25fe9a10427b0338ae3c47d1ac49c09d8b31d233ac7f258621ea12d75b7eb9c1be441f90bf9aef03203b04d2838c4f9d54e73b31 + languageName: node + linkType: hard + +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.6.0": + version: 5.7.1 + resolution: "semver@npm:5.7.1" + bin: + semver: ./bin/semver + checksum: 10c0/d4884f2aeca28bff35d0bd40ff0a9b2dfc4b36a883bf0ea5dc15d10d9a01bdc9041035b05f825d4b5ac8a56e490703dbf0d986d054de82cc5e9bad3f02ca6e00 + languageName: node + linkType: hard + +"semver@npm:^7.3.5": + version: 7.7.4 + resolution: "semver@npm:7.7.4" + bin: + semver: bin/semver.js + checksum: 10c0/5215ad0234e2845d4ea5bb9d836d42b03499546ddafb12075566899fc617f68794bb6f146076b6881d755de17d6c6cc73372555879ec7dce2c2feee947866ad2 + languageName: node + linkType: hard + +"serialize-javascript@npm:^1.4.0": + version: 1.9.1 + resolution: "serialize-javascript@npm:1.9.1" + checksum: 10c0/01c1aabb28a50133ac7c86038ec14be26b13e0d8d43ac6ad4bad57789bc8dc33b33fef2424330ab9d138da40d9a3c2520f0d66e8c3474eeeab01669d3a38cae1 + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 + languageName: node + linkType: hard + +"setimmediate@npm:^1.0.4": + version: 1.0.5 + resolution: "setimmediate@npm:1.0.5" + checksum: 10c0/5bae81bfdbfbd0ce992893286d49c9693c82b1bcc00dcaaf3a09c8f428fdeacf4190c013598b81875dfac2b08a572422db7df779a99332d0fce186d15a3e4d49 + languageName: node + linkType: hard + +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": + version: 2.4.11 + resolution: "sha.js@npm:2.4.11" + dependencies: + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + bin: + sha.js: ./bin.js + checksum: 10c0/b7a371bca8821c9cc98a0aeff67444a03d48d745cb103f17228b96793f455f0eb0a691941b89ea1e60f6359207e36081d9be193252b0f128e0daf9cfea2815a5 + languageName: node + linkType: hard + +"shebang-command@npm:^1.2.0": + version: 1.2.0 + resolution: "shebang-command@npm:1.2.0" + dependencies: + shebang-regex: "npm:^1.0.0" + checksum: 10c0/7b20dbf04112c456b7fc258622dafd566553184ac9b6938dd30b943b065b21dabd3776460df534cc02480db5e1b6aec44700d985153a3da46e7db7f9bd21326d + languageName: node + linkType: hard + +"shebang-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "shebang-regex@npm:1.0.0" + checksum: 10c0/9abc45dee35f554ae9453098a13fdc2f1730e525a5eb33c51f096cc31f6f10a4b38074c1ebf354ae7bffa7229506083844008dfc3bb7818228568c0b2dc1fff2 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.0": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 + languageName: node + linkType: hard + +"socks@npm:^2.8.3": + version: 2.8.7 + resolution: "socks@npm:2.8.7" + dependencies: + ip-address: "npm:^10.0.1" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/2805a43a1c4bcf9ebf6e018268d87b32b32b06fbbc1f9282573583acc155860dc361500f89c73bfbb157caa1b4ac78059eac0ef15d1811eb0ca75e0bdadbc9d2 + languageName: node + linkType: hard + +"sort-keys@npm:^1.0.0": + version: 1.1.2 + resolution: "sort-keys@npm:1.1.2" + dependencies: + is-plain-obj: "npm:^1.0.0" + checksum: 10c0/5dd383b0299a40277051f7498c3999520138e2eb50d422962f658738341c9e82349fad4a3024d5ba1a3122688fbaf958f2a472d4c53bade55515097c2ce15420 + languageName: node + linkType: hard + +"source-list-map@npm:^2.0.0": + version: 2.0.1 + resolution: "source-list-map@npm:2.0.1" + checksum: 10c0/2e5e421b185dcd857f46c3c70e2e711a65d717b78c5f795e2e248c9d67757882ea989b80ebc08cf164eeeda5f4be8aa95d3b990225070b2daaaf3257c5958149 + languageName: node + linkType: hard + +"source-map@npm:0.1.x": + version: 0.1.43 + resolution: "source-map@npm:0.1.43" + dependencies: + amdefine: "npm:>=0.0.4" + checksum: 10c0/0cf092a91a0aadfad21ed7cb9ac78878b16242fcc9cd8f631e340b607f311d2f5391df574a29b9e243b35a7d1efd471f357b4b81da8e65145bcae242d46d0297 + languageName: node + linkType: hard + +"source-map@npm:^0.5.3, source-map@npm:^0.5.6": + version: 0.5.7 + resolution: "source-map@npm:0.5.7" + checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 + languageName: node + linkType: hard + +"source-map@npm:^0.6.1, source-map@npm:~0.6.0, source-map@npm:~0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.1.1 + resolution: "spdx-correct@npm:3.1.1" + dependencies: + spdx-expression-parse: "npm:^3.0.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/25909eecc4024963a8e398399dbdd59ddb925bd7dbecd9c9cf6df0d75c29b68cd30b82123564acc51810eb02cfc4b634a2e16e88aa982433306012e318849249 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.3.0 + resolution: "spdx-exceptions@npm:2.3.0" + checksum: 10c0/83089e77d2a91cb6805a5c910a2bedb9e50799da091f532c2ba4150efdef6e53f121523d3e2dc2573a340dc0189e648b03157097f65465b3a0c06da1f18d7e8a + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.11 + resolution: "spdx-license-ids@npm:3.0.11" + checksum: 10c0/6c53cfdb3417e80fd612341319f1296507f797e0387e144047f547c378d9d38d6032ec342de42ef7883256f6690b2fca9889979d0dd015a61dc49b323f9b379b + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + +"ssri@npm:^13.0.0": + version: 13.0.1 + resolution: "ssri@npm:13.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/cf6408a18676c57ff2ed06b8a20dc64bb3e748e5c7e095332e6aecaa2b8422b1e94a739a8453bf65156a8a47afe23757ba4ab52d3ea3b62322dc40875763e17a + languageName: node + linkType: hard + +"ssri@npm:^5.2.4": + version: 5.3.0 + resolution: "ssri@npm:5.3.0" + dependencies: + safe-buffer: "npm:^5.1.1" + checksum: 10c0/f80372ec982cacb3d8e4b53c2a82a7f7502d915a57aef99a29e6cd293302d5944185a569df5fce694a857abb1e602585fcee90182cd2e853bae3d1c20a84d8cb + languageName: node + linkType: hard + +"stream-browserify@npm:^2.0.1": + version: 2.0.2 + resolution: "stream-browserify@npm:2.0.2" + dependencies: + inherits: "npm:~2.0.1" + readable-stream: "npm:^2.0.2" + checksum: 10c0/485562bd5d962d633ae178449029c6fa2611052e356bdb5668f768544aa4daa94c4f9a97de718f3f30ad98f3cb98a5f396252bb3855aff153c138f79c0e8f6ac + languageName: node + linkType: hard + +"stream-each@npm:^1.1.0": + version: 1.2.3 + resolution: "stream-each@npm:1.2.3" + dependencies: + end-of-stream: "npm:^1.1.0" + stream-shift: "npm:^1.0.0" + checksum: 10c0/7ed229d3b7c24373058b5742b00066da8d3122d1487c8219a025ed53a8978545c77654a529a8e9c62ba83ae80c424cbb0204776b49abf72270d2e8154831dd5f + languageName: node + linkType: hard + +"stream-http@npm:^2.7.2": + version: 2.8.3 + resolution: "stream-http@npm:2.8.3" + dependencies: + builtin-status-codes: "npm:^3.0.0" + inherits: "npm:^2.0.1" + readable-stream: "npm:^2.3.6" + to-arraybuffer: "npm:^1.0.0" + xtend: "npm:^4.0.0" + checksum: 10c0/fbe7d327a29216bbabe88d3819bb8f7a502f11eeacf3212579e5af1f76fa7283f6ffa66134ab7d80928070051f571d1029e85f65ce3369fffd4c4df3669446c4 + languageName: node + linkType: hard + +"stream-shift@npm:^1.0.0": + version: 1.0.1 + resolution: "stream-shift@npm:1.0.1" + checksum: 10c0/b63a0d178cde34b920ad93e2c0c9395b840f408d36803b07c61416edac80ef9e480a51910e0ceea0d679cec90921bcd2cccab020d3a9fa6c73a98b0fbec132fd + languageName: node + linkType: hard + +"strict-uri-encode@npm:^1.0.0": + version: 1.1.0 + resolution: "strict-uri-encode@npm:1.1.0" + checksum: 10c0/eb8a4109ba2588239787389313ba58ec49e043d4c64a1d44716defe5821a68ae49abe0cdefed9946ca9fc2a4af7ecf321da92422b0a67258ec0a3638b053ae62 + languageName: node + linkType: hard + +"string-width@npm:^1.0.1": + version: 1.0.2 + resolution: "string-width@npm:1.0.2" + dependencies: + code-point-at: "npm:^1.0.0" + is-fullwidth-code-point: "npm:^1.0.0" + strip-ansi: "npm:^3.0.0" + checksum: 10c0/c558438baed23a9ab9370bb6a939acbdb2b2ffc517838d651aad0f5b2b674fb85d460d9b1d0b6a4c210dffd09e3235222d89a5bd4c0c1587f78b2bb7bc00c65e + languageName: node + linkType: hard + +"string-width@npm:^2.0.0": + version: 2.1.1 + resolution: "string-width@npm:2.1.1" + dependencies: + is-fullwidth-code-point: "npm:^2.0.0" + strip-ansi: "npm:^4.0.0" + checksum: 10c0/e5f2b169fcf8a4257a399f95d069522f056e92ec97dbdcb9b0cdf14d688b7ca0b1b1439a1c7b9773cd79446cbafd582727279d6bfdd9f8edd306ea5e90e5b610 + languageName: node + linkType: hard + +"string_decoder@npm:^1.0.0, string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: "npm:~5.1.0" + checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e + languageName: node + linkType: hard + +"strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1": + version: 3.0.1 + resolution: "strip-ansi@npm:3.0.1" + dependencies: + ansi-regex: "npm:^2.0.0" + checksum: 10c0/f6e7fbe8e700105dccf7102eae20e4f03477537c74b286fd22cfc970f139002ed6f0d9c10d0e21aa9ed9245e0fa3c9275930e8795c5b947da136e4ecb644a70f + languageName: node + linkType: hard + +"strip-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-ansi@npm:4.0.0" + dependencies: + ansi-regex: "npm:^3.0.0" + checksum: 10c0/d75d9681e0637ea316ddbd7d4d3be010b1895a17e885155e0ed6a39755ae0fd7ef46e14b22162e66a62db122d3a98ab7917794e255532ab461bb0a04feb03e7d + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 + languageName: node + linkType: hard + +"strip-eof@npm:^1.0.0": + version: 1.0.0 + resolution: "strip-eof@npm:1.0.0" + checksum: 10c0/f336beed8622f7c1dd02f2cbd8422da9208fae81daf184f73656332899978919d5c0ca84dc6cfc49ad1fc4dd7badcde5412a063cf4e0d7f8ed95a13a63f68f45 + languageName: node + linkType: hard + +"style-loader@npm:^0.23.1": + version: 0.23.1 + resolution: "style-loader@npm:0.23.1" + dependencies: + loader-utils: "npm:^1.1.0" + schema-utils: "npm:^1.0.0" + checksum: 10c0/9752920e4284e53067282f8cca68402604db152b60251525106414ceb7dedbfa5571ad544c95062006c1ff8801aa337e231e848dd3f1a8f73ec3fa680f530895 + languageName: node + linkType: hard + +"supports-color@npm:^2.0.0": + version: 2.0.0 + resolution: "supports-color@npm:2.0.0" + checksum: 10c0/570e0b63be36cccdd25186350a6cb2eaad332a95ff162fa06d9499982315f2fe4217e69dd98e862fbcd9c81eaff300a825a1fe7bf5cc752e5b84dfed042b0dda + languageName: node + linkType: hard + +"supports-color@npm:^3.2.3": + version: 3.2.3 + resolution: "supports-color@npm:3.2.3" + dependencies: + has-flag: "npm:^1.0.0" + checksum: 10c0/d39a57dbd75c3b5740654f8ec16aaf7203b8d12b8a51314507bed590c9081120805f105b4ce741db13105e6f842ac09700e4bd665b9ffc46eb0b34ba54720bd3 + languageName: node + linkType: hard + +"supports-color@npm:^4.2.1": + version: 4.5.0 + resolution: "supports-color@npm:4.5.0" + dependencies: + has-flag: "npm:^2.0.0" + checksum: 10c0/2dc369eeac73954e87037dea1ebae0238b2abc0a39d7e35aa60eb8a84cc8d1dcade8b62e010597f5859f94c937e992abe6a6195460855fcc5e51f8cfc7fcc72a + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0, supports-color@npm:^5.4.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: "npm:^3.0.0" + checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"svgo@npm:^0.7.0": + version: 0.7.2 + resolution: "svgo@npm:0.7.2" + dependencies: + coa: "npm:~1.0.1" + colors: "npm:~1.1.2" + csso: "npm:~2.3.1" + js-yaml: "npm:~3.7.0" + mkdirp: "npm:~0.5.1" + sax: "npm:~1.2.1" + whet.extend: "npm:~0.9.9" + bin: + svgo: ./bin/svgo + checksum: 10c0/cc3314ec0227b7fd4dfcbc622b69e45ac79462a2add2c5198b863f107e4afe459e01812e668fae868b3fb02326ffbb4cd25ca7d1f2580656b14beae10eb2596c + languageName: node + linkType: hard + +"tapable@npm:^0.2.7": + version: 0.2.9 + resolution: "tapable@npm:0.2.9" + checksum: 10c0/93d0e5994621a9496112fe241784d59325684b509eb74d1abd9032802639b53ba9619db0f5db6ccdab994a5279bc4ed07b638a8a25143ba6b10603e409f314fb + languageName: node + linkType: hard + +"tar@npm:^7.5.4": + version: 7.5.12 + resolution: "tar@npm:7.5.12" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.1.0" + yallist: "npm:^5.0.0" + checksum: 10c0/3825c5974f5fde792981f47ee9ffea021ee7f4b552b7ab95eeb98e5dfadfd5a5d5861f01fb772e2e5637a41980d3c019fd6cdad1be48b462b886abd7fe0fa17c + languageName: node + linkType: hard + +"through2@npm:^2.0.0": + version: 2.0.5 + resolution: "through2@npm:2.0.5" + dependencies: + readable-stream: "npm:~2.3.6" + xtend: "npm:~4.0.1" + checksum: 10c0/cbfe5b57943fa12b4f8c043658c2a00476216d79c014895cef1ac7a1d9a8b31f6b438d0e53eecbb81054b93128324a82ecd59ec1a4f91f01f7ac113dcb14eade + languageName: node + linkType: hard + +"timers-browserify@npm:^2.0.4": + version: 2.0.12 + resolution: "timers-browserify@npm:2.0.12" + dependencies: + setimmediate: "npm:^1.0.4" + checksum: 10c0/98e84db1a685bc8827c117a8bc62aac811ad56a995d07938fc7ed8cdc5bf3777bfe2d4e5da868847194e771aac3749a20f6cdd22091300fe889a76fe214a4641 + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.12": + version: 0.2.15 + resolution: "tinyglobby@npm:0.2.15" + dependencies: + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.3" + checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 + languageName: node + linkType: hard + +"to-arraybuffer@npm:^1.0.0": + version: 1.0.1 + resolution: "to-arraybuffer@npm:1.0.1" + checksum: 10c0/2460bd95524f4845a751e4f8bf9937f9f3dcd1651f104e1512868782f858f8302c1cf25bbc30794bc1b3ff65c4e135158377302f2abaff43a2d8e3c38dfe098c + languageName: node + linkType: hard "treebeard@https://github.com/CenterForOpenScience/treebeard.git#d2bb8f6f8104fcac040402727f431c26722b269e": - version "0.6.1" - resolved "https://github.com/CenterForOpenScience/treebeard.git#d2bb8f6f8104fcac040402727f431c26722b269e" - dependencies: - bootstrap "~3.3.2" - jquery ">=1.11.0" - jquery-ui ">=1.10.4" - mithril ">=0.2" - -tslib@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f" - integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ== - -typeahead.js@^0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/typeahead.js/-/typeahead.js-0.11.1.tgz#4e64e671b22310a8606f4aec805924ba84b015b8" - integrity sha1-TmTmcbIjEKhgb0rsgFkkuoSwFbg= - dependencies: - jquery ">=1.7" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -uglify-es@^3.3.4: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== - dependencies: - commander "~2.13.0" - source-map "~0.6.1" - -uglifyjs-webpack-plugin@1.3.0, uglifyjs-webpack-plugin@^0.4.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" - integrity sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw== - dependencies: - cacache "^10.0.4" - find-cache-dir "^1.0.0" - schema-utils "^0.4.5" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - uglify-es "^3.3.4" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - -unique-filename@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-loader@~0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7" - integrity sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q== - dependencies: - loader-utils "^1.0.2" - mime "^1.4.1" - schema-utils "^0.3.0" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vendors@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" - integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -watchpack@^1.4.0, watchpack@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" - integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -webpack-sources@^1.0.1, webpack-sources@^1.1.0: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz#3f9e34360370602fcf639e97939db486f4ec0d74" - integrity sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ== - dependencies: - acorn "^5.0.0" - acorn-dynamic-import "^2.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - async "^2.1.2" - enhanced-resolve "^3.4.0" - escope "^3.6.0" - interpret "^1.0.0" - json-loader "^0.5.4" - json5 "^0.5.1" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - mkdirp "~0.5.0" - node-libs-browser "^2.0.0" - source-map "^0.5.3" - supports-color "^4.2.1" - tapable "^0.2.7" - uglifyjs-webpack-plugin "^0.4.6" - watchpack "^1.4.0" - webpack-sources "^1.0.1" - yargs "^8.0.2" - -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" - integrity sha1-+HfVv2SMl+WqVC+twW1qJZucEaE= - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -worker-farm@^1.5.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" - integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= - dependencies: - camelcase "^4.1.0" - -yargs@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" - integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A= - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" - -zxcvbn@^4.2.0: - version "4.4.2" - resolved "https://registry.yarnpkg.com/zxcvbn/-/zxcvbn-4.4.2.tgz#28ec17cf09743edcab056ddd8b1b06262cc73c30" - integrity sha1-KOwXzwl0PtyrBW3dixsGJizHPDA= + version: 0.6.1 + resolution: "treebeard@https://github.com/CenterForOpenScience/treebeard.git#commit=d2bb8f6f8104fcac040402727f431c26722b269e" + dependencies: + bootstrap: "npm:~3.3.2" + jquery: "npm:>=1.11.0" + jquery-ui: "npm:>=1.10.4" + mithril: "npm:>=0.2" + checksum: 10c0/7e6828645a194d2bc2ad96c8efd6a3fd9077cf1be9c443c8a76e48e3427f10643af3ce19a2fd8b9a56913d420a2792f754cca3013057cac5b574005861939f63 + languageName: node + linkType: hard + +"tslib@npm:^2.3.0": + version: 2.3.1 + resolution: "tslib@npm:2.3.1" + checksum: 10c0/4efd888895bdb3b987086b2b7793ad1013566f882b0eb7a328384e5ecc0d71cafb16bbeab3196200cbf7f01a73ccc25acc2f131d4ea6ee959be7436a8a306482 + languageName: node + linkType: hard + +"tty-browserify@npm:0.0.0": + version: 0.0.0 + resolution: "tty-browserify@npm:0.0.0" + checksum: 10c0/c0c68206565f1372e924d5cdeeff1a0d9cc729833f1da98c03d78be8f939e5f61a107bd0ab77d1ef6a47d62bb0e48b1081fbea273acf404959e22fd3891439c5 + languageName: node + linkType: hard + +"type@npm:^1.0.1": + version: 1.2.0 + resolution: "type@npm:1.2.0" + checksum: 10c0/444660849aaebef8cbb9bc43b28ec2068952064cfce6a646f88db97aaa2e2d6570c5629cd79238b71ba23aa3f75146a0b96e24e198210ee0089715a6f8889bf7 + languageName: node + linkType: hard + +"type@npm:^2.5.0": + version: 2.6.0 + resolution: "type@npm:2.6.0" + checksum: 10c0/d08063a1c3415140d0b6fd17ede55f373cdd6c5503776693ad5ead574a06404823374d62d6233e43bc30ec22f596b790cbb8661429bed75a75dab986b506ac60 + languageName: node + linkType: hard + +"typeahead.js@npm:^0.11.1": + version: 0.11.1 + resolution: "typeahead.js@npm:0.11.1" + dependencies: + jquery: "npm:>=1.7" + checksum: 10c0/c5c0387e711ad1cae8993bbae55a26d2ca0d6f06de550466977109ba323fe019e241c7d8e3858455214dc4bbfdec82481cd2f6313629eefe0c587222915ffa28 + languageName: node + linkType: hard + +"typedarray@npm:^0.0.6": + version: 0.0.6 + resolution: "typedarray@npm:0.0.6" + checksum: 10c0/6005cb31df50eef8b1f3c780eb71a17925f3038a100d82f9406ac2ad1de5eb59f8e6decbdc145b3a1f8e5836e17b0c0002fb698b9fe2516b8f9f9ff602d36412 + languageName: node + linkType: hard + +"uglify-es@npm:^3.3.4": + version: 3.3.9 + resolution: "uglify-es@npm:3.3.9" + dependencies: + commander: "npm:~2.13.0" + source-map: "npm:~0.6.1" + bin: + uglifyjs: bin/uglifyjs + checksum: 10c0/b591de4ea2c7153f446f80f2559bbabcb4ff53a17dbfd27b9bb980b31f5fb7e563bdae6e9abc07d97ecb484ac4ceba4c7a207e6854cb2aaca72e80e6090c989e + languageName: node + linkType: hard + +"uglifyjs-webpack-plugin@npm:1.3.0": + version: 1.3.0 + resolution: "uglifyjs-webpack-plugin@npm:1.3.0" + dependencies: + cacache: "npm:^10.0.4" + find-cache-dir: "npm:^1.0.0" + schema-utils: "npm:^0.4.5" + serialize-javascript: "npm:^1.4.0" + source-map: "npm:^0.6.1" + uglify-es: "npm:^3.3.4" + webpack-sources: "npm:^1.1.0" + worker-farm: "npm:^1.5.2" + peerDependencies: + webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 + checksum: 10c0/d10ae2ac25f64afddff328fbaa58640450c099c53e44d66829681a5415ef72aa2563d1e5ed43e0e9c409db869575fd914293faaa39288e21da518084878de413 + languageName: node + linkType: hard + +"uniq@npm:^1.0.1": + version: 1.0.1 + resolution: "uniq@npm:1.0.1" + checksum: 10c0/369dca4a07fdd8de9e48378b9d4b6861722ca71d5f496e91687916bd4b48b8cf3d6db1677be1b40eea63bc6d4728efb4b4e0bd7a89c5fd2d23e7a2cff8009c7a + languageName: node + linkType: hard + +"uniqs@npm:^2.0.0": + version: 2.0.0 + resolution: "uniqs@npm:2.0.0" + checksum: 10c0/f244b158f6b3d30ddea2092c581fe9eb746d6db889a859fd0001e4b7566767bfcc53cdf11e6286f097bb130ebad71025709f41f2e4dd38e5c2f03ec28052baab + languageName: node + linkType: hard + +"unique-filename@npm:^1.1.0": + version: 1.1.1 + resolution: "unique-filename@npm:1.1.1" + dependencies: + unique-slug: "npm:^2.0.0" + checksum: 10c0/d005bdfaae6894da8407c4de2b52f38b3c58ec86e79fc2ee19939da3085374413b073478ec54e721dc8e32b102cf9e50d0481b8331abdc62202e774b789ea874 + languageName: node + linkType: hard + +"unique-slug@npm:^2.0.0": + version: 2.0.2 + resolution: "unique-slug@npm:2.0.2" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/9eabc51680cf0b8b197811a48857e41f1364b25362300c1ff636c0eca5ec543a92a38786f59cf0697e62c6f814b11ecbe64e8093db71246468a1f03b80c83970 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + +"url-loader@npm:~0.6.2": + version: 0.6.2 + resolution: "url-loader@npm:0.6.2" + dependencies: + loader-utils: "npm:^1.0.2" + mime: "npm:^1.4.1" + schema-utils: "npm:^0.3.0" + peerDependencies: + file-loader: "*" + checksum: 10c0/c8e2de856011315fb436201ddd2f870d5bc52fcca68cb69c35f74cab891e5a24b97cd75dd4c753046d55841521b0c0939e7f9aef5170b7c8536c6cd3617880b4 + languageName: node + linkType: hard + +"url@npm:^0.11.0": + version: 0.11.0 + resolution: "url@npm:0.11.0" + dependencies: + punycode: "npm:1.3.2" + querystring: "npm:0.2.0" + checksum: 10c0/bbe05f9f570ec5c06421c50ca63f287e61279092eed0891db69a9619323703ccd3987e6eed234c468794cf25680c599680d5c1f58d26090f1956c8e9ed8346a2 + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + languageName: node + linkType: hard + +"util@npm:0.10.3": + version: 0.10.3 + resolution: "util@npm:0.10.3" + dependencies: + inherits: "npm:2.0.1" + checksum: 10c0/88bb58fec3b1f5f43dea27795f61f24b3b505bbba6f3ad6e91b32db0cd0928b2acb54ebe21603a75743c6e21a52f954cd2ffb6cddafed5a01169dd1287db3ff3 + languageName: node + linkType: hard + +"util@npm:^0.11.0": + version: 0.11.1 + resolution: "util@npm:0.11.1" + dependencies: + inherits: "npm:2.0.3" + checksum: 10c0/8e9d1a85e661c8a8d9883d821aedbff3f8d9c3accd85357020905386ada5653b20389fc3591901e2a0bde64f8dc86b28c3f990114aa5a38eaaf30b455fa3cdf6 + languageName: node + linkType: hard + +"validate-npm-package-license@npm:^3.0.1": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f + languageName: node + linkType: hard + +"vendors@npm:^1.0.0": + version: 1.0.4 + resolution: "vendors@npm:1.0.4" + checksum: 10c0/a9b097f3607013a23bf447cbaff85b79b694cc23b20e81a6aea1ea9e1c59854c93f7c87abcc71b57999e050606e499d9ce18df67968823644b20f6e03d56022a + languageName: node + linkType: hard + +"vm-browserify@npm:^1.0.1": + version: 1.1.2 + resolution: "vm-browserify@npm:1.1.2" + checksum: 10c0/0cc1af6e0d880deb58bc974921320c187f9e0a94f25570fca6b1bd64e798ce454ab87dfd797551b1b0cc1849307421aae0193cedf5f06bdb5680476780ee344b + languageName: node + linkType: hard + +"watchpack@npm:^2.3.1": + version: 2.3.1 + resolution: "watchpack@npm:2.3.1" + dependencies: + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.1.2" + checksum: 10c0/00e44f5cc6ca299dd1ff52bf926a70a23ae1aeb6b399b7e32569d6d31ef1fc9bc3f5570ade6fef220dd6d74ee70259c9621b79cf487552caf1ea2727aa40f984 + languageName: node + linkType: hard + +"webpack-sources@npm:^1.0.1, webpack-sources@npm:^1.1.0": + version: 1.4.3 + resolution: "webpack-sources@npm:1.4.3" + dependencies: + source-list-map: "npm:^2.0.0" + source-map: "npm:~0.6.1" + checksum: 10c0/78dafb3e1e297d3f4eb6204311e8c64d28cd028f82887ba33aaf03fffc82482d8e1fdf6de25a60f4dde621d3565f4c3b1bfb350f09add8f4e54e00279ff3db5e + languageName: node + linkType: hard + +"webpack@npm:3.12.0": + version: 3.12.0 + resolution: "webpack@npm:3.12.0" + dependencies: + acorn: "npm:^5.0.0" + acorn-dynamic-import: "npm:^2.0.0" + ajv: "npm:^6.1.0" + ajv-keywords: "npm:^3.1.0" + async: "npm:^2.1.2" + enhanced-resolve: "npm:^3.4.0" + escope: "npm:^3.6.0" + interpret: "npm:^1.0.0" + json-loader: "npm:^0.5.4" + json5: "npm:^0.5.1" + loader-runner: "npm:^2.3.0" + loader-utils: "npm:^1.1.0" + memory-fs: "npm:~0.4.1" + mkdirp: "npm:~0.5.0" + node-libs-browser: "npm:^2.0.0" + source-map: "npm:^0.5.3" + supports-color: "npm:^4.2.1" + tapable: "npm:^0.2.7" + uglifyjs-webpack-plugin: "npm:^0.4.6" + watchpack: "npm:^1.4.0" + webpack-sources: "npm:^1.0.1" + yargs: "npm:^8.0.2" + bin: + webpack: ./bin/webpack.js + checksum: 10c0/64051e33b94d641ea6ed85e6d33d0964ff27ce28f4dd9a989dee39ce98b67fadd057fecd2bfdf49c8fe8909c0c74e415f01381e7a105f926968b1a6eb92f5220 + languageName: node + linkType: hard + +"whet.extend@npm:~0.9.9": + version: 0.9.9 + resolution: "whet.extend@npm:0.9.9" + checksum: 10c0/75c48bfe0cdd36b7c510286d591b34a1a6810ba914b0c8f23788c2a17f4592706debaf1f1f667c7f46f1a657c4f1d5f2889ce234b570827acbb29bf28799ce7f + languageName: node + linkType: hard + +"which-module@npm:^2.0.0": + version: 2.0.0 + resolution: "which-module@npm:2.0.0" + checksum: 10c0/946ffdbcd6f0cf517638f8f2319c6d51e528c3b41bc2c0f5dc3dc46047347abd7326aea5cdf5def0a8b32bdca313ac87a32ce5a76b943fe1ca876c4557e6b716 + languageName: node + linkType: hard + +"which@npm:^1.2.9": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: "npm:^2.0.0" + bin: + which: ./bin/which + checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 + languageName: node + linkType: hard + +"which@npm:^6.0.0": + version: 6.0.1 + resolution: "which@npm:6.0.1" + dependencies: + isexe: "npm:^4.0.0" + bin: + node-which: bin/which.js + checksum: 10c0/7e710e54ea36d2d6183bee2f9caa27a3b47b9baf8dee55a199b736fcf85eab3b9df7556fca3d02b50af7f3dfba5ea3a45644189836df06267df457e354da66d5 + languageName: node + linkType: hard + +"worker-farm@npm:^1.5.2": + version: 1.7.0 + resolution: "worker-farm@npm:1.7.0" + dependencies: + errno: "npm:~0.1.7" + checksum: 10c0/069a032f9198a07273a7608dc0c23d7288c1c25256b66008e1ae95838cda6fa2c7aefb3b7ba760f975c8d18120ca54eb193afb66d7237b2a05e5da12c1c961f7 + languageName: node + linkType: hard + +"wrap-ansi@npm:^2.0.0": + version: 2.1.0 + resolution: "wrap-ansi@npm:2.1.0" + dependencies: + string-width: "npm:^1.0.1" + strip-ansi: "npm:^3.0.1" + checksum: 10c0/1a47367eef192fc9ecaf00238bad5de8987c3368082b619ab36c5e2d6d7b0a2aef95a2ca65840be598c56ced5090a3ba487956c7aee0cac7c45017502fa980fb + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"xtend@npm:^4.0.0, xtend@npm:~4.0.1": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e + languageName: node + linkType: hard + +"y18n@npm:^3.2.1": + version: 3.2.2 + resolution: "y18n@npm:3.2.2" + checksum: 10c0/08dc1880f6f766057ed25cd61ef0c7dab3db93639db9a7487a84f75dac7a349dface8dff8d1d8b7bdf50969fcd69ab858ab26b06968b4e4b12ee60d195233c46 + languageName: node + linkType: hard + +"y18n@npm:^4.0.0": + version: 4.0.3 + resolution: "y18n@npm:4.0.3" + checksum: 10c0/308a2efd7cc296ab2c0f3b9284fd4827be01cfeb647b3ba18230e3a416eb1bc887ac050de9f8c4fd9e7856b2e8246e05d190b53c96c5ad8d8cb56dffb6f81024 + languageName: node + linkType: hard + +"yallist@npm:^2.1.2": + version: 2.1.2 + resolution: "yallist@npm:2.1.2" + checksum: 10c0/0b9e25aa00adf19e01d2bcd4b208aee2b0db643d9927131797b7af5ff69480fc80f1c3db738cbf3946f0bddf39d8f2d0a5709c644fd42d4aa3a4e6e786c087b5 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + +"yargs-parser@npm:^7.0.0": + version: 7.0.0 + resolution: "yargs-parser@npm:7.0.0" + dependencies: + camelcase: "npm:^4.1.0" + checksum: 10c0/6fde2df522dd071cf76308fe4e37fd2fb8eae3eb1fb6c6759c2d448264c8451162649eb8558ac8d83aff79278cabfddc17ecba3e1a0d0fe2e406cf4e1bc95b0d + languageName: node + linkType: hard + +"yargs@npm:^8.0.2": + version: 8.0.2 + resolution: "yargs@npm:8.0.2" + dependencies: + camelcase: "npm:^4.1.0" + cliui: "npm:^3.2.0" + decamelize: "npm:^1.1.1" + get-caller-file: "npm:^1.0.1" + os-locale: "npm:^2.0.0" + read-pkg-up: "npm:^2.0.0" + require-directory: "npm:^2.1.1" + require-main-filename: "npm:^1.0.1" + set-blocking: "npm:^2.0.0" + string-width: "npm:^2.0.0" + which-module: "npm:^2.0.0" + y18n: "npm:^3.2.1" + yargs-parser: "npm:^7.0.0" + checksum: 10c0/70e4ed99e3f1e8a034d0b600773db9fb44e03ec88cfa7125fc65a965428051ad59e77c074afa1afcbe3ec34436d3a6e7ba18b3ec62b4e5f59f30606df791b125 + languageName: node + linkType: hard + +"zxcvbn@npm:^4.2.0": + version: 4.4.2 + resolution: "zxcvbn@npm:4.4.2" + checksum: 10c0/862f101cc95247b30290bad67ade333e430a16763bb771ce4e4c5414396d987f9a64288225675c96bd6f8d3eba65da0dee119b2a4eaa2e249da3f540b036942e + languageName: node + linkType: hard From 3b8db24c9c6936871997c1c41ce85a1ea697be3a Mon Sep 17 00:00:00 2001 From: Yuhuai Liu Date: Mon, 23 Mar 2026 10:19:54 -0400 Subject: [PATCH 28/31] Feature/pbs 26 2 (#11647) * update yarn lock * update admin yarn.lock --- admin/yarn.lock | 8353 ++++++++++++++++++++++++++++------------------- 1 file changed, 4965 insertions(+), 3388 deletions(-) diff --git a/admin/yarn.lock b/admin/yarn.lock index 90252afd898..7a99e1b573b 100644 --- a/admin/yarn.lock +++ b/admin/yarn.lock @@ -1,3388 +1,4965 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -JSON2@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/JSON2/-/JSON2-0.1.0.tgz#8d7493040a63d5835af75f47decb83ab6c8c0790" - integrity sha512-MRguCg79vy8Kx15/CXzoO5pEPi0tQq7T70mL/t1Hv3G+hVfJVO2BZqX3sl2kbWW08GAmzQYSRfWRtQhmK/eaYA== - -acorn-dynamic-import@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" - integrity sha512-GKp5tQ8h0KMPWIYGRHHXI1s5tUpZixZ3IHF2jAu42wSCf6In/G873s6/y4DdKdhWvzhu1T6mE1JgvnhAKqyYYQ== - dependencies: - acorn "^4.0.3" - -acorn@^4.0.3: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - integrity sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug== - -acorn@^5.0.0: - version "5.7.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" - integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-keywords@^3.1.0: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv@^6.1.0: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ== - -ansi-regex@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-1.1.1.tgz#41c847194646375e6a1a5d10c3ca054ef9fc980d" - integrity sha512-q5i8bFLg2wDfsuR56c1NzlJFPzVD+9mxhDrhqOGigEFa87OZHlF+9dWeGWzVTP/0ECiA/JUGzfzRr2t3eYORRw== - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -async@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== - -async@^2.1.2: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - -autoprefixer@^6.3.1: - version "6.7.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" - integrity sha512-WKExI/eSGgGAkWAO+wMVdFObZV7hQen54UpD1kCCTN3tvlL3W1jL4+lPP/M7MwoP7Q4RHzKtO3JQ4HxYEcd+xQ== - dependencies: - browserslist "^1.7.6" - caniuse-db "^1.0.30000634" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^5.2.16" - postcss-value-parser "^3.2.3" - -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g== - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.0.0, babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ== - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-loader@^6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca" - integrity sha512-hHvbCsXtwKIznu5Qmqfe/IwZ4O5frqe+j04fN/5u/9Rg48dpWIKyYqAN68N1wwqGSMToo4FhU9/MrH+QZlFdkQ== - dependencies: - find-cache-dir "^0.1.1" - loader-utils "^0.2.16" - mkdirp "^0.5.1" - object-assign "^4.0.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w== - dependencies: - babel-runtime "^6.22.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A== - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg== - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA== - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g== - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - -balanced-match@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - integrity sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.0.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -bluebird@^3.5.1: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -bootstrap-colorpicker@^2.5.2: - version "2.5.3" - resolved "https://registry.yarnpkg.com/bootstrap-colorpicker/-/bootstrap-colorpicker-2.5.3.tgz#b50aff8590fbaa6b5aa63a5624e4213f1659a49d" - integrity sha512-xdllX8LSMvKULs3b8JrgRXTvyvjkSMHHHVuHjjN5FNMqr6kRe5NPiMHFmeAFjlgDF73MspikudLuEwR28LbzLw== - dependencies: - jquery ">=1.10" - -bootstrap-tagsinput@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/bootstrap-tagsinput/-/bootstrap-tagsinput-0.7.1.tgz#ffe3b06bbe2a106945ef2814568005a94f211937" - integrity sha512-xSks67GWgXLnmO5gqp788vhh7WoXd9mHj5uKE5zg8rvw3sNYYSCjrSlrPRlPdpYKwmuxeuf2jsNjBSWEucyB1w== - -bower@^1.3.12: - version "1.8.14" - resolved "https://registry.yarnpkg.com/bower/-/bower-1.8.14.tgz#985722a3c1fcd35c93d4136ecbeafbeaaea74e86" - integrity sha512-8Rq058FD91q9Nwthyhw0la9fzpBz0iwZTrt51LWl+w+PnJgZk9J+5wp3nibsJcIUPglMYXr4NRBaR+TUj0OkBQ== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-versionify@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/browserify-versionify/-/browserify-versionify-1.0.3.tgz#927eaaf85f16fe8d8d59eb1c6da76b488c01406c" - integrity sha512-QJ6s79FZWcKlYptoyd1K5/m+hYuVN8aW8k5b5Z7U9GhL8lR9YrAtADftcSeBJOeltjqfr2JlmtU3FfS+GU/cXQ== - dependencies: - find-root "^0.1.1" - through2 "0.6.3" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: - version "1.7.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" - integrity sha512-qHJblDE2bXVRYzuDetv/wAeHOJyO97+9wxC1cdCtyzgNuSozOyRCiiLaCR1f71AN66lQdVVBipWm63V+a7bPOw== - dependencies: - caniuse-db "^1.0.30000639" - electron-to-chromium "^1.2.7" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== - -cacache@^10.0.4: - version "10.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" - integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA== - dependencies: - bluebird "^3.5.1" - chownr "^1.0.1" - glob "^7.1.2" - graceful-fs "^4.1.11" - lru-cache "^4.1.1" - mississippi "^2.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.2" - ssri "^5.2.4" - unique-filename "^1.1.0" - y18n "^4.0.0" - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== - -caniuse-api@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" - integrity sha512-SBTl70K0PkDUIebbkXrxWqZlHNs0wRgRD6QZ8guctShjbh63gEPfF+Wj0Yw+75f5Y8tSzqAI/NcisYv/cCah2Q== - dependencies: - browserslist "^1.3.6" - caniuse-db "^1.0.30000529" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30001359" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001359.tgz#6642bf0d654c7db0df413e45d9be9ee15db822a1" - integrity sha512-9c4zPEXTKlVEWtHY5SDVxQZg09US8oyCf7wEPByyGR7T9lKXdhgxMiyS5DWwXaz4cPJiW4zmkM/mUsJSBb9VXw== - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -charenc@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - -chownr@^1.0.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -clap@^1.0.9: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" - integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA== - dependencies: - chalk "^1.1.3" - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -coa@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" - integrity sha512-KAGck/eNAmCL0dcT3BiuYwLbExK6lduR8DxM3C1TyDzaXhZHyZ8ooX5I5+na2e3dPFuibfxrGdorr0/Lr7RYCQ== - dependencies: - q "^1.1.2" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== - -color-convert@^1.3.0, color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" - integrity sha512-sz29j1bmSDfoAxKIEU6zwoIZXN6BrFbAMIhfYCNyiZXBDuU/aiHlN84lp/xDzL2ubyFhLDobHIlU1X70XRrMDA== - dependencies: - color-name "^1.0.0" - -color@^0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" - integrity sha512-Ajpjd8asqZ6EdxQeqGzU5WBhhTfJ/0cA4Wlbre7e5vXfmDSmda7Ov6jeKoru+b0vHcb1CqvuroTHp5zIWzhVMA== - dependencies: - clone "^1.0.2" - color-convert "^1.3.0" - color-string "^0.3.0" - -colormin@^1.0.5: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" - integrity sha512-XSEQUUQUR/lXqGyddiNH3XYFUPYlYr1vXy9rTFMsSOw+J7Q6EQkdlQIrTlYn4TccpsOaUE1PYQNjBn20gwCdgQ== - dependencies: - color "^0.11.0" - css-color-names "0.0.4" - has "^1.0.1" - -colors@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - integrity sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w== - -combined-stream@^1.0.5: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -component-emitter@^1.1.3: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -component-emitter@~1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== - -convert-source-map@^1.5.1: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - integrity sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw== - -cookiejar@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.0.6.tgz#0abf356ad00d1c5a219d88d44518046dd026acfe" - integrity sha512-X9IsySmsr1heROBZCpyEYhqJyU7CXNJoVxIlQ5bBb7DskYUx0mQ+g2f7yPYajceZeGJWHQbIfGB6j0hywV/ARQ== - -copy-anything@^2.0.1: - version "2.0.6" - resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" - integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== - dependencies: - is-what "^3.14.1" - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -crypt@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-color-names@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q== - -css-loader@^0.28.11, css-loader@~0.26.1: - version "0.28.11" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" - integrity sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg== - dependencies: - babel-code-frame "^6.26.0" - css-selector-tokenizer "^0.7.0" - cssnano "^3.10.0" - icss-utils "^2.1.0" - loader-utils "^1.0.2" - lodash.camelcase "^4.3.0" - object-assign "^4.1.1" - postcss "^5.0.6" - postcss-modules-extract-imports "^1.2.0" - postcss-modules-local-by-default "^1.2.0" - postcss-modules-scope "^1.1.0" - postcss-modules-values "^1.3.0" - postcss-value-parser "^3.3.0" - source-list-map "^2.0.0" - -css-selector-tokenizer@^0.7.0: - version "0.7.3" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" - integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg== - dependencies: - cssesc "^3.0.0" - fastparse "^1.1.2" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssnano@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" - integrity sha512-0o0IMQE0Ezo4b41Yrm8U6Rp9/Ag81vNXY1gZMnT1XhO4DpjEf2utKERqWJbOoz3g1Wdc1d3QSta/cIuJ1wSTEg== - dependencies: - autoprefixer "^6.3.1" - decamelize "^1.1.2" - defined "^1.0.0" - has "^1.0.1" - object-assign "^4.0.1" - postcss "^5.0.14" - postcss-calc "^5.2.0" - postcss-colormin "^2.1.8" - postcss-convert-values "^2.3.4" - postcss-discard-comments "^2.0.4" - postcss-discard-duplicates "^2.0.1" - postcss-discard-empty "^2.0.1" - postcss-discard-overridden "^0.1.1" - postcss-discard-unused "^2.2.1" - postcss-filter-plugins "^2.0.0" - postcss-merge-idents "^2.1.5" - postcss-merge-longhand "^2.0.1" - postcss-merge-rules "^2.0.3" - postcss-minify-font-values "^1.0.2" - postcss-minify-gradients "^1.0.1" - postcss-minify-params "^1.0.4" - postcss-minify-selectors "^2.0.4" - postcss-normalize-charset "^1.1.0" - postcss-normalize-url "^3.0.7" - postcss-ordered-values "^2.1.0" - postcss-reduce-idents "^2.2.2" - postcss-reduce-initial "^1.0.0" - postcss-reduce-transforms "^1.0.3" - postcss-svgo "^2.1.1" - postcss-unique-selectors "^2.0.2" - postcss-value-parser "^3.2.3" - postcss-zindex "^2.0.1" - -csso@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" - integrity sha512-FmCI/hmqDeHHLaIQckMhMZneS84yzUZdrWDAvJVVxOwcKE1P1LF9FGmzr1ktIQSxOw6fl3PaQsmfg+GN+VvR3w== - dependencies: - clap "^1.0.9" - source-map "^0.5.3" - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A== - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -debug@2, debug@^2.6.8, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.2.6: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.1.1, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A== - dependencies: - repeating "^2.0.0" - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -domready@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/domready/-/domready-0.3.0.tgz#b3740facbd09163018152d12aec239383e102175" - integrity sha512-0w07yqKSi2caAo0qESL8Ou+ZkDfOrzxyJzSvJEdKmjOzPobPo7d4QFxpLjrq8zmigWP2mh2i/5F53NKSkPIqbA== - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -electron-to-chromium@^1.2.7: - version "1.4.172" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.172.tgz#87335795a3dc19e7b6dd5af291038477d81dc6b1" - integrity sha512-yDoFfTJnqBAB6hSiPvzmsBJSrjOXJtHSJoqJdI/zSIh7DYupYnIOHt/bbPw/WE31BJjNTybDdNAs21gCMnTh0Q== - -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" - integrity sha512-ZaAux1rigq1e2nQrztHn4h2ugvpzZxs64qneNah+8Mh/K0CRqJFJc+UoXnUsq+1yX+DmQFPPdVqboKAJ89e0Iw== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - object-assign "^4.0.1" - tapable "^0.2.7" - -errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -error-ex@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14: - version "0.10.61" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.61.tgz#311de37949ef86b6b0dcea894d1ffedb909d3269" - integrity sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - next-tick "^1.1.0" - -es6-iterator@^2.0.3, es6-iterator@~2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - integrity sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A== - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - integrity sha512-7S8YXIcUfPMOr3rqJBVMePAbRsD1nWeSMQ86K/lDI76S3WKXz+KWILvTIPbTroubOkZTGh+b+7/xIIphZXNYbA== - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - integrity sha512-exfuQY8UGtn/N+gL1iKkH8fpNd5sJ760nJq6mmZAHldfxMD5kX07lbQuYlspoXsuknXNv9Fb7y2GsPOnQIbxHg== - dependencies: - d "1" - es5-ext "~0.10.14" - -es6-symbol@^3.1.1, es6-symbol@^3.1.3, es6-symbol@~3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -es6-weak-map@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" - integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== - dependencies: - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - es6-symbol "^3.1.1" - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - integrity sha512-75IUQsusDdalQEW/G/2esa87J7raqdJF+Ca0/Xm5C3Q58Nr4yVYjZGp/P1+2xiEVgXRrA39dpRb8LcshajbqDQ== - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== - -esrecurse@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== - dependencies: - d "1" - es5-ext "~0.10.14" - -events@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw== - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -ext@^1.1.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" - integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== - dependencies: - type "^2.5.0" - -extend@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" - integrity sha512-5mYyg57hpD+sFaJmgNL9BidQ5C7dmJE3U5vzlRWbuqG+8dytvYEoxvKs6Tj5cm3LpMsFvRt20qz1ckezmsOUgQ== - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fastparse@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" - integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== - -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" - integrity sha512-Z9XSBoNE7xQiV6MSgPuCfyMokH2K7JdpRkOYE1+mu3d4BFJtx3GW+f6Bo4q8IX6rlf5MYbLBKW0pjl2cWdkm2A== - dependencies: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" - -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - integrity sha512-46TFiBOzX7xq/PcSWfFwkyjpemdRnMe31UQF+os0y+1W3k95f6R4SEt02Hj4p3X0Mir9gfrkmOtshFidS0VPUg== - dependencies: - commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" - -find-root@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-0.1.2.tgz#98d2267cff1916ccaf2743b3a0eea81d79d7dcd1" - integrity sha512-GyDxVgA61TZcrgDJPqOqGBpi80Uf2yIstubgizi7AjC9yPdRrqBR+Y0MvK4kXnYlaoz3d+SGxDHMYVkwI/yd2w== - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" - integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - -font-awesome-webpack@0.0.5-beta.2: - version "0.0.5-beta.2" - resolved "https://registry.yarnpkg.com/font-awesome-webpack/-/font-awesome-webpack-0.0.5-beta.2.tgz#9ea5f22f0615d08e76d8db341563649a726286d6" - integrity sha512-er4SI8BEy7gwq360+H0/s00IqekBuyOYgr5on3wG7/Kj9SQa8D3LJ87aj8zXTTyp+qswHtbWl5gye/ZhYJdrYQ== - dependencies: - css-loader "~0.26.1" - less-loader "~2.2.3" - style-loader "~0.13.1" - -font-awesome@^4.5.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" - integrity sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg== - -form-data@1.0.0-rc3: - version "1.0.0-rc3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.0-rc3.tgz#d35bc62e7fbc2937ae78f948aaa0d38d90607577" - integrity sha512-Z5JWXWsFDI8x73Rt/Dc7SK/EvKBzudhqIVBtEhcAhtoevCTqO3YJmctGBLzT0Ggg39xFcefkXt00t1TYLz6D0w== - dependencies: - async "^1.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.3" - -formidable@~1.0.14: - version "1.0.17" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.17.tgz#ef5491490f9433b705faa77249c99029ae348559" - integrity sha512-95MFT5qipMvUiesmuvGP1BI4hh5XWCzyTapiNJ/k8JBQda7rPy7UCWYItz2uZEdTgGNy1eInjzlL9Wx1O9fedg== - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA== - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^7.1.2, glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== - -graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== - dependencies: - ansi-regex "^2.0.0" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== - -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has@^1.0.1, has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== - -iconv-lite@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-replace-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" - integrity sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg== - -icss-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" - integrity sha512-bsVoyn/1V4R1kYYjLcWLedozAM4FClZUdjE9nIr8uWY7xs78y9DATgwz2wGU7M+7z55KenmmTkN2DVJ7bqzjAA== - dependencies: - postcss "^6.0.1" - -ieee754@^1.1.4: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== - -image-size@~0.5.0: - version "0.5.5" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" - integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== - -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-buffer@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-core-module@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== - dependencies: - has "^1.0.3" - -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - -is-svg@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" - integrity sha512-Ya1giYJUkcL/94quj0+XGcmts6cETPBW1MiFz1ReJrnDJ680F52qpAEGAEGU0nq96FRGIGPx6Yo1CyPXcOoyGw== - dependencies: - html-comment-regex "^1.1.0" - -is-what@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" - integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -jquery-datetimepicker@^2.5.21: - version "2.5.21" - resolved "https://registry.yarnpkg.com/jquery-datetimepicker/-/jquery-datetimepicker-2.5.21.tgz#00c388a78df2732fedfdb5c6529b6e84d53e0235" - integrity sha512-wDTpZ4f1PWd1XGaIIE0n6jLynlm+akBJ7/NjaB1bk2UJSS593CHJPZ3+FNEXoyvNVUeBlBC0oX6WTfCyfUhX/w== - dependencies: - jquery ">= 1.7.2" - jquery-mousewheel ">= 3.1.13" - php-date-formatter "^1.3.4" - -"jquery-mousewheel@>= 3.1.13": - version "3.1.13" - resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" - integrity sha512-GXhSjfOPyDemM005YCEHvzrEALhKDIswtxSHSR2e4K/suHVJKJxxRCGz3skPjNxjJjQa9AVSGGlYjv1M3VLIPg== - -"jquery@>= 1.7.2", jquery@>=1.10: - version "3.6.0" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" - integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw== - -js-base64@^2.1.9: - version "2.6.4" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" - integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== - -js-yaml@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" - integrity sha512-eIlkGty7HGmntbV6P/ZlAsoncFLGsNoM27lkTzS+oneY/EiNhj+geqD9ezg/ip+SW6Var0BJU2JtV0vEUZpWVQ== - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA== - -json-loader@^0.5.1, json-loader@^0.5.4: - version "0.5.7" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" - integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json3@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" - integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== - -json5@^0.5.0, json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -keen-js@^3.0.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/keen-js/-/keen-js-3.5.0.tgz#9274be9bb9ee1a92867872acb3627f5aa8147b79" - integrity sha512-lB/JZ/KfF+EL8xoUEJgGUv7adBQiQ4Q8PLI22Lzl00GqX47UmjyWnY8GETfUML5gjNxl0uqGHx2kXu0jzHHFKQ== - dependencies: - JSON2 "^0.1.0" - browserify-versionify "1.0.3" - component-emitter "^1.1.3" - domready "0.3.0" - json3 "^3.3.2" - spin.js "^2.0.1" - superagent "^1.8.3" - -klona@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== - -knockout@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/knockout/-/knockout-3.5.1.tgz#62c81e81843bea2008fd23c575edd9ca978e75cf" - integrity sha512-wRJ9I4az0QcsH7A4v4l0enUpkS++MBx0BnL/68KaLzJg7x1qmbjSlwEoCNol7KTYZ+pmtI7Eh2J0Nu6/2Z5J/Q== - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== - dependencies: - invert-kv "^1.0.0" - -less-loader@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-10.2.0.tgz#97286d8797dc3dc05b1d16b0ecec5f968bdd4e32" - integrity sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg== - dependencies: - klona "^2.0.4" - -less-loader@~2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-2.2.3.tgz#b6d8f8139c8493df09d992a93a00734b08f84528" - integrity sha512-U7lgRusyqTj1TUB6OBlmow6GigLk0n5ADuTSGblCp0nkXOk+lFq/lHTDXCHkm3WydZha2FVNZivEjCEZNFJCiw== - dependencies: - loader-utils "^0.2.5" - -less@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/less/-/less-4.1.3.tgz#175be9ddcbf9b250173e0a00b4d6920a5b770246" - integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== - dependencies: - copy-anything "^2.0.1" - parse-node-version "^1.0.1" - tslib "^2.3.0" - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - make-dir "^2.1.0" - mime "^1.4.1" - needle "^3.1.0" - source-map "~0.6.0" - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ== - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -loader-runner@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - -loader-utils@^0.2.16, loader-utils@^0.2.5: - version "0.2.17" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" - integrity sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug== - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - object-assign "^4.0.1" - -loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash@^4.17.14, lodash@^4.17.4: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^4.0.1, lru-cache@^4.1.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" - -make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -math-expression-evaluator@^1.2.14: - version "1.3.14" - resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.3.14.tgz#0ebeaccf65fea0f6f5a626f88df41814e5fcd9bf" - integrity sha512-M6AMrvq9bO8uL42KvQHPA2/SbAobA0R7gviUmPrcTcGfdwpaLitz4q2Euzx2lP9Oy88vxK3HOrsISgSwKsYS4A== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -md5@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" - integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== - dependencies: - charenc "0.0.2" - crypt "0.0.2" - is-buffer "~1.1.6" - -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - integrity sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ== - dependencies: - mimic-fn "^1.0.0" - -memory-fs@^0.4.0, memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -methods@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.3: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" - integrity sha512-sAaYXszED5ALBt665F0wMQCUXpGuZsGdopoqcHPdL39ZYdi7uHoZlhrfZfhv8WzivhBzr/oXwaj+yiK5wY8MXQ== - -mime@^1.4.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@^3.0.4, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -mississippi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" - integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^2.0.1" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ== - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -needle@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-3.1.0.tgz#3bf5cd090c28eb15644181ab6699e027bd6c53c9" - integrity sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw== - dependencies: - debug "^3.2.6" - iconv-lite "^0.6.3" - sax "^1.2.4" - -next-tick@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - -node-libs-browser@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -normalize-url@^1.4.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ== - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -os-tmpdir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== - dependencies: - error-ex "^1.2.0" - -parse-node-version@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ== - dependencies: - pify "^2.0.0" - -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -php-date-formatter@^1.3.4: - version "1.3.6" - resolved "https://registry.yarnpkg.com/php-date-formatter/-/php-date-formatter-1.3.6.tgz#6d67359da890c742005fa89d20be3ded31cc1d2a" - integrity sha512-/CKsZYmAwXeNh8KpD/CF9hcJDZNhdb2ICN8+qgqOt5sUu9liZIxZ1R284TNj5MtPt8RjG5X0xn6WSqL0kcKMBg== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - integrity sha512-c6pv3OE78mcZ92ckebVDqg0aWSoKhOTbwCV6qbCWMk546mAL9pZln0+QsN/yQ7fkucd4+yJPLrCBXNt8Ruk+Eg== - dependencies: - find-up "^1.0.0" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw== - dependencies: - find-up "^2.1.0" - -postcss-calc@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" - integrity sha512-iBcptYFq+QUh9gzP7ta2btw50o40s4uLI4UDVgd5yRAZtUDWc5APdl5yQDd2h/TyiZNbJrv0HiYhT102CMgN7Q== - dependencies: - postcss "^5.0.2" - postcss-message-helpers "^2.0.0" - reduce-css-calc "^1.2.6" - -postcss-colormin@^2.1.8: - version "2.2.2" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" - integrity sha512-XXitQe+jNNPf+vxvQXIQ1+pvdQKWKgkx8zlJNltcMEmLma1ypDRDQwlLt+6cP26fBreihNhZxohh1rcgCH2W5w== - dependencies: - colormin "^1.0.5" - postcss "^5.0.13" - postcss-value-parser "^3.2.3" - -postcss-convert-values@^2.3.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" - integrity sha512-SE7mf25D3ORUEXpu3WUqQqy0nCbMuM5BEny+ULE/FXdS/0UMA58OdzwvzuHJRpIFlk1uojt16JhaEogtP6W2oA== - dependencies: - postcss "^5.0.11" - postcss-value-parser "^3.1.2" - -postcss-discard-comments@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" - integrity sha512-yGbyBDo5FxsImE90LD8C87vgnNlweQkODMkUZlDVM/CBgLr9C5RasLGJxxh9GjVOBeG8NcCMatoqI1pXg8JNXg== - dependencies: - postcss "^5.0.14" - -postcss-discard-duplicates@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" - integrity sha512-+lk5W1uqO8qIUTET+UETgj9GWykLC3LOldr7EehmymV0Wu36kyoHimC4cILrAAYpHQ+fr4ypKcWcVNaGzm0reA== - dependencies: - postcss "^5.0.4" - -postcss-discard-empty@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" - integrity sha512-IBFoyrwk52dhF+5z/ZAbzq5Jy7Wq0aLUsOn69JNS+7YeuyHaNzJwBIYE0QlUH/p5d3L+OON72Fsexyb7OK/3og== - dependencies: - postcss "^5.0.14" - -postcss-discard-overridden@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" - integrity sha512-IyKoDL8QNObOiUc6eBw8kMxBHCfxUaERYTUe2QF8k7j/xiirayDzzkmlR6lMQjrAM1p1DDRTvWrS7Aa8lp6/uA== - dependencies: - postcss "^5.0.16" - -postcss-discard-unused@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" - integrity sha512-nCbFNfqYAbKCw9J6PSJubpN9asnrwVLkRDFc4KCwyUEdOtM5XDE/eTW3OpqHrYY1L4fZxgan7LLRAAYYBzwzrg== - dependencies: - postcss "^5.0.14" - uniqs "^2.0.0" - -postcss-filter-plugins@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" - integrity sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ== - dependencies: - postcss "^5.0.4" - -postcss-merge-idents@^2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" - integrity sha512-9DHmfCZ7/hNHhIKnNkz4CU0ejtGen5BbTRJc13Z2uHfCedeCUsK2WEQoAJRBL+phs68iWK6Qf8Jze71anuysWA== - dependencies: - has "^1.0.1" - postcss "^5.0.10" - postcss-value-parser "^3.1.1" - -postcss-merge-longhand@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" - integrity sha512-ma7YvxjdLQdifnc1HFsW/AW6fVfubGyR+X4bE3FOSdBVMY9bZjKVdklHT+odknKBB7FSCfKIHC3yHK7RUAqRPg== - dependencies: - postcss "^5.0.4" - -postcss-merge-rules@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" - integrity sha512-Wgg2FS6W3AYBl+5L9poL6ZUISi5YzL+sDCJfM7zNw/Q1qsyVQXXZ2cbVui6mu2cYJpt1hOKCGj1xA4mq/obz/Q== - dependencies: - browserslist "^1.5.2" - caniuse-api "^1.5.2" - postcss "^5.0.4" - postcss-selector-parser "^2.2.2" - vendors "^1.0.0" - -postcss-message-helpers@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" - integrity sha512-tPLZzVAiIJp46TBbpXtrUAKqedXSyW5xDEo1sikrfEfnTs+49SBZR/xDdqCiJvSSbtr615xDsaMF3RrxS2jZlA== - -postcss-minify-font-values@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" - integrity sha512-vFSPzrJhNe6/8McOLU13XIsERohBJiIFFuC1PolgajOZdRWqRgKITP/A4Z/n4GQhEmtbxmO9NDw3QLaFfE1dFQ== - dependencies: - object-assign "^4.0.1" - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-minify-gradients@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" - integrity sha512-DZhT0OE+RbVqVyGsTIKx84rU/5cury1jmwPa19bViqYPQu499ZU831yMzzsyC8EhiZVd73+h5Z9xb/DdaBpw7Q== - dependencies: - postcss "^5.0.12" - postcss-value-parser "^3.3.0" - -postcss-minify-params@^1.0.4: - version "1.2.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" - integrity sha512-hhJdMVgP8vasrHbkKAk+ab28vEmPYgyuDzRl31V3BEB3QOR3L5TTIVEWLDNnZZ3+fiTi9d6Ker8GM8S1h8p2Ow== - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.2" - postcss-value-parser "^3.0.2" - uniqs "^2.0.0" - -postcss-minify-selectors@^2.0.4: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" - integrity sha512-e13vxPBSo3ZaPne43KVgM+UETkx3Bs4/Qvm6yXI9HQpQp4nyb7HZ0gKpkF+Wn2x+/dbQ+swNpCdZSbMOT7+TIA== - dependencies: - alphanum-sort "^1.0.2" - has "^1.0.1" - postcss "^5.0.14" - postcss-selector-parser "^2.0.0" - -postcss-modules-extract-imports@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a" - integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw== - dependencies: - postcss "^6.0.1" - -postcss-modules-local-by-default@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" - integrity sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA== - dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" - -postcss-modules-scope@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" - integrity sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw== - dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" - -postcss-modules-values@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" - integrity sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA== - dependencies: - icss-replace-symbols "^1.1.0" - postcss "^6.0.1" - -postcss-normalize-charset@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" - integrity sha512-RKgjEks83l8w4yEhztOwNZ+nLSrJ+NvPNhpS+mVDzoaiRHZQVoG7NF2TP5qjwnaN9YswUhj6m1E0S0Z+WDCgEQ== - dependencies: - postcss "^5.0.5" - -postcss-normalize-url@^3.0.7: - version "3.0.8" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" - integrity sha512-WqtWG6GV2nELsQEFES0RzfL2ebVwmGl/M8VmMbshKto/UClBo+mznX8Zi4/hkThdqx7ijwv+O8HWPdpK7nH/Ig== - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^1.4.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - -postcss-ordered-values@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" - integrity sha512-5RB1IUZhkxDCfa5fx/ogp/A82mtq+r7USqS+7zt0e428HJ7+BHCxyeY39ClmkkUtxdOd3mk8gD6d9bjH2BECMg== - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.1" - -postcss-reduce-idents@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" - integrity sha512-0+Ow9e8JLtffjumJJFPqvN4qAvokVbdQPnijUDSOX8tfTwrILLP4ETvrZcXZxAtpFLh/U0c+q8oRMJLr1Kiu4w== - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-reduce-initial@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" - integrity sha512-jJFrV1vWOPCQsIVitawGesRgMgunbclERQ/IRGW7r93uHrVzNQQmHQ7znsOIjJPZ4yWMzs5A8NFhp3AkPHPbDA== - dependencies: - postcss "^5.0.4" - -postcss-reduce-transforms@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" - integrity sha512-lGgRqnSuAR5i5uUg1TA33r9UngfTadWxOyL2qx1KuPoCQzfmtaHjp9PuwX7yVyRxG3BWBzeFUaS5uV9eVgnEgQ== - dependencies: - has "^1.0.1" - postcss "^5.0.8" - postcss-value-parser "^3.0.1" - -postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" - integrity sha512-3pqyakeGhrO0BQ5+/tGTfvi5IAUAhHRayGK8WFSu06aEv2BmHoXw/Mhb+w7VY5HERIuC+QoUI7wgrCcq2hqCVA== - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-svgo@^2.1.1: - version "2.1.6" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" - integrity sha512-y5AdQdgBoF4rbpdbeWAJuxE953g/ylRfVNp6mvAi61VCN/Y25Tu9p5mh3CyI42WbTRIiwR9a1GdFtmDnNPeskQ== - dependencies: - is-svg "^2.0.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - svgo "^0.7.0" - -postcss-unique-selectors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" - integrity sha512-WZX8r1M0+IyljoJOJleg3kYm10hxNYF9scqAT7v/xeSX1IdehutOM85SNO0gP9K+bgs86XERr7Ud5u3ch4+D8g== - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - -postcss-zindex@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" - integrity sha512-uhRZ2hRgj0lorxm9cr62B01YzpUe63h0RXMXQ4gWW3oa2rpJh+FJAiEAytaFCPU/VgaBS+uW2SJ1XKyDNz1h4w== - dependencies: - has "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: - version "5.2.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" - integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== - dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.2.3" - -postcss@^6.0.1: - version "6.0.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" - integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== - dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.4.0" - -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg== - -private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0, pump@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== - -qs@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404" - integrity sha512-f5M0HQqZWkzU8GELTY8LyMrGkr3bPjKoFtTkwUEqJQbcljbeK8M7mliP9Ia2xoOI6oMerp+QPS7oYJtpGmWe/A== - -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q== - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -raven@^2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/raven/-/raven-2.6.4.tgz#458d4a380c8fbb59e0150c655625aaf60c167ea3" - integrity sha512-6PQdfC4+DQSFncowthLf+B6Hr0JpPsFBgTVYTAOq7tCmx/kR4SXbeawtPch20+3QfUcQDoJBLjWW1ybvZ4kXTw== - dependencies: - cookie "0.3.1" - md5 "^2.2.1" - stack-trace "0.0.10" - timed-out "4.0.1" - uuid "3.3.2" - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w== - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA== - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@1.0.27-1: - version "1.0.27-1" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.27-1.tgz#6b67983c20357cefd07f0165001a16d710d91078" - integrity sha512-uQE31HGhpMrqZwtDjRliOs2aC3XBi+DdkhLs+Xa0dvVD5eDiZr3+k8rKVZcyTzxosgtMw7B/twQsK3P1KTZeVg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -"readable-stream@>=1.0.33-1 <1.1.0-0": - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -reduce-component@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/reduce-component/-/reduce-component-1.0.1.tgz#e0c93542c574521bea13df0f9488ed82ab77c5da" - integrity sha512-y0wyCcdQul3hI3xHfIs0vg/jSbboQc/YTOAqaxjFG7At+XSexduuOqBVL9SmOLSwa/ldkbzVzdwuk9s2EKTAZg== - -reduce-css-calc@^1.2.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" - integrity sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA== - dependencies: - balanced-match "^0.4.2" - math-expression-evaluator "^1.2.14" - reduce-function-call "^1.0.1" - -reduce-function-call@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.3.tgz#60350f7fb252c0a67eb10fd4694d16909971300f" - integrity sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ== - dependencies: - balanced-match "^1.0.0" - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== - dependencies: - is-finite "^1.0.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== - -resolve@^1.10.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -rimraf@^2.5.4, rimraf@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg== - dependencies: - aproba "^1.1.1" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4, sax@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -schema-utils@^0.4.5: - version "0.4.7" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" - integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -"semver@2 || 3 || 4 || 5", semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -serialize-javascript@^1.4.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" - integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -signal-exit@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -simple-statistics@7.7.3: - version "7.7.3" - resolved "https://registry.yarnpkg.com/simple-statistics/-/simple-statistics-7.7.3.tgz#8b7b51edae40e397a28dbe8ae762ddd156ae43b6" - integrity sha512-ym356HUIJYLYEJASkbrYGAinlivGbBZhhgRNpTxWXVncfCGh61iUsaoSM+b84RrtGI2ZJvulTCUEwscE1s4yzw== - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg== - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg== - dependencies: - is-plain-obj "^1.0.0" - -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - -source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== - -spin.js@^2.0.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/spin.js/-/spin.js-2.3.2.tgz#6caa56d520673450fd5cfbc6971e6d0772c37a1a" - integrity sha512-ryhCvKCRa6J5Fxa7Y+fnhE2a+e05JwfW5dxO82zPd0uDM9o+qp8p74BJUurjiqCqmDsWNvGOAxfqdD317XIedg== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -ssri@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" - integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== - dependencies: - safe-buffer "^5.1.1" - -stack-trace@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-2.0.1.tgz#df62c1aa94ed2f114e1d0f21fd1d50482b79a60e" - integrity sha512-2h8q2CP3EeOhDJ+jd932PRMpa3/pOJFGoF22J1U/DNbEK2gSW2DqeF46VjCXsSQXhC+k/l8/gaaRBQKL6hUPfQ== - dependencies: - ansi-regex "^1.0.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== - dependencies: - ansi-regex "^3.0.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - -style-loader@^0.23.1, style-loader@~0.13.1: - version "0.23.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" - integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== - dependencies: - loader-utils "^1.1.0" - schema-utils "^1.0.0" - -superagent@^1.8.3: - version "1.8.5" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-1.8.5.tgz#1c0ddc3af30e80eb84ebc05cb2122da8fe940b55" - integrity sha512-4h4R6fISQXvgjIqZ8DjONYy3y2XPxgZO0LgHsBI6tDAEhzJLpWuK+thM60SmUiERJOEJzmxlIGx/GP6+azky/A== - dependencies: - component-emitter "~1.2.0" - cookiejar "2.0.6" - debug "2" - extend "3.0.0" - form-data "1.0.0-rc3" - formidable "~1.0.14" - methods "~1.1.1" - mime "1.3.4" - qs "2.3.3" - readable-stream "1.0.27-1" - reduce-component "1.0.1" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== - -supports-color@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== - dependencies: - has-flag "^1.0.0" - -supports-color@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - integrity sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw== - dependencies: - has-flag "^2.0.0" - -supports-color@^5.3.0, supports-color@^5.4.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svgo@^0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" - integrity sha512-jT/g9FFMoe9lu2IT6HtAxTA7RR2XOrmcrmCtGnyB/+GQnV6ZjNn+KOHZbZ35yL81+1F/aB6OeEsJztzBQ2EEwA== - dependencies: - coa "~1.0.1" - colors "~1.1.2" - csso "~2.3.1" - js-yaml "~3.7.0" - mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" - -tapable@^0.2.7: - version "0.2.9" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8" - integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A== - -through2@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.3.tgz#795292fde9f254c2a368b38f9cc5d1bd4663afb6" - integrity sha512-6UXIsO0fTTYMgxeQ9pisMOIqF/uL6Ebva+4HxihtLLR2gscWEu+OTMwar/0TYZaeDSNS1msIJAXJRis+GojL8g== - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -timed-out@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== - -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og== - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw== - -tslib@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f" - integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ== - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - -uglify-es@^3.3.4: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== - dependencies: - commander "~2.13.0" - source-map "~0.6.1" - -uglifyjs-webpack-plugin@1.3.0, uglifyjs-webpack-plugin@^0.4.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" - integrity sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw== - dependencies: - cacache "^10.0.4" - find-cache-dir "^1.0.0" - schema-utils "^0.4.5" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - uglify-es "^3.3.4" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ== - -unique-filename@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urijs@^1.19.7: - version "1.19.11" - resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc" - integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ== - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -uuid@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vendors@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" - integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -watchpack@^1.4.0, watchpack@^2.3.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -webpack-bundle-tracker@0.0.9: - version "0.0.9" - resolved "https://registry.yarnpkg.com/webpack-bundle-tracker/-/webpack-bundle-tracker-0.0.9.tgz#fd6ba1e65478f5cd3414e6f2ef3d4e1be0e3cd9d" - integrity sha512-Dnpn1zUrLjjKKsKbW4/F+FbR/tm254eEaiszVPAvF9Rnk+qVvmNMz5yH1QAW+cAHOg/bEfJwI8WghyOnh2e7zw== - dependencies: - mkdirp "^0.5.1" - strip-ansi "^2.0.1" - -webpack-sources@^1.0.1, webpack-sources@^1.1.0: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz#3f9e34360370602fcf639e97939db486f4ec0d74" - integrity sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ== - dependencies: - acorn "^5.0.0" - acorn-dynamic-import "^2.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - async "^2.1.2" - enhanced-resolve "^3.4.0" - escope "^3.6.0" - interpret "^1.0.0" - json-loader "^0.5.4" - json5 "^0.5.1" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - mkdirp "~0.5.0" - node-libs-browser "^2.0.0" - source-map "^0.5.3" - supports-color "^4.2.1" - tapable "^0.2.7" - uglifyjs-webpack-plugin "^0.4.6" - watchpack "^1.4.0" - webpack-sources "^1.0.1" - yargs "^8.0.2" - -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" - integrity sha512-mmIPAft2vTgEILgPeZFqE/wWh24SEsR/k+N9fJ3Jxrz44iDFy9aemCxdksfURSHYFCLmvs/d/7Iso5XjPpNfrA== - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -worker-farm@^1.5.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" - integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== - -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - integrity sha512-WhzC+xgstid9MbVUktco/bf+KJG+Uu6vMX0LN1sLJvwmbCQVxb4D8LzogobonKycNasCZLdOzTAk1SK7+K7swg== - dependencies: - camelcase "^4.1.0" - -yargs@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" - integrity sha512-3RiZrpLpjrzIAKgGdPktBcMP/eG5bDFlkI+PHle1qwzyVXyDQL+pD/eZaMoOOO0Y7LLBfjpucObuUm/icvbpKQ== - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@gar/promise-retry@npm:^1.0.0": + version: 1.0.3 + resolution: "@gar/promise-retry@npm:1.0.3" + checksum: 10c0/885b02c8b0d75b2d215da25f3b639158c4fbe8fefe0d79163304534b9a6d0710db4b7699f7cd3cc1a730792bff04cbe19f4850a62d3e105a663eaeec88f38332 + languageName: node + linkType: hard + +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/agent@npm:4.0.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^11.2.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10c0/f7b5ce0f3dd42c3f8c6546e8433573d8049f67ef11ec22aa4704bc41483122f68bf97752e06302c455ead667af5cb753e6a09bff06632bc465c1cfd4c4b75a53 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^5.0.0": + version: 5.0.0 + resolution: "@npmcli/fs@npm:5.0.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/26e376d780f60ff16e874a0ac9bc3399186846baae0b6e1352286385ac134d900cc5dafaded77f38d77f86898fc923ae1cee9d7399f0275b1aa24878915d722b + languageName: node + linkType: hard + +"@npmcli/redact@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/redact@npm:4.0.0" + checksum: 10c0/a1e9ba9c70a6b40e175bda2c3dd8cfdaf096e6b7f7a132c855c083c8dfe545c3237cd56702e2e6627a580b1d63373599d49a1192c4078a85bf47bbde824df31c + languageName: node + linkType: hard + +"JSON2@npm:^0.1.0": + version: 0.1.0 + resolution: "JSON2@npm:0.1.0" + checksum: 10c0/7c8b82a50ff93fd28bf545eaad64c9237fea6df75dab779d2845fdd165806b1534bc420614807ec3f3d6c8697eb545b967daaea7fe1bd69f4df3211fa7635040 + languageName: node + linkType: hard + +"OSF_Admin@workspace:.": + version: 0.0.0-use.local + resolution: "OSF_Admin@workspace:." + dependencies: + babel-core: "npm:^6.0.0" + babel-loader: "npm:^6.4.1" + bootstrap-colorpicker: "npm:^2.5.2" + bootstrap-tagsinput: "npm:^0.7.1" + bower: "npm:^1.3.12" + font-awesome: "npm:^4.5.0" + font-awesome-webpack: "npm:0.0.5-beta.2" + jquery-datetimepicker: "npm:^2.5.21" + json-loader: "npm:^0.5.1" + keen-js: "npm:^3.0.0" + knockout: "npm:3.5.1" + less: "npm:^4.1.2" + less-loader: "npm:^10.2.0" + raven: "npm:^2.6.4" + simple-statistics: "npm:7.7.3" + urijs: "npm:^1.19.7" + webpack: "npm:3.12.0" + webpack-bundle-tracker: "npm:0.0.9" + languageName: unknown + linkType: soft + +"abbrev@npm:^4.0.0": + version: 4.0.0 + resolution: "abbrev@npm:4.0.0" + checksum: 10c0/b4cc16935235e80702fc90192e349e32f8ef0ed151ef506aa78c81a7c455ec18375c4125414b99f84b2e055199d66383e787675f0bcd87da7a4dbd59f9eac1d5 + languageName: node + linkType: hard + +"acorn-dynamic-import@npm:^2.0.0": + version: 2.0.2 + resolution: "acorn-dynamic-import@npm:2.0.2" + dependencies: + acorn: "npm:^4.0.3" + checksum: 10c0/5dcac220ae8ddc8f8439402691c6da21f4e44f3a91b5645884cd2a5f03c8e39a40006a189de9ccd50fdfcdeda6c52724db45cd2100e56e9e9656d7b19e2bfd22 + languageName: node + linkType: hard + +"acorn@npm:^4.0.3": + version: 4.0.13 + resolution: "acorn@npm:4.0.13" + bin: + acorn: ./bin/acorn + checksum: 10c0/ed73e42711474f80d7f2f94d68109e83a40d48c9596f0bcfd1a4c64e086636495259432421357524d04bfe317eed6de5b6202d2ab30f1b1c26bca12684979aa5 + languageName: node + linkType: hard + +"acorn@npm:^5.0.0": + version: 5.7.4 + resolution: "acorn@npm:5.7.4" + bin: + acorn: bin/acorn + checksum: 10c0/b29e61d48fa31ae69d38d74bb213b77b32de6317f125890a6cb76b44d173adccbcd3a07fc9a86acdfe8ab0a80f42b5ec6290df8b7944e0506504ac3b716232bd + languageName: node + linkType: hard + +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 10c0/c2c9ab7599692d594b6a161559ada307b7a624fa4c7b03e3afdb5a5e31cd0e53269115b620fcab024c5ac6a6f37fa5eb2e004f076ad30f5f7e6b8b671f7b35fe + languageName: node + linkType: hard + +"ajv-errors@npm:^1.0.0": + version: 1.0.1 + resolution: "ajv-errors@npm:1.0.1" + peerDependencies: + ajv: ">=5.0.0" + checksum: 10c0/de2d6e8100c8707ea063ee4785d53adf599b457c0d4f72c3592244d67ad16448a6d35f7ce45f12bdd2819939447c876e8ef2f1c0800896d7f2aa25c3838acdf1 + languageName: node + linkType: hard + +"ajv-keywords@npm:^3.1.0": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 + languageName: node + linkType: hard + +"ajv@npm:^6.1.0": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + +"alphanum-sort@npm:^1.0.1, alphanum-sort@npm:^1.0.2": + version: 1.0.2 + resolution: "alphanum-sort@npm:1.0.2" + checksum: 10c0/2944e7ae4d36328a2df071017c01cd1d06ef6a5d87c8fbbeffd9075d42f4da48051bde79a5e3d863b98f37778c76e8eebd4353c1e7bbba2480382096953ec2b8 + languageName: node + linkType: hard + +"ansi-regex@npm:^1.0.0": + version: 1.1.1 + resolution: "ansi-regex@npm:1.1.1" + checksum: 10c0/182450558e72f6d285fad08eede78f8b4b57d64e5b63c1ef0b1c2274f57daccb5b1c73900e7ee5306c97916a5d9c20e3dee3bdbd4d816d368320151cd17b5a4a + languageName: node + linkType: hard + +"ansi-regex@npm:^2.0.0": + version: 2.1.1 + resolution: "ansi-regex@npm:2.1.1" + checksum: 10c0/78cebaf50bce2cb96341a7230adf28d804611da3ce6bf338efa7b72f06cc6ff648e29f80cd95e582617ba58d5fdbec38abfeed3500a98bce8381a9daec7c548b + languageName: node + linkType: hard + +"ansi-regex@npm:^3.0.0": + version: 3.0.1 + resolution: "ansi-regex@npm:3.0.1" + checksum: 10c0/d108a7498b8568caf4a46eea4f1784ab4e0dfb2e3f3938c697dee21443d622d765c958f2b7e2b9f6b9e55e2e2af0584eaa9915d51782b89a841c28e744e7a167 + languageName: node + linkType: hard + +"ansi-styles@npm:^2.2.1": + version: 2.2.1 + resolution: "ansi-styles@npm:2.2.1" + checksum: 10c0/7c68aed4f1857389e7a12f85537ea5b40d832656babbf511cc7ecd9efc52889b9c3e5653a71a6aade783c3c5e0aa223ad4ff8e83c27ac8a666514e6c79068cab + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.0" + checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b + languageName: node + linkType: hard + +"aproba@npm:^1.1.1": + version: 1.2.0 + resolution: "aproba@npm:1.2.0" + checksum: 10c0/2d34f008c9edfa991f42fe4b667d541d38a474a39ae0e24805350486d76744cd91ee45313283c1d39a055b14026dd0fc4d0cbfc13f210855d59d7e8b5a61dc51 + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + +"asn1.js@npm:^5.2.0": + version: 5.4.1 + resolution: "asn1.js@npm:5.4.1" + dependencies: + bn.js: "npm:^4.0.0" + inherits: "npm:^2.0.1" + minimalistic-assert: "npm:^1.0.0" + safer-buffer: "npm:^2.1.0" + checksum: 10c0/b577232fa6069cc52bb128e564002c62b2b1fe47f7137bdcd709c0b8495aa79cee0f8cc458a831b2d8675900eea0d05781b006be5e1aa4f0ae3577a73ec20324 + languageName: node + linkType: hard + +"assert@npm:^1.1.1": + version: 1.5.0 + resolution: "assert@npm:1.5.0" + dependencies: + object-assign: "npm:^4.1.1" + util: "npm:0.10.3" + checksum: 10c0/188da37d63be479a3b14657c01080db90cdf7fa004e346af916cf8beebcaffb11359c596d0c9c3cd8174c9125a6225796ef1ce533487edc97f8ce3b18c1ab590 + languageName: node + linkType: hard + +"async@npm:^1.4.0": + version: 1.5.2 + resolution: "async@npm:1.5.2" + checksum: 10c0/9ee84592c393aad1047d1223004317ecc65a9a3f76101e0f4614a0818eac962e666510353400a3c9ea158df540579a293f486f3578e918c5e90a0f5ed52e8aea + languageName: node + linkType: hard + +"async@npm:^2.1.2": + version: 2.6.4 + resolution: "async@npm:2.6.4" + dependencies: + lodash: "npm:^4.17.14" + checksum: 10c0/0ebb3273ef96513389520adc88e0d3c45e523d03653cc9b66f5c46f4239444294899bfd13d2b569e7dbfde7da2235c35cf5fd3ece9524f935d41bbe4efccdad0 + languageName: node + linkType: hard + +"autoprefixer@npm:^6.3.1": + version: 6.7.7 + resolution: "autoprefixer@npm:6.7.7" + dependencies: + browserslist: "npm:^1.7.6" + caniuse-db: "npm:^1.0.30000634" + normalize-range: "npm:^0.1.2" + num2fraction: "npm:^1.2.2" + postcss: "npm:^5.2.16" + postcss-value-parser: "npm:^3.2.3" + checksum: 10c0/bdcf8e53eacef1feb54940bbe33fcb67e12eb07d5572d5f0fbadb638b84be15ca91b3a343763962a2ce6ed12ba611e039c62e871d12e29b956b8f2b189c263ae + languageName: node + linkType: hard + +"babel-code-frame@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-code-frame@npm:6.26.0" + dependencies: + chalk: "npm:^1.1.3" + esutils: "npm:^2.0.2" + js-tokens: "npm:^3.0.2" + checksum: 10c0/7fecc128e87578cf1b96e78d2b25e0b260e202bdbbfcefa2eac23b7f8b7b2f7bc9276a14599cde14403cc798cc2a38e428e2cab50b77658ab49228b09ae92473 + languageName: node + linkType: hard + +"babel-core@npm:^6.0.0, babel-core@npm:^6.26.0": + version: 6.26.3 + resolution: "babel-core@npm:6.26.3" + dependencies: + babel-code-frame: "npm:^6.26.0" + babel-generator: "npm:^6.26.0" + babel-helpers: "npm:^6.24.1" + babel-messages: "npm:^6.23.0" + babel-register: "npm:^6.26.0" + babel-runtime: "npm:^6.26.0" + babel-template: "npm:^6.26.0" + babel-traverse: "npm:^6.26.0" + babel-types: "npm:^6.26.0" + babylon: "npm:^6.18.0" + convert-source-map: "npm:^1.5.1" + debug: "npm:^2.6.9" + json5: "npm:^0.5.1" + lodash: "npm:^4.17.4" + minimatch: "npm:^3.0.4" + path-is-absolute: "npm:^1.0.1" + private: "npm:^0.1.8" + slash: "npm:^1.0.0" + source-map: "npm:^0.5.7" + checksum: 10c0/10292649779f8c33d1908f5671c92ca9df036c9e1b9f35f97e7f62c9da9e3a146ee069f94fc401283ce129ba980f34a30339f137c512f3e62ddd354653b2da0e + languageName: node + linkType: hard + +"babel-generator@npm:^6.26.0": + version: 6.26.1 + resolution: "babel-generator@npm:6.26.1" + dependencies: + babel-messages: "npm:^6.23.0" + babel-runtime: "npm:^6.26.0" + babel-types: "npm:^6.26.0" + detect-indent: "npm:^4.0.0" + jsesc: "npm:^1.3.0" + lodash: "npm:^4.17.4" + source-map: "npm:^0.5.7" + trim-right: "npm:^1.0.1" + checksum: 10c0/d5f9d20c6f7d8644dc41ee57d48c98a78d24d5b74dc305cc518d6e0872d4fa73c5fd8d47ec00e3515858eaf3c3e512a703cdbc184ff0061af5979bc206618555 + languageName: node + linkType: hard + +"babel-helpers@npm:^6.24.1": + version: 6.24.1 + resolution: "babel-helpers@npm:6.24.1" + dependencies: + babel-runtime: "npm:^6.22.0" + babel-template: "npm:^6.24.1" + checksum: 10c0/bbd082e42adaa9c584242515e8c5b1e861108e03ed9517f0b600189e1c1041376ab6a15c71265a2cc095c5af4bd15cfc97158e30ce95a81cbfcea1bfd81ce3e6 + languageName: node + linkType: hard + +"babel-loader@npm:^6.4.1": + version: 6.4.1 + resolution: "babel-loader@npm:6.4.1" + dependencies: + find-cache-dir: "npm:^0.1.1" + loader-utils: "npm:^0.2.16" + mkdirp: "npm:^0.5.1" + object-assign: "npm:^4.0.1" + peerDependencies: + babel-core: ^6.0.0 + webpack: 1 || 2 || ^2.1.0-beta || ^2.2.0-rc + checksum: 10c0/6f7395e9433eddfcec39b6ad452b21d4c68798a980e62906e3b2b11926e2c49b949d9ffe97a2ef88cd6843f89ba6110f5634a3b9fc27566d6505dc9496f0e4a5 + languageName: node + linkType: hard + +"babel-messages@npm:^6.23.0": + version: 6.23.0 + resolution: "babel-messages@npm:6.23.0" + dependencies: + babel-runtime: "npm:^6.22.0" + checksum: 10c0/d4fd6414ee5bb1aa0dad6d8d2c4ffaa66331ec5a507959e11f56b19a683566e2c1e7a4d0b16cfef58ea4cc07db8acf5ff3dc8b25c585407cff2e09ac60553401 + languageName: node + linkType: hard + +"babel-register@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-register@npm:6.26.0" + dependencies: + babel-core: "npm:^6.26.0" + babel-runtime: "npm:^6.26.0" + core-js: "npm:^2.5.0" + home-or-tmp: "npm:^2.0.0" + lodash: "npm:^4.17.4" + mkdirp: "npm:^0.5.1" + source-map-support: "npm:^0.4.15" + checksum: 10c0/4ffbc1bfa60a817fb306c98d1a6d10852b0130a614dae3a91e45f391dbebdc95f428d95b489943d85724e046527d2aac3bafb74d3c24f62143492b5f606e2e04 + languageName: node + linkType: hard + +"babel-runtime@npm:^6.22.0, babel-runtime@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-runtime@npm:6.26.0" + dependencies: + core-js: "npm:^2.4.0" + regenerator-runtime: "npm:^0.11.0" + checksum: 10c0/caa752004936b1463765ed3199c52f6a55d0613b9bed108743d6f13ca532b821d4ea9decc4be1b583193164462b1e3e7eefdfa36b15c72e7daac58dd72c1772f + languageName: node + linkType: hard + +"babel-template@npm:^6.24.1, babel-template@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-template@npm:6.26.0" + dependencies: + babel-runtime: "npm:^6.26.0" + babel-traverse: "npm:^6.26.0" + babel-types: "npm:^6.26.0" + babylon: "npm:^6.18.0" + lodash: "npm:^4.17.4" + checksum: 10c0/67bc875f19d289dabb1830a1cde93d7f1e187e4599dac9b1d16392fd47f1d12b53fea902dacf7be360acd09807d440faafe0f7907758c13275b1a14d100b68e4 + languageName: node + linkType: hard + +"babel-traverse@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-traverse@npm:6.26.0" + dependencies: + babel-code-frame: "npm:^6.26.0" + babel-messages: "npm:^6.23.0" + babel-runtime: "npm:^6.26.0" + babel-types: "npm:^6.26.0" + babylon: "npm:^6.18.0" + debug: "npm:^2.6.8" + globals: "npm:^9.18.0" + invariant: "npm:^2.2.2" + lodash: "npm:^4.17.4" + checksum: 10c0/dca71b23d07e3c00833c3222d7998202e687105f461048107afeb2b4a7aa2507efab1bd5a6e3e724724ebb9b1e0b14f0113621e1d8c25b4ffdb829392b54b8de + languageName: node + linkType: hard + +"babel-types@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-types@npm:6.26.0" + dependencies: + babel-runtime: "npm:^6.26.0" + esutils: "npm:^2.0.2" + lodash: "npm:^4.17.4" + to-fast-properties: "npm:^1.0.3" + checksum: 10c0/cabe371de1b32c4bbb1fd4ed0fe8a8726d42e5ad7d5cefb83cdae6de0f0a152dce591e4026719743fdf3aa45f84fea2c8851fb822fbe29b0c78a1f0094b67418 + languageName: node + linkType: hard + +"babylon@npm:^6.18.0": + version: 6.18.0 + resolution: "babylon@npm:6.18.0" + bin: + babylon: ./bin/babylon.js + checksum: 10c0/9b1bf946e16782deadb1f5414c1269efa6044eb1e97a3de2051f09a3f2a54e97be3542d4242b28d23de0ef67816f519d38ce1ec3ddb7be306131c39a60e5a667 + languageName: node + linkType: hard + +"balanced-match@npm:^0.4.2": + version: 0.4.2 + resolution: "balanced-match@npm:0.4.2" + checksum: 10c0/cd4e15add0f4ef14c4fe960d9f4a343052d7c0f7939e1b5e54c8f24417a501bde1f17e191b676daebd16ae316955c918f93b8ed0414bb03d038dd0159c9998e5 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"balanced-match@npm:^4.0.2": + version: 4.0.4 + resolution: "balanced-match@npm:4.0.4" + checksum: 10c0/07e86102a3eb2ee2a6a1a89164f29d0dbaebd28f2ca3f5ca786f36b8b23d9e417eb3be45a4acf754f837be5ac0a2317de90d3fcb7f4f4dc95720a1f36b26a17b + languageName: node + linkType: hard + +"base64-js@npm:^1.0.2": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + +"big.js@npm:^3.1.3": + version: 3.2.0 + resolution: "big.js@npm:3.2.0" + checksum: 10c0/de0b8e275171060a37846b521e8ebfe077c650532306c2470474da6720feb04351cc8588ef26088756b224923782946ae67e817b90122cc85692bbda7ccd2d0d + languageName: node + linkType: hard + +"big.js@npm:^5.2.2": + version: 5.2.2 + resolution: "big.js@npm:5.2.2" + checksum: 10c0/230520f1ff920b2d2ce3e372d77a33faa4fa60d802fe01ca4ffbc321ee06023fe9a741ac02793ee778040a16b7e497f7d60c504d1c402b8fdab6f03bb785a25f + languageName: node + linkType: hard + +"bluebird@npm:^3.5.1": + version: 3.7.2 + resolution: "bluebird@npm:3.7.2" + checksum: 10c0/680de03adc54ff925eaa6c7bb9a47a0690e8b5de60f4792604aae8ed618c65e6b63a7893b57ca924beaf53eee69c5af4f8314148c08124c550fe1df1add897d2 + languageName: node + linkType: hard + +"bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.9": + version: 4.12.0 + resolution: "bn.js@npm:4.12.0" + checksum: 10c0/9736aaa317421b6b3ed038ff3d4491935a01419ac2d83ddcfebc5717385295fcfcf0c57311d90fe49926d0abbd7a9dbefdd8861e6129939177f7e67ebc645b21 + languageName: node + linkType: hard + +"bn.js@npm:^5.0.0, bn.js@npm:^5.1.1": + version: 5.2.1 + resolution: "bn.js@npm:5.2.1" + checksum: 10c0/bed3d8bd34ec89dbcf9f20f88bd7d4a49c160fda3b561c7bb227501f974d3e435a48fb9b61bc3de304acab9215a3bda0803f7017ffb4d0016a0c3a740a283caa + languageName: node + linkType: hard + +"bootstrap-colorpicker@npm:^2.5.2": + version: 2.5.3 + resolution: "bootstrap-colorpicker@npm:2.5.3" + dependencies: + jquery: "npm:>=1.10" + checksum: 10c0/c150d2b0be75e859cd20957bcd0f75e0d0881553274ccd23783db9f9a844b3fd9ddf048bd831b0a59cf6910c1c2c861198718ada2605a5dd3e3a6076fc77e9ec + languageName: node + linkType: hard + +"bootstrap-tagsinput@npm:^0.7.1": + version: 0.7.1 + resolution: "bootstrap-tagsinput@npm:0.7.1" + checksum: 10c0/3e50b7146c8ea9a704fefe742829099a4bc4f27db723177838f1a796024a4b3a6c03dd269a12369e2e8a4d847284e1f2c058c3398fddbbe80da526946e0ac7f1 + languageName: node + linkType: hard + +"bower@npm:^1.3.12": + version: 1.8.14 + resolution: "bower@npm:1.8.14" + bin: + bower: bin/bower + checksum: 10c0/dbf71f95eaf34785f98793b8dfa2c1eba0b18b9e94b5c052f2019cfbe6135c041f106901c3e96fdc1d83b486472a8da8aea245b1490fe0ea4211f13ea8dd3463 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"brace-expansion@npm:^5.0.2": + version: 5.0.4 + resolution: "brace-expansion@npm:5.0.4" + dependencies: + balanced-match: "npm:^4.0.2" + checksum: 10c0/359cbcfa80b2eb914ca1f3440e92313fbfe7919ee6b274c35db55bec555aded69dac5ee78f102cec90c35f98c20fa43d10936d0cd9978158823c249257e1643a + languageName: node + linkType: hard + +"brorand@npm:^1.0.1, brorand@npm:^1.1.0": + version: 1.1.0 + resolution: "brorand@npm:1.1.0" + checksum: 10c0/6f366d7c4990f82c366e3878492ba9a372a73163c09871e80d82fb4ae0d23f9f8924cb8a662330308206e6b3b76ba1d528b4601c9ef73c2166b440b2ea3b7571 + languageName: node + linkType: hard + +"browserify-aes@npm:^1.0.0, browserify-aes@npm:^1.0.4": + version: 1.2.0 + resolution: "browserify-aes@npm:1.2.0" + dependencies: + buffer-xor: "npm:^1.0.3" + cipher-base: "npm:^1.0.0" + create-hash: "npm:^1.1.0" + evp_bytestokey: "npm:^1.0.3" + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + checksum: 10c0/967f2ae60d610b7b252a4cbb55a7a3331c78293c94b4dd9c264d384ca93354c089b3af9c0dd023534efdc74ffbc82510f7ad4399cf82bc37bc07052eea485f18 + languageName: node + linkType: hard + +"browserify-cipher@npm:^1.0.0": + version: 1.0.1 + resolution: "browserify-cipher@npm:1.0.1" + dependencies: + browserify-aes: "npm:^1.0.4" + browserify-des: "npm:^1.0.0" + evp_bytestokey: "npm:^1.0.0" + checksum: 10c0/aa256dcb42bc53a67168bbc94ab85d243b0a3b56109dee3b51230b7d010d9b78985ffc1fb36e145c6e4db151f888076c1cfc207baf1525d3e375cbe8187fe27d + languageName: node + linkType: hard + +"browserify-des@npm:^1.0.0": + version: 1.0.2 + resolution: "browserify-des@npm:1.0.2" + dependencies: + cipher-base: "npm:^1.0.1" + des.js: "npm:^1.0.0" + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: 10c0/943eb5d4045eff80a6cde5be4e5fbb1f2d5002126b5a4789c3c1aae3cdddb1eb92b00fb92277f512288e5c6af330730b1dbabcf7ce0923e749e151fcee5a074d + languageName: node + linkType: hard + +"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.0.1": + version: 4.1.0 + resolution: "browserify-rsa@npm:4.1.0" + dependencies: + bn.js: "npm:^5.0.0" + randombytes: "npm:^2.0.1" + checksum: 10c0/fb2b5a8279d8a567a28d8ee03fb62e448428a906bab5c3dc9e9c3253ace551b5ea271db15e566ac78f1b1d71b243559031446604168b9235c351a32cae99d02a + languageName: node + linkType: hard + +"browserify-sign@npm:^4.0.0": + version: 4.2.1 + resolution: "browserify-sign@npm:4.2.1" + dependencies: + bn.js: "npm:^5.1.1" + browserify-rsa: "npm:^4.0.1" + create-hash: "npm:^1.2.0" + create-hmac: "npm:^1.1.7" + elliptic: "npm:^6.5.3" + inherits: "npm:^2.0.4" + parse-asn1: "npm:^5.1.5" + readable-stream: "npm:^3.6.0" + safe-buffer: "npm:^5.2.0" + checksum: 10c0/8f00a370e3e97060977dc58e51251d3ca398ee73523994a44430321e8de2c7d85395362d59014b2b07efe4190f369baee2ff28eb8f405ff4660b776651cf052d + languageName: node + linkType: hard + +"browserify-versionify@npm:1.0.3": + version: 1.0.3 + resolution: "browserify-versionify@npm:1.0.3" + dependencies: + find-root: "npm:^0.1.1" + through2: "npm:0.6.3" + checksum: 10c0/ffe542d32e2536bcc735d382f3f8b9ef0870aa730c5330ff33fe48e182cb4a2b8d7afe6718b2dbefa02a0edbc0293f7d4e34c2b889371d4a08e6c8f28c7d15af + languageName: node + linkType: hard + +"browserify-zlib@npm:^0.2.0": + version: 0.2.0 + resolution: "browserify-zlib@npm:0.2.0" + dependencies: + pako: "npm:~1.0.5" + checksum: 10c0/9ab10b6dc732c6c5ec8ebcbe5cb7fe1467f97402c9b2140113f47b5f187b9438f93a8e065d8baf8b929323c18324fbf1105af479ee86d9d36cab7d7ef3424ad9 + languageName: node + linkType: hard + +"browserslist@npm:^1.3.6, browserslist@npm:^1.5.2, browserslist@npm:^1.7.6": + version: 1.7.7 + resolution: "browserslist@npm:1.7.7" + dependencies: + caniuse-db: "npm:^1.0.30000639" + electron-to-chromium: "npm:^1.2.7" + bin: + browserslist: ./cli.js + checksum: 10c0/1caae2f00800711b3c18a834b84ab3109b955836f23e00a7eb0227e54c22a101b95a9606c1347a04ec882524a724ba57691f856a7aba3fde6dd197b867b8cd41 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 + languageName: node + linkType: hard + +"buffer-xor@npm:^1.0.3": + version: 1.0.3 + resolution: "buffer-xor@npm:1.0.3" + checksum: 10c0/fd269d0e0bf71ecac3146187cfc79edc9dbb054e2ee69b4d97dfb857c6d997c33de391696d04bdd669272751fa48e7872a22f3a6c7b07d6c0bc31dbe02a4075c + languageName: node + linkType: hard + +"buffer@npm:^4.3.0": + version: 4.9.2 + resolution: "buffer@npm:4.9.2" + dependencies: + base64-js: "npm:^1.0.2" + ieee754: "npm:^1.1.4" + isarray: "npm:^1.0.0" + checksum: 10c0/dc443d7e7caab23816b58aacdde710b72f525ad6eecd7d738fcaa29f6d6c12e8d9c13fed7219fd502be51ecf0615f5c077d4bdc6f9308dde2e53f8e5393c5b21 + languageName: node + linkType: hard + +"builtin-status-codes@npm:^3.0.0": + version: 3.0.0 + resolution: "builtin-status-codes@npm:3.0.0" + checksum: 10c0/c37bbba11a34c4431e56bd681b175512e99147defbe2358318d8152b3a01df7bf25e0305873947e5b350073d5ef41a364a22b37e48f1fb6d2fe6d5286a0f348c + languageName: node + linkType: hard + +"cacache@npm:^10.0.4": + version: 10.0.4 + resolution: "cacache@npm:10.0.4" + dependencies: + bluebird: "npm:^3.5.1" + chownr: "npm:^1.0.1" + glob: "npm:^7.1.2" + graceful-fs: "npm:^4.1.11" + lru-cache: "npm:^4.1.1" + mississippi: "npm:^2.0.0" + mkdirp: "npm:^0.5.1" + move-concurrently: "npm:^1.0.1" + promise-inflight: "npm:^1.0.1" + rimraf: "npm:^2.6.2" + ssri: "npm:^5.2.4" + unique-filename: "npm:^1.1.0" + y18n: "npm:^4.0.0" + checksum: 10c0/4c82d037ecc0ef87f58f96ecd3662bdb24aaedd18fa96d749363bc20dee3ac9f623e2c41e09bf894a3f62de1612a8cea8ddae22563a91ce2ef5cb69fe4cf54dd + languageName: node + linkType: hard + +"cacache@npm:^20.0.1": + version: 20.0.4 + resolution: "cacache@npm:20.0.4" + dependencies: + "@npmcli/fs": "npm:^5.0.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^13.0.0" + lru-cache: "npm:^11.1.0" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^7.0.2" + ssri: "npm:^13.0.0" + checksum: 10c0/539bf4020e44ba9ca5afc2ec435623ed7e0dd80c020097677e6b4a0545df5cc9d20b473212d01209c8b4aea43c0d095af0bb6da97bcb991642ea6fac0d7c462b + languageName: node + linkType: hard + +"camelcase@npm:^4.1.0": + version: 4.1.0 + resolution: "camelcase@npm:4.1.0" + checksum: 10c0/54c0b6a85b54fb4e96a9d834a9d0d8f760fd608ab6752a6789042b5e1c38d3dd60f878d2c590d005046445d32d77f6e05e568a91fe8db3e282da0a1560d83058 + languageName: node + linkType: hard + +"caniuse-api@npm:^1.5.2": + version: 1.6.1 + resolution: "caniuse-api@npm:1.6.1" + dependencies: + browserslist: "npm:^1.3.6" + caniuse-db: "npm:^1.0.30000529" + lodash.memoize: "npm:^4.1.2" + lodash.uniq: "npm:^4.5.0" + checksum: 10c0/0769ffb827dcc9d7f6fb1d9616d6ac9dcb0a271cfacd3b1026459f0c5052491ef5a458bdaca12c2204b65bf65aa0c43b880b9bfbe497a0469e319cb48f5da4fb + languageName: node + linkType: hard + +"caniuse-db@npm:^1.0.30000529, caniuse-db@npm:^1.0.30000634, caniuse-db@npm:^1.0.30000639": + version: 1.0.30001359 + resolution: "caniuse-db@npm:1.0.30001359" + checksum: 10c0/8e079ed42d1094b3fd47816947bb1dea3f8efa3dc6cdf7a53482c504c9d8899ab068cb2c922427ada5e00132aeaddde8dff071785399315e32d3173e8c34bc64 + languageName: node + linkType: hard + +"chalk@npm:^1.1.3": + version: 1.1.3 + resolution: "chalk@npm:1.1.3" + dependencies: + ansi-styles: "npm:^2.2.1" + escape-string-regexp: "npm:^1.0.2" + has-ansi: "npm:^2.0.0" + strip-ansi: "npm:^3.0.0" + supports-color: "npm:^2.0.0" + checksum: 10c0/28c3e399ec286bb3a7111fd4225ebedb0d7b813aef38a37bca7c498d032459c265ef43404201d5fbb8d888d29090899c95335b4c0cda13e8b126ff15c541cef8 + languageName: node + linkType: hard + +"chalk@npm:^2.4.1": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: "npm:^3.2.1" + escape-string-regexp: "npm:^1.0.5" + supports-color: "npm:^5.3.0" + checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 + languageName: node + linkType: hard + +"charenc@npm:0.0.2": + version: 0.0.2 + resolution: "charenc@npm:0.0.2" + checksum: 10c0/a45ec39363a16799d0f9365c8dd0c78e711415113c6f14787a22462ef451f5013efae8a28f1c058f81fc01f2a6a16955f7a5fd0cd56247ce94a45349c89877d8 + languageName: node + linkType: hard + +"chownr@npm:^1.0.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 10c0/ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db + languageName: node + linkType: hard + +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + +"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": + version: 1.0.4 + resolution: "cipher-base@npm:1.0.4" + dependencies: + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + checksum: 10c0/d8d005f8b64d8a77b3d3ce531301ae7b45902c9cab4ec8b66bdbd2bf2a1d9fceb9a2133c293eb3c060b2d964da0f14c47fb740366081338aa3795dd1faa8984b + languageName: node + linkType: hard + +"clap@npm:^1.0.9": + version: 1.2.3 + resolution: "clap@npm:1.2.3" + dependencies: + chalk: "npm:^1.1.3" + checksum: 10c0/55da8d6a8b60e4718652e7b4310773cb618fbc0386c7648e57a2639a5696f409cb7b5e079b058759232de80cfda32d01fb38934520bbf7c07cd49898fb74bae2 + languageName: node + linkType: hard + +"cliui@npm:^3.2.0": + version: 3.2.0 + resolution: "cliui@npm:3.2.0" + dependencies: + string-width: "npm:^1.0.1" + strip-ansi: "npm:^3.0.1" + wrap-ansi: "npm:^2.0.0" + checksum: 10c0/07b121fac7fd33ff8dbf3523f0d3dca0329d4e457e57dee54502aa5f27a33cbd9e66aa3e248f0260d8a1431b65b2bad8f510cd97fb8ab6a8e0506310a92e18d5 + languageName: node + linkType: hard + +"clone@npm:^1.0.2": + version: 1.0.4 + resolution: "clone@npm:1.0.4" + checksum: 10c0/2176952b3649293473999a95d7bebfc9dc96410f6cbd3d2595cf12fd401f63a4bf41a7adbfd3ab2ff09ed60cb9870c58c6acdd18b87767366fabfc163700f13b + languageName: node + linkType: hard + +"coa@npm:~1.0.1": + version: 1.0.4 + resolution: "coa@npm:1.0.4" + dependencies: + q: "npm:^1.1.2" + checksum: 10c0/b15bb8d10f8a29b364fa6e4980aff1fee1da7ae4fe721ca9d806d04ddd95e394dcc9b6390028077b1911675e9cae26ea13c0d3fc332cdc3bb0a64e58547f7e60 + languageName: node + linkType: hard + +"code-point-at@npm:^1.0.0": + version: 1.1.0 + resolution: "code-point-at@npm:1.1.0" + checksum: 10c0/33f6b234084e46e6e369b6f0b07949392651b4dde70fc6a592a8d3dafa08d5bb32e3981a02f31f6fc323a26bc03a4c063a9d56834848695bda7611c2417ea2e6 + languageName: node + linkType: hard + +"color-convert@npm:^1.3.0, color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: "npm:1.1.3" + checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 + languageName: node + linkType: hard + +"color-name@npm:^1.0.0": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"color-string@npm:^0.3.0": + version: 0.3.0 + resolution: "color-string@npm:0.3.0" + dependencies: + color-name: "npm:^1.0.0" + checksum: 10c0/836bbbf58358c541cc5558ecb0376a4c857f08ed37519c2ab63f3d57ec205b52af929629f3d2d58b7d6f7fb7b6769697d83694454b667698be4eb46654f1f818 + languageName: node + linkType: hard + +"color@npm:^0.11.0": + version: 0.11.4 + resolution: "color@npm:0.11.4" + dependencies: + clone: "npm:^1.0.2" + color-convert: "npm:^1.3.0" + color-string: "npm:^0.3.0" + checksum: 10c0/93abcc7e2eb7c254d42b96a889aab887d2bf6fedf901fc13af88f8885377b84a0f0f11a033c3e9ef9e37dca65214466261acc781f00fdec1c8d221d20c4120ee + languageName: node + linkType: hard + +"colormin@npm:^1.0.5": + version: 1.1.2 + resolution: "colormin@npm:1.1.2" + dependencies: + color: "npm:^0.11.0" + css-color-names: "npm:0.0.4" + has: "npm:^1.0.1" + checksum: 10c0/3488aca21bb100864c28b8070d5f86387fd4966bff93f552bb10cdc506a8ed9d42c4e239975b224c70eb664f170f543c74d8bda62f28216268141e8dba12777a + languageName: node + linkType: hard + +"colors@npm:~1.1.2": + version: 1.1.2 + resolution: "colors@npm:1.1.2" + checksum: 10c0/21fa4c575e636d889187b4666988ff16a6464a845089ff7b5e0263883da8cfa9140029300ba67bc3e231f67a4eb610725f9e77cc1d74df47741b691a695aea11 + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.5": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + +"commander@npm:~2.13.0": + version: 2.13.0 + resolution: "commander@npm:2.13.0" + checksum: 10c0/e3441096034439e506493ca1e5e9d5d5723ee0eadc3b2b92b3dd332b1d8fcbe72b70a1127f6790e6b3bedde3054316e9fe2cb36cef6ac051000b01559a16ba58 + languageName: node + linkType: hard + +"commondir@npm:^1.0.1": + version: 1.0.1 + resolution: "commondir@npm:1.0.1" + checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 + languageName: node + linkType: hard + +"component-emitter@npm:^1.1.3": + version: 1.3.0 + resolution: "component-emitter@npm:1.3.0" + checksum: 10c0/68774a0a3754fb6c0ba53c2e88886dfbd0c773931066abb1d7fd1b0c893b2a838d8f088ab4dca1f18cc1a4fc2e6932019eba3ded2d931b5ba2241ce40e93a24f + languageName: node + linkType: hard + +"component-emitter@npm:~1.2.0": + version: 1.2.1 + resolution: "component-emitter@npm:1.2.1" + checksum: 10c0/6c27bd7bba028776464cee6c1686c8e02cb9a576a11df93f1fc211ae3eb2de234ae90952d0b7fb3acc9c92c8baa389fa7389681b2e8689d2ca463e94f3ad30b2 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"concat-stream@npm:^1.5.0": + version: 1.6.2 + resolution: "concat-stream@npm:1.6.2" + dependencies: + buffer-from: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^2.2.2" + typedarray: "npm:^0.0.6" + checksum: 10c0/2e9864e18282946dabbccb212c5c7cec0702745e3671679eb8291812ca7fd12023f7d8cb36493942a62f770ac96a7f90009dc5c82ad69893438371720fa92617 + languageName: node + linkType: hard + +"console-browserify@npm:^1.1.0": + version: 1.2.0 + resolution: "console-browserify@npm:1.2.0" + checksum: 10c0/89b99a53b7d6cee54e1e64fa6b1f7ac24b844b4019c5d39db298637e55c1f4ffa5c165457ad984864de1379df2c8e1886cbbdac85d9dbb6876a9f26c3106f226 + languageName: node + linkType: hard + +"constants-browserify@npm:^1.0.0": + version: 1.0.0 + resolution: "constants-browserify@npm:1.0.0" + checksum: 10c0/ab49b1d59a433ed77c964d90d19e08b2f77213fb823da4729c0baead55e3c597f8f97ebccfdfc47bd896d43854a117d114c849a6f659d9986420e97da0f83ac5 + languageName: node + linkType: hard + +"convert-source-map@npm:^1.5.1": + version: 1.8.0 + resolution: "convert-source-map@npm:1.8.0" + dependencies: + safe-buffer: "npm:~5.1.1" + checksum: 10c0/da4649990b633c070c0dab1680b89a67b9315dd2b1168d143536f667214c97e4eb4a49e5b7ff912f0196fe303e31fc16a529457436d25b2b5a89613eaf4f27fa + languageName: node + linkType: hard + +"cookie@npm:0.3.1": + version: 0.3.1 + resolution: "cookie@npm:0.3.1" + checksum: 10c0/0d73c4d605b234c4d04de335aefa4988157f03265845f4a89ea311e3ba1ce73ab42b52d33652ed1c9671342eb77742a58f61753f3e90f31711284fb6031b2962 + languageName: node + linkType: hard + +"cookiejar@npm:2.0.6": + version: 2.0.6 + resolution: "cookiejar@npm:2.0.6" + checksum: 10c0/e62e345b74f29c396720e0592c9f6b7de6b29250867cf5abf6a7e798e4ea2efcb811210439ab6243b5dc2cde9d992133214039b08f7e474142eef441b102a58d + languageName: node + linkType: hard + +"copy-anything@npm:^2.0.1": + version: 2.0.6 + resolution: "copy-anything@npm:2.0.6" + dependencies: + is-what: "npm:^3.14.1" + checksum: 10c0/2702998a8cc015f9917385b7f16b0d85f1f6e5e2fd34d99f14df584838f492f49aa0c390d973684c687e895c5c58d08b308a0400ac3e1e3d6fa1e5884a5402ad + languageName: node + linkType: hard + +"copy-concurrently@npm:^1.0.0": + version: 1.0.5 + resolution: "copy-concurrently@npm:1.0.5" + dependencies: + aproba: "npm:^1.1.1" + fs-write-stream-atomic: "npm:^1.0.8" + iferr: "npm:^0.1.5" + mkdirp: "npm:^0.5.1" + rimraf: "npm:^2.5.4" + run-queue: "npm:^1.0.0" + checksum: 10c0/c2ce213cb27ee3df584d16eb6c9bfe99cfb531585007533c3e4c752521b4fbf0b2f7f90807d79c496683330808ecd9fdbd9ab9ddfa0913150b7f5097423348ce + languageName: node + linkType: hard + +"core-js@npm:^2.4.0, core-js@npm:^2.5.0": + version: 2.6.12 + resolution: "core-js@npm:2.6.12" + checksum: 10c0/00128efe427789120a06b819adc94cc72b96955acb331cb71d09287baf9bd37bebd191d91f1ee4939c893a050307ead4faea08876f09115112612b6a05684b63 + languageName: node + linkType: hard + +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 + languageName: node + linkType: hard + +"create-ecdh@npm:^4.0.0": + version: 4.0.4 + resolution: "create-ecdh@npm:4.0.4" + dependencies: + bn.js: "npm:^4.1.0" + elliptic: "npm:^6.5.3" + checksum: 10c0/77b11a51360fec9c3bce7a76288fc0deba4b9c838d5fb354b3e40c59194d23d66efe6355fd4b81df7580da0661e1334a235a2a5c040b7569ba97db428d466e7f + languageName: node + linkType: hard + +"create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": + version: 1.2.0 + resolution: "create-hash@npm:1.2.0" + dependencies: + cipher-base: "npm:^1.0.1" + inherits: "npm:^2.0.1" + md5.js: "npm:^1.3.4" + ripemd160: "npm:^2.0.1" + sha.js: "npm:^2.4.0" + checksum: 10c0/d402e60e65e70e5083cb57af96d89567954d0669e90550d7cec58b56d49c4b193d35c43cec8338bc72358198b8cbf2f0cac14775b651e99238e1cf411490f915 + languageName: node + linkType: hard + +"create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": + version: 1.1.7 + resolution: "create-hmac@npm:1.1.7" + dependencies: + cipher-base: "npm:^1.0.3" + create-hash: "npm:^1.1.0" + inherits: "npm:^2.0.1" + ripemd160: "npm:^2.0.0" + safe-buffer: "npm:^5.0.1" + sha.js: "npm:^2.4.8" + checksum: 10c0/24332bab51011652a9a0a6d160eed1e8caa091b802335324ae056b0dcb5acbc9fcf173cf10d128eba8548c3ce98dfa4eadaa01bd02f44a34414baee26b651835 + languageName: node + linkType: hard + +"cross-spawn@npm:^5.0.1": + version: 5.1.0 + resolution: "cross-spawn@npm:5.1.0" + dependencies: + lru-cache: "npm:^4.0.1" + shebang-command: "npm:^1.2.0" + which: "npm:^1.2.9" + checksum: 10c0/1918621fddb9f8c61e02118b2dbf81f611ccd1544ceaca0d026525341832b8511ce2504c60f935dbc06b35e5ef156fe8c1e72708c27dd486f034e9c0e1e07201 + languageName: node + linkType: hard + +"crypt@npm:0.0.2": + version: 0.0.2 + resolution: "crypt@npm:0.0.2" + checksum: 10c0/adbf263441dd801665d5425f044647533f39f4612544071b1471962209d235042fb703c27eea2795c7c53e1dfc242405173003f83cf4f4761a633d11f9653f18 + languageName: node + linkType: hard + +"crypto-browserify@npm:^3.11.0": + version: 3.12.0 + resolution: "crypto-browserify@npm:3.12.0" + dependencies: + browserify-cipher: "npm:^1.0.0" + browserify-sign: "npm:^4.0.0" + create-ecdh: "npm:^4.0.0" + create-hash: "npm:^1.1.0" + create-hmac: "npm:^1.1.0" + diffie-hellman: "npm:^5.0.0" + inherits: "npm:^2.0.1" + pbkdf2: "npm:^3.0.3" + public-encrypt: "npm:^4.0.0" + randombytes: "npm:^2.0.0" + randomfill: "npm:^1.0.3" + checksum: 10c0/0c20198886576050a6aa5ba6ae42f2b82778bfba1753d80c5e7a090836890dc372bdc780986b2568b4fb8ed2a91c958e61db1f0b6b1cc96af4bd03ffc298ba92 + languageName: node + linkType: hard + +"css-color-names@npm:0.0.4": + version: 0.0.4 + resolution: "css-color-names@npm:0.0.4" + checksum: 10c0/88ef97c25bcfb217469cdff428049022438cc546eb208210f0edec03b75050723db3ba02cd0f4959c84cd0659be0b43af3323eff80d1ba5fb15c2accf09ccbe2 + languageName: node + linkType: hard + +"css-loader@npm:^0.28.11": + version: 0.28.11 + resolution: "css-loader@npm:0.28.11" + dependencies: + babel-code-frame: "npm:^6.26.0" + css-selector-tokenizer: "npm:^0.7.0" + cssnano: "npm:^3.10.0" + icss-utils: "npm:^2.1.0" + loader-utils: "npm:^1.0.2" + lodash.camelcase: "npm:^4.3.0" + object-assign: "npm:^4.1.1" + postcss: "npm:^5.0.6" + postcss-modules-extract-imports: "npm:^1.2.0" + postcss-modules-local-by-default: "npm:^1.2.0" + postcss-modules-scope: "npm:^1.1.0" + postcss-modules-values: "npm:^1.3.0" + postcss-value-parser: "npm:^3.3.0" + source-list-map: "npm:^2.0.0" + checksum: 10c0/36434d7fafde8a4de3995c444713a455df17f74cfe10f089481cb7918db6f206267301daf2ae0496544809ca35bb226df47aa4edeb9580704c96281a07091f8b + languageName: node + linkType: hard + +"css-selector-tokenizer@npm:^0.7.0": + version: 0.7.3 + resolution: "css-selector-tokenizer@npm:0.7.3" + dependencies: + cssesc: "npm:^3.0.0" + fastparse: "npm:^1.1.2" + checksum: 10c0/bc4d14204bf5716f70085526bf370cbdd1c643dcb2e7366ba96212649fa5a07885e3f5dc2bde53646bac557ded79a60c7118cf7cf5d4dda898353a9e08277649 + languageName: node + linkType: hard + +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7 + languageName: node + linkType: hard + +"cssnano@npm:^3.10.0": + version: 3.10.0 + resolution: "cssnano@npm:3.10.0" + dependencies: + autoprefixer: "npm:^6.3.1" + decamelize: "npm:^1.1.2" + defined: "npm:^1.0.0" + has: "npm:^1.0.1" + object-assign: "npm:^4.0.1" + postcss: "npm:^5.0.14" + postcss-calc: "npm:^5.2.0" + postcss-colormin: "npm:^2.1.8" + postcss-convert-values: "npm:^2.3.4" + postcss-discard-comments: "npm:^2.0.4" + postcss-discard-duplicates: "npm:^2.0.1" + postcss-discard-empty: "npm:^2.0.1" + postcss-discard-overridden: "npm:^0.1.1" + postcss-discard-unused: "npm:^2.2.1" + postcss-filter-plugins: "npm:^2.0.0" + postcss-merge-idents: "npm:^2.1.5" + postcss-merge-longhand: "npm:^2.0.1" + postcss-merge-rules: "npm:^2.0.3" + postcss-minify-font-values: "npm:^1.0.2" + postcss-minify-gradients: "npm:^1.0.1" + postcss-minify-params: "npm:^1.0.4" + postcss-minify-selectors: "npm:^2.0.4" + postcss-normalize-charset: "npm:^1.1.0" + postcss-normalize-url: "npm:^3.0.7" + postcss-ordered-values: "npm:^2.1.0" + postcss-reduce-idents: "npm:^2.2.2" + postcss-reduce-initial: "npm:^1.0.0" + postcss-reduce-transforms: "npm:^1.0.3" + postcss-svgo: "npm:^2.1.1" + postcss-unique-selectors: "npm:^2.0.2" + postcss-value-parser: "npm:^3.2.3" + postcss-zindex: "npm:^2.0.1" + checksum: 10c0/1231f79be4761fa61478fb2a51d1aa95798eb426e33cde95341b5e9c71ec56c170fcc4c8d0618a8961033efb9da6230539eea933431c983ef065c014865e50f4 + languageName: node + linkType: hard + +"csso@npm:~2.3.1": + version: 2.3.2 + resolution: "csso@npm:2.3.2" + dependencies: + clap: "npm:^1.0.9" + source-map: "npm:^0.5.3" + bin: + csso: ./bin/csso + checksum: 10c0/e36a1cae8f371327cbf22d6770b8827291fa4f372bbaab938d5afc869e73f0a452ba4e87738bf03bfbb3bba27770efa04a6b4acaf5f36e94f88e8c481b9df7fa + languageName: node + linkType: hard + +"cyclist@npm:^1.0.1": + version: 1.0.1 + resolution: "cyclist@npm:1.0.1" + checksum: 10c0/3381d3b66a3b268e6e0abcc1fa8fbeeb9a98391d8455677509f9833813d7680cc737a10141f54c229e42f5b3133250f36f1aa04f56ef4ba9b29fa728c3c48c01 + languageName: node + linkType: hard + +"d@npm:1, d@npm:^1.0.1": + version: 1.0.1 + resolution: "d@npm:1.0.1" + dependencies: + es5-ext: "npm:^0.10.50" + type: "npm:^1.0.1" + checksum: 10c0/1fedcb3b956a461f64d86b94b347441beff5cef8910b6ac4ec509a2c67eeaa7093660a98b26601ac91f91260238add73bdf25867a9c0cb783774642bc4c1523f + languageName: node + linkType: hard + +"debug@npm:2, debug@npm:^2.6.8, debug@npm:^2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: "npm:2.0.0" + checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.3.4": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 + languageName: node + linkType: hard + +"debug@npm:^3.2.6": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + languageName: node + linkType: hard + +"decamelize@npm:^1.1.1, decamelize@npm:^1.1.2": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: 10c0/85c39fe8fbf0482d4a1e224ef0119db5c1897f8503bcef8b826adff7a1b11414972f6fef2d7dec2ee0b4be3863cf64ac1439137ae9e6af23a3d8dcbe26a5b4b2 + languageName: node + linkType: hard + +"defined@npm:^1.0.0": + version: 1.0.0 + resolution: "defined@npm:1.0.0" + checksum: 10c0/2b9929414857729a97cfcc77987e65005e03b3fd92747e1d6a743b054c1387b62e669dc453b53e3a8105f1398df6aad54c07eed984871c93be8c7f4560a1828b + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + +"des.js@npm:^1.0.0": + version: 1.0.1 + resolution: "des.js@npm:1.0.1" + dependencies: + inherits: "npm:^2.0.1" + minimalistic-assert: "npm:^1.0.0" + checksum: 10c0/69bf742d1c381e01d75151bdcaac71a18d251d7debfc9b6ae5ee4b4edaf39691ae203c5ec9173ba89aedb3ddc622cdff4fca065448c6c2afb1140d9fb826339d + languageName: node + linkType: hard + +"detect-indent@npm:^4.0.0": + version: 4.0.0 + resolution: "detect-indent@npm:4.0.0" + dependencies: + repeating: "npm:^2.0.0" + checksum: 10c0/066a0d13eadebb1e7d2ba395fdf9f3956f31f8383a6db263320108c283e2230250a102f4871f54926cc8a77c6323ac7103f30550a4ac3d6518aa1b934c041295 + languageName: node + linkType: hard + +"diffie-hellman@npm:^5.0.0": + version: 5.0.3 + resolution: "diffie-hellman@npm:5.0.3" + dependencies: + bn.js: "npm:^4.1.0" + miller-rabin: "npm:^4.0.0" + randombytes: "npm:^2.0.0" + checksum: 10c0/ce53ccafa9ca544b7fc29b08a626e23a9b6562efc2a98559a0c97b4718937cebaa9b5d7d0a05032cc9c1435e9b3c1532b9e9bf2e0ede868525922807ad6e1ecf + languageName: node + linkType: hard + +"domain-browser@npm:^1.1.1": + version: 1.2.0 + resolution: "domain-browser@npm:1.2.0" + checksum: 10c0/a955f482f4b4710fbd77c12a33e77548d63603c30c80f61a80519f27e3db1ba8530b914584cc9e9365d2038753d6b5bd1f4e6c81e432b007b0ec95b8b5e69b1b + languageName: node + linkType: hard + +"domready@npm:0.3.0": + version: 0.3.0 + resolution: "domready@npm:0.3.0" + checksum: 10c0/c08ad5ece9e4d4bb5425422534c580c93443956acb1963019788ac1607c671d25de38f540b6d57f18e9364690ae010b81eb13a4c1fbef1cbedddeabf08963eff + languageName: node + linkType: hard + +"duplexify@npm:^3.4.2, duplexify@npm:^3.6.0": + version: 3.7.1 + resolution: "duplexify@npm:3.7.1" + dependencies: + end-of-stream: "npm:^1.0.0" + inherits: "npm:^2.0.1" + readable-stream: "npm:^2.0.0" + stream-shift: "npm:^1.0.0" + checksum: 10c0/59d1440c1b4e3a4db35ae96933392703ce83518db1828d06b9b6322920d6cbbf0b7159e88be120385fe459e77f1eb0c7622f26e9ec1f47c9ff05c2b35747dbd3 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.2.7": + version: 1.4.172 + resolution: "electron-to-chromium@npm:1.4.172" + checksum: 10c0/b0543ef0331708ccfb049f71be39edd340d9d4e8e0f7cafec9c7e3e8a7982c88d36bbc143b2e29858e42d5bccafbe394b6f389c95c23ed9f8c499e59b93ce623 + languageName: node + linkType: hard + +"elliptic@npm:^6.5.3": + version: 6.5.4 + resolution: "elliptic@npm:6.5.4" + dependencies: + bn.js: "npm:^4.11.9" + brorand: "npm:^1.1.0" + hash.js: "npm:^1.0.0" + hmac-drbg: "npm:^1.0.1" + inherits: "npm:^2.0.4" + minimalistic-assert: "npm:^1.0.1" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10c0/5f361270292c3b27cf0843e84526d11dec31652f03c2763c6c2b8178548175ff5eba95341dd62baff92b2265d1af076526915d8af6cc9cb7559c44a62f8ca6e2 + languageName: node + linkType: hard + +"emojis-list@npm:^2.0.0": + version: 2.1.0 + resolution: "emojis-list@npm:2.1.0" + checksum: 10c0/bbb941223bfb3e38054cb52ed1b3098a8dac0a90fdd2699eb8a3af3b2172cdc4af0932e05c3edd52e814997c8f45cf1d7f5e86e9ecdcd4e2390a0f27e6914db5 + languageName: node + linkType: hard + +"emojis-list@npm:^3.0.0": + version: 3.0.0 + resolution: "emojis-list@npm:3.0.0" + checksum: 10c0/7dc4394b7b910444910ad64b812392159a21e1a7ecc637c775a440227dcb4f80eff7fe61f4453a7d7603fa23d23d30cc93fe9e4b5ed985b88d6441cd4a35117b + languageName: node + linkType: hard + +"end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: 10c0/870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 + languageName: node + linkType: hard + +"enhanced-resolve@npm:^3.4.0": + version: 3.4.1 + resolution: "enhanced-resolve@npm:3.4.1" + dependencies: + graceful-fs: "npm:^4.1.2" + memory-fs: "npm:^0.4.0" + object-assign: "npm:^4.0.1" + tapable: "npm:^0.2.7" + checksum: 10c0/91f2da7e8e5ab2376823843a0e0176f683cfdb5749efbb6e1f26580b285593bb5b69006a1ae5e068c21ab1eb90271eec8b8fd6aa3ac36cc6f1f6de4d37a06456 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"errno@npm:^0.1.1, errno@npm:^0.1.3, errno@npm:~0.1.7": + version: 0.1.8 + resolution: "errno@npm:0.1.8" + dependencies: + prr: "npm:~1.0.1" + bin: + errno: cli.js + checksum: 10c0/83758951967ec57bf00b5f5b7dc797e6d65a6171e57ea57adcf1bd1a0b477fd9b5b35fae5be1ff18f4090ed156bce1db749fe7e317aac19d485a5d150f6a4936 + languageName: node + linkType: hard + +"error-ex@npm:^1.2.0": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + languageName: node + linkType: hard + +"es5-ext@npm:^0.10.35, es5-ext@npm:^0.10.46, es5-ext@npm:^0.10.50, es5-ext@npm:~0.10.14": + version: 0.10.61 + resolution: "es5-ext@npm:0.10.61" + dependencies: + es6-iterator: "npm:^2.0.3" + es6-symbol: "npm:^3.1.3" + next-tick: "npm:^1.1.0" + checksum: 10c0/fceee484bbf3d7b064b8b3b9ad9095fa64e8736de322f8b48abd162f215bdd503390a3bb8c3cdeebae619825111f7eff83e1e4400fe232733da027ade8e1823e + languageName: node + linkType: hard + +"es6-iterator@npm:^2.0.3, es6-iterator@npm:~2.0.1": + version: 2.0.3 + resolution: "es6-iterator@npm:2.0.3" + dependencies: + d: "npm:1" + es5-ext: "npm:^0.10.35" + es6-symbol: "npm:^3.1.1" + checksum: 10c0/91f20b799dba28fb05bf623c31857fc1524a0f1c444903beccaf8929ad196c8c9ded233e5ac7214fc63a92b3f25b64b7f2737fcca8b1f92d2d96cf3ac902f5d8 + languageName: node + linkType: hard + +"es6-map@npm:^0.1.3": + version: 0.1.5 + resolution: "es6-map@npm:0.1.5" + dependencies: + d: "npm:1" + es5-ext: "npm:~0.10.14" + es6-iterator: "npm:~2.0.1" + es6-set: "npm:~0.1.5" + es6-symbol: "npm:~3.1.1" + event-emitter: "npm:~0.3.5" + checksum: 10c0/62fe1a90ead1704bed699cb9c975e642023f590d5338c2a640d60ce0a846de7d5197561393ac03dd11473b96087cf8793c9e4836fe05ad4d2ef6afda6b9a3511 + languageName: node + linkType: hard + +"es6-set@npm:~0.1.5": + version: 0.1.5 + resolution: "es6-set@npm:0.1.5" + dependencies: + d: "npm:1" + es5-ext: "npm:~0.10.14" + es6-iterator: "npm:~2.0.1" + es6-symbol: "npm:3.1.1" + event-emitter: "npm:~0.3.5" + checksum: 10c0/a1fe925f77bd529b7b5135ca1a8bc9ff378fa0e3fd9686f3ac1b8e87eb00fbffc100e81a3c44262cd324cbfcc772d7a75ca5471e3fb24247ac85c5beb6af0d14 + languageName: node + linkType: hard + +"es6-symbol@npm:3.1.1": + version: 3.1.1 + resolution: "es6-symbol@npm:3.1.1" + dependencies: + d: "npm:1" + es5-ext: "npm:~0.10.14" + checksum: 10c0/eb4ec788a99dc2c04e5e9abd90f478991425a881eced99a7165eada0c832bfc9a8fbb76b688c3c3b6e103f94d23e8e19addf9cf18abb537fb918d066d5ce1d7f + languageName: node + linkType: hard + +"es6-symbol@npm:^3.1.1, es6-symbol@npm:^3.1.3, es6-symbol@npm:~3.1.1": + version: 3.1.3 + resolution: "es6-symbol@npm:3.1.3" + dependencies: + d: "npm:^1.0.1" + ext: "npm:^1.1.2" + checksum: 10c0/22982f815f00df553a89f4fb74c5048fed85df598482b4bd38dbd173174247949c72982a7d7132a58b147525398400e5f182db59b0916cb49f1e245fb0e22233 + languageName: node + linkType: hard + +"es6-weak-map@npm:^2.0.1": + version: 2.0.3 + resolution: "es6-weak-map@npm:2.0.3" + dependencies: + d: "npm:1" + es5-ext: "npm:^0.10.46" + es6-iterator: "npm:^2.0.3" + es6-symbol: "npm:^3.1.1" + checksum: 10c0/460932be9542473dbbddd183e21c15a66cfec1b2c17dae2b514e190d6fb2896b7eb683783d4b36da036609d2e1c93d2815f21b374dfccaf02a8978694c2f7b67 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 + languageName: node + linkType: hard + +"escope@npm:^3.6.0": + version: 3.6.0 + resolution: "escope@npm:3.6.0" + dependencies: + es6-map: "npm:^0.1.3" + es6-weak-map: "npm:^2.0.1" + esrecurse: "npm:^4.1.0" + estraverse: "npm:^4.1.1" + checksum: 10c0/79cbb30bf126628eb7e586575b2f5fd31b14ea108cd2379c571fe4dc09ea5208f42dacf1cd43a702b59efccb128e9c9e7762d5cd670d2d184a889947aea509e5 + languageName: node + linkType: hard + +"esprima@npm:^2.6.0": + version: 2.7.3 + resolution: "esprima@npm:2.7.3" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/6e1e99f280eed2ecd521ae28217c5f7c7a03fd0a1ac913bffd4a4ba278caf32cb8d9fc01e41d4b4bc904617282873dea297d60e1f93ea20156f29994c348a04f + languageName: node + linkType: hard + +"esrecurse@npm:^4.1.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d + languageName: node + linkType: hard + +"estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"event-emitter@npm:~0.3.5": + version: 0.3.5 + resolution: "event-emitter@npm:0.3.5" + dependencies: + d: "npm:1" + es5-ext: "npm:~0.10.14" + checksum: 10c0/75082fa8ffb3929766d0f0a063bfd6046bd2a80bea2666ebaa0cfd6f4a9116be6647c15667bea77222afc12f5b4071b68d393cf39fdaa0e8e81eda006160aff0 + languageName: node + linkType: hard + +"events@npm:^3.0.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 + languageName: node + linkType: hard + +"evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3": + version: 1.0.3 + resolution: "evp_bytestokey@npm:1.0.3" + dependencies: + md5.js: "npm:^1.3.4" + node-gyp: "npm:latest" + safe-buffer: "npm:^5.1.1" + checksum: 10c0/77fbe2d94a902a80e9b8f5a73dcd695d9c14899c5e82967a61b1fc6cbbb28c46552d9b127cff47c45fcf684748bdbcfa0a50410349109de87ceb4b199ef6ee99 + languageName: node + linkType: hard + +"execa@npm:^0.7.0": + version: 0.7.0 + resolution: "execa@npm:0.7.0" + dependencies: + cross-spawn: "npm:^5.0.1" + get-stream: "npm:^3.0.0" + is-stream: "npm:^1.1.0" + npm-run-path: "npm:^2.0.0" + p-finally: "npm:^1.0.0" + signal-exit: "npm:^3.0.0" + strip-eof: "npm:^1.0.0" + checksum: 10c0/812f1776e2a6b2226532e43c1af87d8a12e26de03a06e7e043f653acf5565e0656f5f6c64d66726fefa17178ac129caaa419a50905934e7c4a846417abb25d4a + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.3 + resolution: "exponential-backoff@npm:3.1.3" + checksum: 10c0/77e3ae682b7b1f4972f563c6dbcd2b0d54ac679e62d5d32f3e5085feba20483cf28bd505543f520e287a56d4d55a28d7874299941faf637e779a1aa5994d1267 + languageName: node + linkType: hard + +"ext@npm:^1.1.2": + version: 1.6.0 + resolution: "ext@npm:1.6.0" + dependencies: + type: "npm:^2.5.0" + checksum: 10c0/d6ff29ca86fbe4e69743d10702ece124e0239faa435a6c3b2833282787b9eace2c8cbf5d8439d0c85312255d5472d251bf3cd4c4d1b9de8f8a8090e6b43db948 + languageName: node + linkType: hard + +"extend@npm:3.0.0": + version: 3.0.0 + resolution: "extend@npm:3.0.0" + checksum: 10c0/67a867fd39abcd36f3d11e99c6e2808d0237214239ca7a194278b1a91790945a3755e22fd4e16521a247e511f9bce866142b483e1ca61d33d7c2317aa98ecf5a + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fastparse@npm:^1.1.2": + version: 1.1.2 + resolution: "fastparse@npm:1.1.2" + checksum: 10c0/c08d6e7ef10c0928426c1963dd4593e2baaf44d223ab1e5ba5d7b30470144b3a4ecb3605958b73754cea3f857ecef00b67c885f07ca2c312b38b67d9d88b84b5 + languageName: node + linkType: hard + +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f + languageName: node + linkType: hard + +"find-cache-dir@npm:^0.1.1": + version: 0.1.1 + resolution: "find-cache-dir@npm:0.1.1" + dependencies: + commondir: "npm:^1.0.1" + mkdirp: "npm:^0.5.1" + pkg-dir: "npm:^1.0.0" + checksum: 10c0/797d978c94352851f684d0565e3a60eca4aa380be91643c0a9066eec48c75ee0b382f6b04309fa6d183dea0bff1471ad7da116fcc7c8f95d4af8f5aca444ec41 + languageName: node + linkType: hard + +"find-cache-dir@npm:^1.0.0": + version: 1.0.0 + resolution: "find-cache-dir@npm:1.0.0" + dependencies: + commondir: "npm:^1.0.1" + make-dir: "npm:^1.0.0" + pkg-dir: "npm:^2.0.0" + checksum: 10c0/264b706771f30b39385cf921a5576c80ef95cb4c8ef2df8761b8be62326a1537ea63feecf0deac52cd84d6937b312a8d9554b4012a092937ade43a165cd5b6f9 + languageName: node + linkType: hard + +"find-root@npm:^0.1.1": + version: 0.1.2 + resolution: "find-root@npm:0.1.2" + checksum: 10c0/698fd94b2505da9c5ceee77d76b7a152ec5dbd3000f354497f95a66de3c0f249d5cd43fb2a05afb5715baf1a4a91498f90a66e0c3844a09fbd0afe0f16024058 + languageName: node + linkType: hard + +"find-up@npm:^1.0.0": + version: 1.1.2 + resolution: "find-up@npm:1.1.2" + dependencies: + path-exists: "npm:^2.0.0" + pinkie-promise: "npm:^2.0.0" + checksum: 10c0/51e35c62d9b7efe82d7d5cce966bfe10c2eaa78c769333f8114627e3a8a4a4f50747f5f50bff50b1094cbc6527776f0d3b9ff74d3561ef714a5290a17c80c2bc + languageName: node + linkType: hard + +"find-up@npm:^2.0.0, find-up@npm:^2.1.0": + version: 2.1.0 + resolution: "find-up@npm:2.1.0" + dependencies: + locate-path: "npm:^2.0.0" + checksum: 10c0/c080875c9fe28eb1962f35cbe83c683796a0321899f1eed31a37577800055539815de13d53495049697d3ba313013344f843bb9401dd337a1b832be5edfc6840 + languageName: node + linkType: hard + +"flatten@npm:^1.0.2": + version: 1.0.3 + resolution: "flatten@npm:1.0.3" + checksum: 10c0/9f9b1f3dcd05be057bb83ec27f2513da5306e7bfc0cf8bd839ab423eb1b0f99683a25c97b48fafd5959819159659ce9f1397623a46f89a8577ba095fcf5fb753 + languageName: node + linkType: hard + +"flush-write-stream@npm:^1.0.0": + version: 1.1.1 + resolution: "flush-write-stream@npm:1.1.1" + dependencies: + inherits: "npm:^2.0.3" + readable-stream: "npm:^2.3.6" + checksum: 10c0/2cd4f65b728d5f388197a03dafabc6a5e4f0c2ed1a2d912e288f7aa1c2996dd90875e55b50cf32c78dca55ad2e2dfae5d3db09b223838388033d87cf5920dd87 + languageName: node + linkType: hard + +"font-awesome-webpack@npm:0.0.5-beta.2": + version: 0.0.5-beta.2 + resolution: "font-awesome-webpack@npm:0.0.5-beta.2" + dependencies: + css-loader: "npm:~0.26.1" + less-loader: "npm:~2.2.3" + style-loader: "npm:~0.13.1" + peerDependencies: + font-awesome: ">=4.3.0" + checksum: 10c0/fd36231eba4f9e9cacbcbcc1b814b03c99ba9ea0d8520a0870da6bf8bd049f2107b39866769e678c4f214e93da9a13a056d40ee260fed1071a1abf0763fdf0a4 + languageName: node + linkType: hard + +"font-awesome@npm:^4.5.0": + version: 4.7.0 + resolution: "font-awesome@npm:4.7.0" + checksum: 10c0/1c456e2939c55192eed67db9c0efb8db3e92fd357ca189ca00030eb44acffa1e9f835288d2204c14b9a9c490a7b14b7090dfaff80ded6b2473f50a923dfb41e7 + languageName: node + linkType: hard + +"form-data@npm:1.0.0-rc3": + version: 1.0.0-rc3 + resolution: "form-data@npm:1.0.0-rc3" + dependencies: + async: "npm:^1.4.0" + combined-stream: "npm:^1.0.5" + mime-types: "npm:^2.1.3" + checksum: 10c0/d67674a76f46253f69aebdc5c1c86aa123385940d147346b2f801681656ab5df6b82bd9568483e1579fd53bf277795f2da7592c6a842893465ef69e9073c342f + languageName: node + linkType: hard + +"formidable@npm:~1.0.14": + version: 1.0.17 + resolution: "formidable@npm:1.0.17" + checksum: 10c0/651c7394574ab6b451467200495bcb5064776419d883e6f82512f31019a0528de90c729d28d89d519eb00cb456302206aa389a4d63d2aba69eef5653ba863714 + languageName: node + linkType: hard + +"from2@npm:^2.1.0": + version: 2.3.0 + resolution: "from2@npm:2.3.0" + dependencies: + inherits: "npm:^2.0.1" + readable-stream: "npm:^2.0.0" + checksum: 10c0/f87f7a2e4513244d551454a7f8324ef1f7837864a8701c536417286ec19ff4915606b1dfa8909a21b7591ebd8440ffde3642f7c303690b9a4d7c832d62248aa1 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fs-write-stream-atomic@npm:^1.0.8": + version: 1.0.10 + resolution: "fs-write-stream-atomic@npm:1.0.10" + dependencies: + graceful-fs: "npm:^4.1.2" + iferr: "npm:^0.1.5" + imurmurhash: "npm:^0.1.4" + readable-stream: "npm:1 || 2" + checksum: 10c0/293b2b4ed346d35a28f8637a20cb2aef31be86503da501c42c2eda8fefed328bac16ce0e5daa7019f9329d73930c58031eaea2ce0c70f1680943fbfb7cff808b + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"function-bind@npm:^1.1.1": + version: 1.1.1 + resolution: "function-bind@npm:1.1.1" + checksum: 10c0/60b74b2407e1942e1ed7f8c284f8ef714d0689dcfce5319985a5b7da3fc727f40b4a59ec72dc55aa83365ad7b8fa4fac3a30d93c850a2b452f29ae03dbc10a1e + languageName: node + linkType: hard + +"get-caller-file@npm:^1.0.1": + version: 1.0.3 + resolution: "get-caller-file@npm:1.0.3" + checksum: 10c0/763dcee2de8ff60ae7e13a4bad8306205a2fbe108e555686344ddd9ef211b8bebfe459d3a739669257014c59e7cc1e7a44003c21af805c1214673e6a45f06c51 + languageName: node + linkType: hard + +"get-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "get-stream@npm:3.0.0" + checksum: 10c0/003f5f3b8870da59c6aafdf6ed7e7b07b48c2f8629cd461bd3900726548b6b8cfa2e14d6b7814fbb08f07a42f4f738407fa70b989928b2783a76b278505bba22 + languageName: node + linkType: hard + +"glob-to-regexp@npm:^0.4.1": + version: 0.4.1 + resolution: "glob-to-regexp@npm:0.4.1" + checksum: 10c0/0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 + languageName: node + linkType: hard + +"glob@npm:^13.0.0": + version: 13.0.6 + resolution: "glob@npm:13.0.6" + dependencies: + minimatch: "npm:^10.2.2" + minipass: "npm:^7.1.3" + path-scurry: "npm:^2.0.2" + checksum: 10c0/269c236f11a9b50357fe7a8c6aadac667e01deb5242b19c84975628f05f4438d8ee1354bb62c5d6c10f37fd59911b54d7799730633a2786660d8c69f1d18120a + languageName: node + linkType: hard + +"glob@npm:^7.1.2, glob@npm:^7.1.3": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"globals@npm:^9.18.0": + version: 9.18.0 + resolution: "globals@npm:9.18.0" + checksum: 10c0/5ab74cb67cf060a9fceede4a0f2babc4c2c0b90dbb13847d2659defdf2121c60035ef23823c8417ce8c11bdaa7b412396077f2b3d2a7dedab490a881a0a96754 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2": + version: 4.2.10 + resolution: "graceful-fs@npm:4.2.10" + checksum: 10c0/4223a833e38e1d0d2aea630c2433cfb94ddc07dfc11d511dbd6be1d16688c5be848acc31f9a5d0d0ddbfb56d2ee5a6ae0278aceeb0ca6a13f27e06b9956fb952 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"has-ansi@npm:^2.0.0": + version: 2.0.0 + resolution: "has-ansi@npm:2.0.0" + dependencies: + ansi-regex: "npm:^2.0.0" + checksum: 10c0/f54e4887b9f8f3c4bfefd649c48825b3c093987c92c27880ee9898539e6f01aed261e82e73153c3f920fde0db5bf6ebd58deb498ed1debabcb4bc40113ccdf05 + languageName: node + linkType: hard + +"has-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "has-flag@npm:1.0.0" + checksum: 10c0/d0ad4bebbbc005edccfa1e2c0600c89375be5663d23f49a129e0f817187405748b0b515abfc5b3c209c92692e39bb0481c83c0ee4df69433d6ffd0242183100b + languageName: node + linkType: hard + +"has-flag@npm:^2.0.0": + version: 2.0.0 + resolution: "has-flag@npm:2.0.0" + checksum: 10c0/5e1f136c7f801c2719048bedfabcf834a1ed46276cd4c98c6fcddb89a482f5d6a16df0771a38805cfc2d9010b4de157909e1a71b708e1d339b6e311041bde9b4 + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 + languageName: node + linkType: hard + +"has@npm:^1.0.1, has@npm:^1.0.3": + version: 1.0.3 + resolution: "has@npm:1.0.3" + dependencies: + function-bind: "npm:^1.1.1" + checksum: 10c0/e1da0d2bd109f116b632f27782cf23182b42f14972ca9540e4c5aa7e52647407a0a4a76937334fddcb56befe94a3494825ec22b19b51f5e5507c3153fd1a5e1b + languageName: node + linkType: hard + +"hash-base@npm:^3.0.0": + version: 3.1.0 + resolution: "hash-base@npm:3.1.0" + dependencies: + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.6.0" + safe-buffer: "npm:^5.2.0" + checksum: 10c0/663eabcf4173326fbb65a1918a509045590a26cc7e0964b754eef248d281305c6ec9f6b31cb508d02ffca383ab50028180ce5aefe013e942b44a903ac8dc80d0 + languageName: node + linkType: hard + +"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": + version: 1.1.7 + resolution: "hash.js@npm:1.1.7" + dependencies: + inherits: "npm:^2.0.3" + minimalistic-assert: "npm:^1.0.1" + checksum: 10c0/41ada59494eac5332cfc1ce6b7ebdd7b88a3864a6d6b08a3ea8ef261332ed60f37f10877e0c825aaa4bddebf164fbffa618286aeeec5296675e2671cbfa746c4 + languageName: node + linkType: hard + +"hmac-drbg@npm:^1.0.1": + version: 1.0.1 + resolution: "hmac-drbg@npm:1.0.1" + dependencies: + hash.js: "npm:^1.0.3" + minimalistic-assert: "npm:^1.0.0" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10c0/f3d9ba31b40257a573f162176ac5930109816036c59a09f901eb2ffd7e5e705c6832bedfff507957125f2086a0ab8f853c0df225642a88bf1fcaea945f20600d + languageName: node + linkType: hard + +"home-or-tmp@npm:^2.0.0": + version: 2.0.0 + resolution: "home-or-tmp@npm:2.0.0" + dependencies: + os-homedir: "npm:^1.0.0" + os-tmpdir: "npm:^1.0.1" + checksum: 10c0/a0e0d26db09dc0b3245f52a9159d3e970e628ddc22d69842e8413ea42f81d5a29c3808f9b08ea4d48db084e4e693193cc238c114775aa92d753bf95a9daa10fb + languageName: node + linkType: hard + +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 + languageName: node + linkType: hard + +"html-comment-regex@npm:^1.1.0": + version: 1.1.2 + resolution: "html-comment-regex@npm:1.1.2" + checksum: 10c0/c6fe47e7efbb2e853217854cdf352e53a6d414f87a6029456010250179f9ac2c77ef657dd4e26f4d3930f8def0e2fad015c233a3181a195a59fb4eeda6d333f9 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.2.0 + resolution: "http-cache-semantics@npm:4.2.0" + checksum: 10c0/45b66a945cf13ec2d1f29432277201313babf4a01d9e52f44b31ca923434083afeca03f18417f599c9ab3d0e7b618ceb21257542338b57c54b710463b4a53e37 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"https-browserify@npm:^1.0.0": + version: 1.0.0 + resolution: "https-browserify@npm:1.0.0" + checksum: 10c0/e17b6943bc24ea9b9a7da5714645d808670af75a425f29baffc3284962626efdc1eb3aa9bbffaa6e64028a6ad98af5b09fabcb454a8f918fb686abfdc9e9b8ae + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:4" + checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.3": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.7.2": + version: 0.7.2 + resolution: "iconv-lite@npm:0.7.2" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/3c228920f3bd307f56bf8363706a776f4a060eb042f131cd23855ceca962951b264d0997ab38a1ad340e1c5df8499ed26e1f4f0db6b2a2ad9befaff22f14b722 + languageName: node + linkType: hard + +"icss-replace-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "icss-replace-symbols@npm:1.1.0" + checksum: 10c0/aaa5b67f82781fccc77bf6df14eaa9177ce3944462ef82b2b9e3b9f17d8fcd90f8851ffd5e6e249ebc5c464bfda07c2eccce2d122274c51c9d5b359b087f7049 + languageName: node + linkType: hard + +"icss-utils@npm:^2.1.0": + version: 2.1.0 + resolution: "icss-utils@npm:2.1.0" + dependencies: + postcss: "npm:^6.0.1" + checksum: 10c0/69d3b8fdea58fbf5c26d8dc2d1b7d8ded34fd8fb0800ed60b390e0ae5f596e77b155c587fb62e7642d1064d2d72fc672676df58ef935eba7303d79467e43edbf + languageName: node + linkType: hard + +"ieee754@npm:^1.1.4": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + +"iferr@npm:^0.1.5": + version: 0.1.5 + resolution: "iferr@npm:0.1.5" + checksum: 10c0/e0669b1757d0501b43a158321945d1cc1fe56f28a972df2f88a5818f05c8853c7669ba5d6cfbbf9a1a312850699de6e528626df108d559005df7e15d16ee334c + languageName: node + linkType: hard + +"image-size@npm:~0.5.0": + version: 0.5.5 + resolution: "image-size@npm:0.5.5" + bin: + image-size: bin/image-size.js + checksum: 10c0/655204163af06732f483a9fe7cce9dff4a29b7b2e88f5c957a5852e8143fa750f5e54b1955a2ca83de99c5220dbd680002d0d4e09140b01433520f4d5a0b1f4c + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"indexes-of@npm:^1.0.1": + version: 1.0.1 + resolution: "indexes-of@npm:1.0.1" + checksum: 10c0/1ea1d2d00173fa38f728acfa00303657e1115361481e52f6cbae47c5d603219006c9357abf6bc323f1fb0fbe937e363bbb19e5c66c12578eea6ec6b7e892bdba + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"inherits@npm:2.0.1": + version: 2.0.1 + resolution: "inherits@npm:2.0.1" + checksum: 10c0/bfc7b37c21a2cddb272adc65b053b1716612d408bb2c9a4e5c32679dc2b08032aadd67880c405be3dff060a62e45b353fc3d9fa79a3067ad7a3deb6a283cc5c6 + languageName: node + linkType: hard + +"inherits@npm:2.0.3": + version: 2.0.3 + resolution: "inherits@npm:2.0.3" + checksum: 10c0/6e56402373149ea076a434072671f9982f5fad030c7662be0332122fe6c0fa490acb3cc1010d90b6eff8d640b1167d77674add52dfd1bb85d545cf29e80e73e7 + languageName: node + linkType: hard + +"interpret@npm:^1.0.0": + version: 1.4.0 + resolution: "interpret@npm:1.4.0" + checksum: 10c0/08c5ad30032edeec638485bc3f6db7d0094d9b3e85e0f950866600af3c52e9fd69715416d29564731c479d9f4d43ff3e4d302a178196bdc0e6837ec147640450 + languageName: node + linkType: hard + +"invariant@npm:^2.2.2": + version: 2.2.4 + resolution: "invariant@npm:2.2.4" + dependencies: + loose-envify: "npm:^1.0.0" + checksum: 10c0/5af133a917c0bcf65e84e7f23e779e7abc1cd49cb7fdc62d00d1de74b0d8c1b5ee74ac7766099fb3be1b05b26dfc67bab76a17030d2fe7ea2eef867434362dfc + languageName: node + linkType: hard + +"invert-kv@npm:^1.0.0": + version: 1.0.0 + resolution: "invert-kv@npm:1.0.0" + checksum: 10c0/9ccef12ada8494c56175cc0380b4cea18b6c0a368436f324a30e43a332db90bdfb83cd3a7987b71df359cdf931ce45b7daf35b677da56658565d61068e4bc20b + languageName: node + linkType: hard + +"ip-address@npm:^10.0.1": + version: 10.1.0 + resolution: "ip-address@npm:10.1.0" + checksum: 10c0/0103516cfa93f6433b3bd7333fa876eb21263912329bfa47010af5e16934eeeff86f3d2ae700a3744a137839ddfad62b900c7a445607884a49b5d1e32a3d7566 + languageName: node + linkType: hard + +"is-absolute-url@npm:^2.0.0": + version: 2.1.0 + resolution: "is-absolute-url@npm:2.1.0" + checksum: 10c0/2c324c3118752d82c18afadffbea14d35224e76f37a2ee80e05b209386c46d19bef77b58ede41f7b3be552cde16c6cdb0d884807175a6eb40e8c61281dc67c2f + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 + languageName: node + linkType: hard + +"is-buffer@npm:~1.1.6": + version: 1.1.6 + resolution: "is-buffer@npm:1.1.6" + checksum: 10c0/ae18aa0b6e113d6c490ad1db5e8df9bdb57758382b313f5a22c9c61084875c6396d50bbf49315f5b1926d142d74dfb8d31b40d993a383e0a158b15fea7a82234 + languageName: node + linkType: hard + +"is-core-module@npm:^2.9.0": + version: 2.9.0 + resolution: "is-core-module@npm:2.9.0" + dependencies: + has: "npm:^1.0.3" + checksum: 10c0/056fe4c5f9f383dc1c1b0dc3250c300880b9b1e17e1885077d64a1667926ecc11ba696776597616bfd2fd7f87c7476c01b127a0c842b4821bee2414d0e296e6e + languageName: node + linkType: hard + +"is-finite@npm:^1.0.0": + version: 1.1.0 + resolution: "is-finite@npm:1.1.0" + checksum: 10c0/ca6bc7a0321b339f098e657bd4cbf4bb2410f5a11f1b9adb1a1a9ab72288b64368e8251326cb1f74e985f2779299cec3e1f1e558b68ce7e1e2c9be17b7cfd626 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^1.0.0": + version: 1.0.0 + resolution: "is-fullwidth-code-point@npm:1.0.0" + dependencies: + number-is-nan: "npm:^1.0.0" + checksum: 10c0/12acfcf16142f2d431bf6af25d68569d3198e81b9799b4ae41058247aafcc666b0127d64384ea28e67a746372611fcbe9b802f69175287aba466da3eddd5ba0f + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^2.0.0": + version: 2.0.0 + resolution: "is-fullwidth-code-point@npm:2.0.0" + checksum: 10c0/e58f3e4a601fc0500d8b2677e26e9fe0cd450980e66adb29d85b6addf7969731e38f8e43ed2ec868a09c101a55ac3d8b78902209269f38c5286bc98f5bc1b4d9 + languageName: node + linkType: hard + +"is-plain-obj@npm:^1.0.0": + version: 1.1.0 + resolution: "is-plain-obj@npm:1.1.0" + checksum: 10c0/daaee1805add26f781b413fdf192fc91d52409583be30ace35c82607d440da63cc4cac0ac55136716688d6c0a2c6ef3edb2254fecbd1fe06056d6bd15975ee8c + languageName: node + linkType: hard + +"is-stream@npm:^1.1.0": + version: 1.1.0 + resolution: "is-stream@npm:1.1.0" + checksum: 10c0/b8ae7971e78d2e8488d15f804229c6eed7ed36a28f8807a1815938771f4adff0e705218b7dab968270433f67103e4fef98062a0beea55d64835f705ee72c7002 + languageName: node + linkType: hard + +"is-svg@npm:^2.0.0": + version: 2.1.0 + resolution: "is-svg@npm:2.1.0" + dependencies: + html-comment-regex: "npm:^1.1.0" + checksum: 10c0/b2709e619c6159dabd27731c7ff69b73319bc8694b1dd27dc886026a6e1f895f04c1cc9903ca90310d3766a5f2d01a959735ae9a69be71f3cc9545f8206e1bb9 + languageName: node + linkType: hard + +"is-what@npm:^3.14.1": + version: 3.14.1 + resolution: "is-what@npm:3.14.1" + checksum: 10c0/4b770b85454c877b6929a84fd47c318e1f8c2ff70fd72fd625bc3fde8e0c18a6e57345b6e7aa1ee9fbd1c608d27cfe885df473036c5c2e40cd2187250804a2c7 + languageName: node + linkType: hard + +"isarray@npm:0.0.1": + version: 0.0.1 + resolution: "isarray@npm:0.0.1" + checksum: 10c0/ed1e62da617f71fe348907c71743b5ed550448b455f8d269f89a7c7ddb8ae6e962de3dab6a74a237b06f5eb7f6ece7a45ada8ce96d87fe972926530f91ae3311 + languageName: node + linkType: hard + +"isarray@npm:^1.0.0, isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^4.0.0": + version: 4.0.0 + resolution: "isexe@npm:4.0.0" + checksum: 10c0/5884815115bceac452877659a9c7726382531592f43dc29e5d48b7c4100661aed54018cb90bd36cb2eaeba521092570769167acbb95c18d39afdccbcca06c5ce + languageName: node + linkType: hard + +"jquery-datetimepicker@npm:^2.5.21": + version: 2.5.21 + resolution: "jquery-datetimepicker@npm:2.5.21" + dependencies: + jquery: "npm:>= 1.7.2" + jquery-mousewheel: "npm:>= 3.1.13" + php-date-formatter: "npm:^1.3.4" + checksum: 10c0/e8d91b51cbf41379d4d357d697a7a613427703f4a42f6dc8aed3f9f932431f02a8ebda14327c80b2db00b69fa172070e6daa5c0e97b199f922c28172ce3ec56f + languageName: node + linkType: hard + +"jquery-mousewheel@npm:>= 3.1.13": + version: 3.1.13 + resolution: "jquery-mousewheel@npm:3.1.13" + checksum: 10c0/acd57dfe7d2268ddddb906cfca6316fb364aeb74dc4d15379baa60c88b5fd3cc0aa7830e09cb6e702a4de9306e467519f147396e49f2f9c9f2c7118537721fab + languageName: node + linkType: hard + +"jquery@npm:>= 1.7.2, jquery@npm:>=1.10": + version: 3.6.0 + resolution: "jquery@npm:3.6.0" + checksum: 10c0/45a63f8376a8918087c0277b2394dd382fcacff765c41ccbb5009a9336f8c971bf41c6a0519062edc1dff6333d96959c3a3ec55c95eb6c94d5372253d6cbf82f + languageName: node + linkType: hard + +"js-base64@npm:^2.1.9": + version: 2.6.4 + resolution: "js-base64@npm:2.6.4" + checksum: 10c0/95d93c4eca0bbe0f2d5ffe8682d9acd23051e5c0ad71873ff5a48dd46a5f19025de9f7b36e63fa3f02f342ae4a8ca4c56e7b590d7300ebb6639ce09675e0fd02 + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.0 || ^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.2": + version: 3.0.2 + resolution: "js-tokens@npm:3.0.2" + checksum: 10c0/e3c3ee4d12643d90197628eb022a2884a15f08ea7dcac1ce97fdeee43031fbfc7ede674f2cdbbb582dcd4c94388b22e52d56c6cbeb2ac7d1b57c2f33c405e2ba + languageName: node + linkType: hard + +"js-yaml@npm:~3.7.0": + version: 3.7.0 + resolution: "js-yaml@npm:3.7.0" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^2.6.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/e236852d4439c7750c810f217ca80631844cfb0e4ab4993349c3e612ee273256d9895e1bb06b3990a3cc42fa1105ffcaa55a6b711f25901c0d803287bdcf52e1 + languageName: node + linkType: hard + +"jsesc@npm:^1.3.0": + version: 1.3.0 + resolution: "jsesc@npm:1.3.0" + bin: + jsesc: bin/jsesc + checksum: 10c0/62420889dd46b4cdba4df20fe6ffdefa6eeab7532fb4079170ea1b53c45d5a6abcb485144905833e5a69cc1735db12319b1e0b0f9a556811ec926b57a22318a7 + languageName: node + linkType: hard + +"json-loader@npm:^0.5.1, json-loader@npm:^0.5.4": + version: 0.5.7 + resolution: "json-loader@npm:0.5.7" + checksum: 10c0/b155b81f644693b5418e595c127c552c34373f749d2d125df24cfe753de6b3b0af88dda5d58e7b65940ed03ec46c19fc3d09f53b932b45c9ae3ca1fb55e44a15 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json3@npm:^3.3.2": + version: 3.3.3 + resolution: "json3@npm:3.3.3" + checksum: 10c0/ca6942dbcef852c8fda5a87261b82dfa9135b43777cd05bdfc08d071592bd328e289c78eb15d0c45884d9cfe71a2a20601aaa9be16e98d488b5a2f51ee91f259 + languageName: node + linkType: hard + +"json5@npm:^0.5.0, json5@npm:^0.5.1": + version: 0.5.1 + resolution: "json5@npm:0.5.1" + bin: + json5: lib/cli.js + checksum: 10c0/aca0ab7ccf1883d3fc2ecc16219bc389716a773f774552817deaadb549acc0bb502e317a81946fc0a48f9eb6e0822cf1dc5a097009203f2c94de84c8db02a1f3 + languageName: node + linkType: hard + +"json5@npm:^1.0.1": + version: 1.0.1 + resolution: "json5@npm:1.0.1" + dependencies: + minimist: "npm:^1.2.0" + bin: + json5: lib/cli.js + checksum: 10c0/7f75dd797151680a4e14c4224c1343b32a43272aa6e6333ddec2b0822df4ea116971689b251879a1248592da24f7929902c13f83d7390c3f3d44f18e8e9719f5 + languageName: node + linkType: hard + +"keen-js@npm:^3.0.0": + version: 3.5.0 + resolution: "keen-js@npm:3.5.0" + dependencies: + JSON2: "npm:^0.1.0" + browserify-versionify: "npm:1.0.3" + component-emitter: "npm:^1.1.3" + domready: "npm:0.3.0" + json3: "npm:^3.3.2" + spin.js: "npm:^2.0.1" + superagent: "npm:^1.8.3" + checksum: 10c0/ebaf9e5f04e61fe15bf69c7fe50c231431784bae28c9b215a4dab8b173a6e73dec5cd56c4d27b561591997b532758047614af1ab8ef37f42dbfeb0dde477673d + languageName: node + linkType: hard + +"klona@npm:^2.0.4": + version: 2.0.5 + resolution: "klona@npm:2.0.5" + checksum: 10c0/5b752c11ca8e2996612386699f52cc5aed802aa4116663d26239ac0b054fae25191dacb95587ecf1a167b039daa9fc3fa2da17dfd5d0821f3037de3821d9a9e5 + languageName: node + linkType: hard + +"knockout@npm:3.5.1": + version: 3.5.1 + resolution: "knockout@npm:3.5.1" + checksum: 10c0/cf091711cbdcbccab12ab814b3a2f44f7b6cc00e30b08045ba514a78c369066fa7b979e07b4caad20eea3457e3b589ff86779cb214bafbc9943ff36240eb5c00 + languageName: node + linkType: hard + +"lcid@npm:^1.0.0": + version: 1.0.0 + resolution: "lcid@npm:1.0.0" + dependencies: + invert-kv: "npm:^1.0.0" + checksum: 10c0/87fb32196c3c80458778f34f71c042e114f3134a3c86c0d60ee9c94f0750e467d7ca0c005a5224ffd9d49a6e449b5e5c31e1544f1827765a0ba8747298f5980e + languageName: node + linkType: hard + +"less-loader@npm:^10.2.0": + version: 10.2.0 + resolution: "less-loader@npm:10.2.0" + dependencies: + klona: "npm:^2.0.4" + peerDependencies: + less: ^3.5.0 || ^4.0.0 + webpack: ^5.0.0 + checksum: 10c0/214f190c7139a6a005f8f505d7f05e929361b1a16eaae427be8809f722ef798d1cb6525114d9e03ab87b6fa5e3fbe2d849494016df971cb29b9c10fd9f1a5a66 + languageName: node + linkType: hard + +"less-loader@npm:~2.2.3": + version: 2.2.3 + resolution: "less-loader@npm:2.2.3" + dependencies: + loader-utils: "npm:^0.2.5" + peerDependencies: + less: ^2.3.1 + checksum: 10c0/fe0b5b5965023869b7a734d4fa5fc6a883436db36f2a7b723d55a5fd1bdd7bbdc69c1a249365693baa3e7592b311b6da0a7d8ec2ffae5a236a710b4ca3b7b277 + languageName: node + linkType: hard + +"less@npm:^4.1.2": + version: 4.1.3 + resolution: "less@npm:4.1.3" + dependencies: + copy-anything: "npm:^2.0.1" + errno: "npm:^0.1.1" + graceful-fs: "npm:^4.1.2" + image-size: "npm:~0.5.0" + make-dir: "npm:^2.1.0" + mime: "npm:^1.4.1" + needle: "npm:^3.1.0" + parse-node-version: "npm:^1.0.1" + source-map: "npm:~0.6.0" + tslib: "npm:^2.3.0" + dependenciesMeta: + errno: + optional: true + graceful-fs: + optional: true + image-size: + optional: true + make-dir: + optional: true + mime: + optional: true + needle: + optional: true + source-map: + optional: true + bin: + lessc: bin/lessc + checksum: 10c0/d67ca673a2c409a3069bb088c21976fa6a22eaf4428a23f486afa3ca57c2c004f424e7466dfc8d38a4dca25bc7b75943de5e3394d3a7841d8812cec696790e22 + languageName: node + linkType: hard + +"load-json-file@npm:^2.0.0": + version: 2.0.0 + resolution: "load-json-file@npm:2.0.0" + dependencies: + graceful-fs: "npm:^4.1.2" + parse-json: "npm:^2.2.0" + pify: "npm:^2.0.0" + strip-bom: "npm:^3.0.0" + checksum: 10c0/15cf1259361325fadfc54cd4ecc5d6729103c8873492001ba5473fb1ef753000f680c887db6c86fec69a4ede009efeb8c0c0c77b2a31bc54d2793767e25577c9 + languageName: node + linkType: hard + +"loader-runner@npm:^2.3.0": + version: 2.4.0 + resolution: "loader-runner@npm:2.4.0" + checksum: 10c0/1f723bd8318453c2d073d7befbf891ba6d2a02f22622688bf7d22e7ba527a0f9476c7fdfedc6bfa2b55c0389d9f406f3a5239ed1b33c9088d77cfed085086a1e + languageName: node + linkType: hard + +"loader-utils@npm:^0.2.16, loader-utils@npm:^0.2.5": + version: 0.2.17 + resolution: "loader-utils@npm:0.2.17" + dependencies: + big.js: "npm:^3.1.3" + emojis-list: "npm:^2.0.0" + json5: "npm:^0.5.0" + object-assign: "npm:^4.0.1" + checksum: 10c0/d6b65a0d460d2c8621f72e0471127895f4a25ea3a5d2caabf0710c8e58a904af5876834c6ad89d2fbab35e74c6e7f2f4f8137559e6e4e84b74957f4592bcab0b + languageName: node + linkType: hard + +"loader-utils@npm:^1.0.2, loader-utils@npm:^1.1.0": + version: 1.4.0 + resolution: "loader-utils@npm:1.4.0" + dependencies: + big.js: "npm:^5.2.2" + emojis-list: "npm:^3.0.0" + json5: "npm:^1.0.1" + checksum: 10c0/b3f383612c23c0adf535d61709fb3eaf864afa54dae45608e3831156b89b4b05a0a4ddc6db7d742071babe872750ba3f4f9ce89326d94f6e096dbed978fa424e + languageName: node + linkType: hard + +"locate-path@npm:^2.0.0": + version: 2.0.0 + resolution: "locate-path@npm:2.0.0" + dependencies: + p-locate: "npm:^2.0.0" + path-exists: "npm:^3.0.0" + checksum: 10c0/24efa0e589be6aa3c469b502f795126b26ab97afa378846cb508174211515633b770aa0ba610cab113caedab8d2a4902b061a08aaed5297c12ab6f5be4df0133 + languageName: node + linkType: hard + +"lodash.camelcase@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.camelcase@npm:4.3.0" + checksum: 10c0/fcba15d21a458076dd309fce6b1b4bf611d84a0ec252cb92447c948c533ac250b95d2e00955801ebc367e5af5ed288b996d75d37d2035260a937008e14eaf432 + languageName: node + linkType: hard + +"lodash.memoize@npm:^4.1.2": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 10c0/c8713e51eccc650422716a14cece1809cfe34bc5ab5e242b7f8b4e2241c2483697b971a604252807689b9dd69bfe3a98852e19a5b89d506b000b4187a1285df8 + languageName: node + linkType: hard + +"lodash.uniq@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.uniq@npm:4.5.0" + checksum: 10c0/262d400bb0952f112162a320cc4a75dea4f66078b9e7e3075ffbc9c6aa30b3e9df3cf20e7da7d566105e1ccf7804e4fbd7d804eee0b53de05d83f16ffbf41c5e + languageName: node + linkType: hard + +"lodash@npm:^4.17.14, lodash@npm:^4.17.4": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + languageName: node + linkType: hard + +"loose-envify@npm:^1.0.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: "npm:^3.0.0 || ^4.0.0" + bin: + loose-envify: cli.js + checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e + languageName: node + linkType: hard + +"lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1": + version: 11.2.7 + resolution: "lru-cache@npm:11.2.7" + checksum: 10c0/549cdb59488baa617135fc12159cafb1a97f91079f35093bb3bcad72e849fc64ace636d244212c181dfdf1a99bbfa90757ff303f98561958ee4d0f885d9bd5f7 + languageName: node + linkType: hard + +"lru-cache@npm:^4.0.1, lru-cache@npm:^4.1.1": + version: 4.1.5 + resolution: "lru-cache@npm:4.1.5" + dependencies: + pseudomap: "npm:^1.0.2" + yallist: "npm:^2.1.2" + checksum: 10c0/1ca5306814e5add9ec63556d6fd9b24a4ecdeaef8e9cea52cbf30301e6b88c8d8ddc7cab45b59b56eb763e6c45af911585dc89925a074ab65e1502e3fe8103cf + languageName: node + linkType: hard + +"make-dir@npm:^1.0.0": + version: 1.3.0 + resolution: "make-dir@npm:1.3.0" + dependencies: + pify: "npm:^3.0.0" + checksum: 10c0/5eb94f47d7ef41d89d1b8eef6539b8950d5bd99eeba093a942bfd327faa37d2d62227526b88b73633243a2ec7972d21eb0f4e5d62ae4e02a79e389f4a7bb3022 + languageName: node + linkType: hard + +"make-dir@npm:^2.1.0": + version: 2.1.0 + resolution: "make-dir@npm:2.1.0" + dependencies: + pify: "npm:^4.0.1" + semver: "npm:^5.6.0" + checksum: 10c0/ada869944d866229819735bee5548944caef560d7a8536ecbc6536edca28c72add47cc4f6fc39c54fb25d06b58da1f8994cf7d9df7dadea047064749efc085d8 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^15.0.0": + version: 15.0.5 + resolution: "make-fetch-happen@npm:15.0.5" + dependencies: + "@gar/promise-retry": "npm:^1.0.0" + "@npmcli/agent": "npm:^4.0.0" + "@npmcli/redact": "npm:^4.0.0" + cacache: "npm:^20.0.1" + http-cache-semantics: "npm:^4.1.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^5.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^1.0.0" + proc-log: "npm:^6.0.0" + ssri: "npm:^13.0.0" + checksum: 10c0/527580eb5e5476e6ad07a4e3bd017d13e935f4be815674b442081ae5a721c13d3af5715006619e6be79a85723067e047f83a0c9e699f41d8cec43609a8de4f7b + languageName: node + linkType: hard + +"math-expression-evaluator@npm:^1.2.14": + version: 1.3.14 + resolution: "math-expression-evaluator@npm:1.3.14" + checksum: 10c0/a98dcb54510f57d9d78c66f73c6ee5e8e3a69d7dcfd3f0e611bc6957a764f23fed3b342888fca79ed49b865b09338581d19bb3acc4d788ee308618c7c7cdca10 + languageName: node + linkType: hard + +"md5.js@npm:^1.3.4": + version: 1.3.5 + resolution: "md5.js@npm:1.3.5" + dependencies: + hash-base: "npm:^3.0.0" + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: 10c0/b7bd75077f419c8e013fc4d4dada48be71882e37d69a44af65a2f2804b91e253441eb43a0614423a1c91bb830b8140b0dc906bc797245e2e275759584f4efcc5 + languageName: node + linkType: hard + +"md5@npm:^2.2.1": + version: 2.3.0 + resolution: "md5@npm:2.3.0" + dependencies: + charenc: "npm:0.0.2" + crypt: "npm:0.0.2" + is-buffer: "npm:~1.1.6" + checksum: 10c0/14a21d597d92e5b738255fbe7fe379905b8cb97e0a49d44a20b58526a646ec5518c337b817ce0094ca94d3e81a3313879c4c7b510d250c282d53afbbdede9110 + languageName: node + linkType: hard + +"mem@npm:^1.1.0": + version: 1.1.0 + resolution: "mem@npm:1.1.0" + dependencies: + mimic-fn: "npm:^1.0.0" + checksum: 10c0/f5150bb975a7d641375d3c1962426bf338952142a429ce01e9792b03df9b63d5911d3feb7e5e50f406531ace646f3fbe39b7dc716c729d617a28b3bbdc799649 + languageName: node + linkType: hard + +"memory-fs@npm:^0.4.0, memory-fs@npm:~0.4.1": + version: 0.4.1 + resolution: "memory-fs@npm:0.4.1" + dependencies: + errno: "npm:^0.1.3" + readable-stream: "npm:^2.0.1" + checksum: 10c0/f114c44ad8285103cb0e71420cf5bb628d3eb6cbd918197f5951590ff56ba2072f4a97924949c170320cdf180d2da4e8d16a0edd92ba0ca2d2de51dc932841e2 + languageName: node + linkType: hard + +"methods@npm:~1.1.1": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 + languageName: node + linkType: hard + +"miller-rabin@npm:^4.0.0": + version: 4.0.1 + resolution: "miller-rabin@npm:4.0.1" + dependencies: + bn.js: "npm:^4.0.0" + brorand: "npm:^1.0.1" + bin: + miller-rabin: bin/miller-rabin + checksum: 10c0/26b2b96f6e49dbcff7faebb78708ed2f5f9ae27ac8cbbf1d7c08f83cf39bed3d418c0c11034dce997da70d135cc0ff6f3a4c15dc452f8e114c11986388a64346 + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-types@npm:^2.1.3": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mime@npm:1.3.4": + version: 1.3.4 + resolution: "mime@npm:1.3.4" + bin: + mime: cli.js + checksum: 10c0/06ca13fe3be58eedfadc4351ca735c19ad25f2f8f0ecc746c1b2e780934829cc0e4b303269f0abfc919ecb6f149f1b648700f996d2b7935fb23208f7357438d4 + languageName: node + linkType: hard + +"mime@npm:^1.4.1": + version: 1.6.0 + resolution: "mime@npm:1.6.0" + bin: + mime: cli.js + checksum: 10c0/b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 + languageName: node + linkType: hard + +"mimic-fn@npm:^1.0.0": + version: 1.2.0 + resolution: "mimic-fn@npm:1.2.0" + checksum: 10c0/ad55214aec6094c0af4c0beec1a13787556f8116ed88807cf3f05828500f21f93a9482326bcd5a077ae91e3e8795b4e76b5b4c8bb12237ff0e4043a365516cba + languageName: node + linkType: hard + +"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd + languageName: node + linkType: hard + +"minimalistic-crypto-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-crypto-utils@npm:1.0.1" + checksum: 10c0/790ecec8c5c73973a4fbf2c663d911033e8494d5fb0960a4500634766ab05d6107d20af896ca2132e7031741f19888154d44b2408ada0852446705441383e9f8 + languageName: node + linkType: hard + +"minimatch@npm:^10.2.2": + version: 10.2.4 + resolution: "minimatch@npm:10.2.4" + dependencies: + brace-expansion: "npm:^5.0.2" + checksum: 10c0/35f3dfb7b99b51efd46afd378486889f590e7efb10e0f6a10ba6800428cf65c9a8dedb74427d0570b318d749b543dc4e85f06d46d2858bc8cac7e1eb49a95945 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.6": + version: 1.2.6 + resolution: "minimist@npm:1.2.6" + checksum: 10c0/d0b566204044481c4401abbd24cc75814e753b37268e7fe7ccc78612bf3e37bf1e45a6c43fb0b119445ea1c413c000bde013f320b7211974f2f49bcbec1d0dbf + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^5.0.0": + version: 5.0.2 + resolution: "minipass-fetch@npm:5.0.2" + dependencies: + iconv-lite: "npm:^0.7.2" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^2.0.0" + minizlib: "npm:^3.0.1" + dependenciesMeta: + iconv-lite: + optional: true + checksum: 10c0/ce4ab9f21cfabaead2097d95dd33f485af8072fbc6b19611bce694965393453a1639d641c2bcf1c48f2ea7d41ea7fab8278373f1d0bee4e63b0a5b2cdd0ef649 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^2.0.0": + version: 2.0.0 + resolution: "minipass-sized@npm:2.0.0" + dependencies: + minipass: "npm:^7.1.2" + checksum: 10c0/f9201696a6f6d68610d04c9c83e3d2e5cb9c026aae1c8cbf7e17f386105cb79c1bb088dbc21bf0b1eb4f3fb5df384fd1e7aa3bf1f33868c416ae8c8a92679db8 + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2, minipass@npm:^7.1.3": + version: 7.1.3 + resolution: "minipass@npm:7.1.3" + checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb + languageName: node + linkType: hard + +"minizlib@npm:^3.0.1, minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" + dependencies: + minipass: "npm:^7.1.2" + checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec + languageName: node + linkType: hard + +"mississippi@npm:^2.0.0": + version: 2.0.0 + resolution: "mississippi@npm:2.0.0" + dependencies: + concat-stream: "npm:^1.5.0" + duplexify: "npm:^3.4.2" + end-of-stream: "npm:^1.1.0" + flush-write-stream: "npm:^1.0.0" + from2: "npm:^2.1.0" + parallel-transform: "npm:^1.1.0" + pump: "npm:^2.0.1" + pumpify: "npm:^1.3.3" + stream-each: "npm:^1.1.0" + through2: "npm:^2.0.0" + checksum: 10c0/f84beaa40491c2466c4a3d15025ceb1ecc822a8e5ef4f6e5622aeb832b32e4eda056c3982337ae2c1e4b3b77fb431af4d3874923c26dee0c026601547589b2db + languageName: node + linkType: hard + +"mkdirp@npm:^0.5.1, mkdirp@npm:~0.5.0, mkdirp@npm:~0.5.1": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" + dependencies: + minimist: "npm:^1.2.6" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/e2e2be789218807b58abced04e7b49851d9e46e88a2f9539242cc8a92c9b5c3a0b9bab360bd3014e02a140fc4fbc58e31176c408b493f8a2a6f4986bd7527b01 + languageName: node + linkType: hard + +"move-concurrently@npm:^1.0.1": + version: 1.0.1 + resolution: "move-concurrently@npm:1.0.1" + dependencies: + aproba: "npm:^1.1.1" + copy-concurrently: "npm:^1.0.0" + fs-write-stream-atomic: "npm:^1.0.8" + mkdirp: "npm:^0.5.1" + rimraf: "npm:^2.5.4" + run-queue: "npm:^1.0.3" + checksum: 10c0/0fe81acf3bbbc322013c2f4ee4a48cf8d180a7d925fb9284c0f1f444e862d7eb0421ee074b68d35357a12f0d5e94a322049dc9da480672331b5b8895743eb66a + languageName: node + linkType: hard + +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d + languageName: node + linkType: hard + +"ms@npm:^2.1.1, ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"needle@npm:^3.1.0": + version: 3.1.0 + resolution: "needle@npm:3.1.0" + dependencies: + debug: "npm:^3.2.6" + iconv-lite: "npm:^0.6.3" + sax: "npm:^1.2.4" + bin: + needle: bin/needle + checksum: 10c0/b55e169878b7480a8d09bcfcd5614e7b96aa2f04af7e0f86e446c022eaac35dd7aed694aa4a9e751741e574e1f648d3ff388b16c2528787fee49ed5bf02853e0 + languageName: node + linkType: hard + +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b + languageName: node + linkType: hard + +"next-tick@npm:^1.1.0": + version: 1.1.0 + resolution: "next-tick@npm:1.1.0" + checksum: 10c0/3ba80dd805fcb336b4f52e010992f3e6175869c8d88bf4ff0a81d5d66e6049f89993463b28211613e58a6b7fe93ff5ccbba0da18d4fa574b96289e8f0b577f28 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 12.2.0 + resolution: "node-gyp@npm:12.2.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^15.0.0" + nopt: "npm:^9.0.0" + proc-log: "npm:^6.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.5.4" + tinyglobby: "npm:^0.2.12" + which: "npm:^6.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/3ed046746a5a7d90950cd8b0547332b06598443f31fe213ef4332a7174c7b7d259e1704835feda79b87d3f02e59d7791842aac60642ede4396ab25fdf0f8f759 + languageName: node + linkType: hard + +"node-libs-browser@npm:^2.0.0": + version: 2.2.1 + resolution: "node-libs-browser@npm:2.2.1" + dependencies: + assert: "npm:^1.1.1" + browserify-zlib: "npm:^0.2.0" + buffer: "npm:^4.3.0" + console-browserify: "npm:^1.1.0" + constants-browserify: "npm:^1.0.0" + crypto-browserify: "npm:^3.11.0" + domain-browser: "npm:^1.1.1" + events: "npm:^3.0.0" + https-browserify: "npm:^1.0.0" + os-browserify: "npm:^0.3.0" + path-browserify: "npm:0.0.1" + process: "npm:^0.11.10" + punycode: "npm:^1.2.4" + querystring-es3: "npm:^0.2.0" + readable-stream: "npm:^2.3.3" + stream-browserify: "npm:^2.0.1" + stream-http: "npm:^2.7.2" + string_decoder: "npm:^1.0.0" + timers-browserify: "npm:^2.0.4" + tty-browserify: "npm:0.0.0" + url: "npm:^0.11.0" + util: "npm:^0.11.0" + vm-browserify: "npm:^1.0.1" + checksum: 10c0/0e05321a6396408903ed642231d2bca7dd96492d074c7af161ba06a63c95378bd3de50b4105eccbbc02d93ba3da69f0ff5e624bc2a8c92ca462ceb6a403e7986 + languageName: node + linkType: hard + +"nopt@npm:^9.0.0": + version: 9.0.0 + resolution: "nopt@npm:9.0.0" + dependencies: + abbrev: "npm:^4.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/1822eb6f9b020ef6f7a7516d7b64a8036e09666ea55ac40416c36e4b2b343122c3cff0e2f085675f53de1d2db99a2a89a60ccea1d120bcd6a5347bf6ceb4a7fd + languageName: node + linkType: hard + +"normalize-package-data@npm:^2.3.2": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" + dependencies: + hosted-git-info: "npm:^2.1.4" + resolve: "npm:^1.10.0" + semver: "npm:2 || 3 || 4 || 5" + validate-npm-package-license: "npm:^3.0.1" + checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 + languageName: node + linkType: hard + +"normalize-range@npm:^0.1.2": + version: 0.1.2 + resolution: "normalize-range@npm:0.1.2" + checksum: 10c0/bf39b73a63e0a42ad1a48c2bd1bda5a07ede64a7e2567307a407674e595bcff0fa0d57e8e5f1e7fa5e91000797c7615e13613227aaaa4d6d6e87f5bd5cc95de6 + languageName: node + linkType: hard + +"normalize-url@npm:^1.4.0": + version: 1.9.1 + resolution: "normalize-url@npm:1.9.1" + dependencies: + object-assign: "npm:^4.0.1" + prepend-http: "npm:^1.0.0" + query-string: "npm:^4.1.0" + sort-keys: "npm:^1.0.0" + checksum: 10c0/5ecd525f743c3fb5370d2bab8e78446f3e3bd7c0c97a5fd3f0bc0c5f396fbd117d13c9118766128d25ed575755cb539dc33a38419f18ca9d8577c8d1cd7a8daf + languageName: node + linkType: hard + +"npm-run-path@npm:^2.0.0": + version: 2.0.2 + resolution: "npm-run-path@npm:2.0.2" + dependencies: + path-key: "npm:^2.0.0" + checksum: 10c0/95549a477886f48346568c97b08c4fda9cdbf7ce8a4fbc2213f36896d0d19249e32d68d7451bdcbca8041b5fba04a6b2c4a618beaf19849505c05b700740f1de + languageName: node + linkType: hard + +"num2fraction@npm:^1.2.2": + version: 1.2.2 + resolution: "num2fraction@npm:1.2.2" + checksum: 10c0/3bf17b44af00508a2b0370146629710645c3e3ff3c052893680efe3f4a6ff5c953ce9e54734013b02b35744a49352d54fbc5d8b455fac979047ef17dd8ec74bd + languageName: node + linkType: hard + +"number-is-nan@npm:^1.0.0": + version: 1.0.1 + resolution: "number-is-nan@npm:1.0.1" + checksum: 10c0/cb97149006acc5cd512c13c1838223abdf202e76ddfa059c5e8e7507aff2c3a78cd19057516885a2f6f5b576543dc4f7b6f3c997cc7df53ae26c260855466df5 + languageName: node + linkType: hard + +"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 + languageName: node + linkType: hard + +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"os-browserify@npm:^0.3.0": + version: 0.3.0 + resolution: "os-browserify@npm:0.3.0" + checksum: 10c0/6ff32cb1efe2bc6930ad0fd4c50e30c38010aee909eba8d65be60af55efd6cbb48f0287e3649b4e3f3a63dce5a667b23c187c4293a75e557f0d5489d735bcf52 + languageName: node + linkType: hard + +"os-homedir@npm:^1.0.0": + version: 1.0.2 + resolution: "os-homedir@npm:1.0.2" + checksum: 10c0/6be4aa67317ee247b8d46142e243fb4ef1d2d65d3067f54bfc5079257a2f4d4d76b2da78cba7af3cb3f56dbb2e4202e0c47f26171d11ca1ed4008d842c90363f + languageName: node + linkType: hard + +"os-locale@npm:^2.0.0": + version: 2.1.0 + resolution: "os-locale@npm:2.1.0" + dependencies: + execa: "npm:^0.7.0" + lcid: "npm:^1.0.0" + mem: "npm:^1.1.0" + checksum: 10c0/6f1acc060552a59f477ab541e9149a712f93a4d7b5262d070698dbe98cf047f35c7685d759a86dc56c12b76fdfbab1bf7216a74232263efbe7365de2a5d70834 + languageName: node + linkType: hard + +"os-tmpdir@npm:^1.0.1": + version: 1.0.2 + resolution: "os-tmpdir@npm:1.0.2" + checksum: 10c0/f438450224f8e2687605a8dd318f0db694b6293c5d835ae509a69e97c8de38b6994645337e5577f5001115470414638978cc49da1cdcc25106dad8738dc69990 + languageName: node + linkType: hard + +"p-finally@npm:^1.0.0": + version: 1.0.0 + resolution: "p-finally@npm:1.0.0" + checksum: 10c0/6b8552339a71fe7bd424d01d8451eea92d379a711fc62f6b2fe64cad8a472c7259a236c9a22b4733abca0b5666ad503cb497792a0478c5af31ded793d00937e7 + languageName: node + linkType: hard + +"p-limit@npm:^1.1.0": + version: 1.3.0 + resolution: "p-limit@npm:1.3.0" + dependencies: + p-try: "npm:^1.0.0" + checksum: 10c0/5c1b1d53d180b2c7501efb04b7c817448e10efe1ba46f4783f8951994d5027e4cd88f36ad79af50546682594c4ebd11702ac4b9364c47f8074890e2acad0edee + languageName: node + linkType: hard + +"p-locate@npm:^2.0.0": + version: 2.0.0 + resolution: "p-locate@npm:2.0.0" + dependencies: + p-limit: "npm:^1.1.0" + checksum: 10c0/82da4be88fb02fd29175e66021610c881938d3cc97c813c71c1a605fac05617d57fd5d3b337494a6106c0edb2a37c860241430851411f1b265108cead34aee67 + languageName: node + linkType: hard + +"p-map@npm:^7.0.2": + version: 7.0.4 + resolution: "p-map@npm:7.0.4" + checksum: 10c0/a5030935d3cb2919d7e89454d1ce82141e6f9955413658b8c9403cfe379283770ed3048146b44cde168aa9e8c716505f196d5689db0ae3ce9a71521a2fef3abd + languageName: node + linkType: hard + +"p-try@npm:^1.0.0": + version: 1.0.0 + resolution: "p-try@npm:1.0.0" + checksum: 10c0/757ba31de5819502b80c447826fac8be5f16d3cb4fbf9bc8bc4971dba0682e84ac33e4b24176ca7058c69e29f64f34d8d9e9b08e873b7b7bb0aa89d620fa224a + languageName: node + linkType: hard + +"pako@npm:~1.0.5": + version: 1.0.11 + resolution: "pako@npm:1.0.11" + checksum: 10c0/86dd99d8b34c3930345b8bbeb5e1cd8a05f608eeb40967b293f72fe469d0e9c88b783a8777e4cc7dc7c91ce54c5e93d88ff4b4f060e6ff18408fd21030d9ffbe + languageName: node + linkType: hard + +"parallel-transform@npm:^1.1.0": + version: 1.2.0 + resolution: "parallel-transform@npm:1.2.0" + dependencies: + cyclist: "npm:^1.0.1" + inherits: "npm:^2.0.3" + readable-stream: "npm:^2.1.5" + checksum: 10c0/ab0e58569e73681ca4b9c9228189bdb6cbea535295fae344cf0d8342fd33a950961914f3c414f81894c1498fb9ad1c079b4625d2b7ceae9e6ab812f22e3bea3f + languageName: node + linkType: hard + +"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.5": + version: 5.1.6 + resolution: "parse-asn1@npm:5.1.6" + dependencies: + asn1.js: "npm:^5.2.0" + browserify-aes: "npm:^1.0.0" + evp_bytestokey: "npm:^1.0.0" + pbkdf2: "npm:^3.0.3" + safe-buffer: "npm:^5.1.1" + checksum: 10c0/4ed1d9b9e120c5484d29d67bb90171aac0b73422bc016d6294160aea983275c28a27ab85d862059a36a86a97dd31b7ddd97486802ca9fac67115fe3409e9dcbd + languageName: node + linkType: hard + +"parse-json@npm:^2.2.0": + version: 2.2.0 + resolution: "parse-json@npm:2.2.0" + dependencies: + error-ex: "npm:^1.2.0" + checksum: 10c0/7a90132aa76016f518a3d5d746a21b3f1ad0f97a68436ed71b6f995b67c7151141f5464eea0c16c59aec9b7756519a0e3007a8f98cf3714632d509ec07736df6 + languageName: node + linkType: hard + +"parse-node-version@npm:^1.0.1": + version: 1.0.1 + resolution: "parse-node-version@npm:1.0.1" + checksum: 10c0/999cd3d7da1425c2e182dce82b226c6dc842562d3ed79ec47f5c719c32a7f6c1a5352495b894fc25df164be7f2ede4224758255da9902ddef81f2b77ba46bb2c + languageName: node + linkType: hard + +"path-browserify@npm:0.0.1": + version: 0.0.1 + resolution: "path-browserify@npm:0.0.1" + checksum: 10c0/3d59710cddeea06509d91935196185900f3d9d29376dff68ff0e146fbd41d0fb304e983d0158f30cabe4dd2ffcc6a7d3d977631994ee984c88e66aed50a1ccd3 + languageName: node + linkType: hard + +"path-exists@npm:^2.0.0": + version: 2.1.0 + resolution: "path-exists@npm:2.1.0" + dependencies: + pinkie-promise: "npm:^2.0.0" + checksum: 10c0/87352f1601c085d5a6eb202f60e5c016c1b790bd0bc09398af446ed3f5c4510b4531ff99cf8acac2d91868886e792927b4292f768b35a83dce12588fb7cbb46e + languageName: node + linkType: hard + +"path-exists@npm:^3.0.0": + version: 3.0.0 + resolution: "path-exists@npm:3.0.0" + checksum: 10c0/17d6a5664bc0a11d48e2b2127d28a0e58822c6740bde30403f08013da599182289c56518bec89407e3f31d3c2b6b296a4220bc3f867f0911fee6952208b04167 + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0, path-is-absolute@npm:^1.0.1": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-key@npm:^2.0.0": + version: 2.0.1 + resolution: "path-key@npm:2.0.1" + checksum: 10c0/dd2044f029a8e58ac31d2bf34c34b93c3095c1481942960e84dd2faa95bbb71b9b762a106aead0646695330936414b31ca0bd862bf488a937ad17c8c5d73b32b + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-scurry@npm:^2.0.2": + version: 2.0.2 + resolution: "path-scurry@npm:2.0.2" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10c0/b35ad37cf6557a87fd057121ce2be7695380c9138d93e87ae928609da259ea0a170fac6f3ef1eb3ece8a068e8b7f2f3adf5bb2374cf4d4a57fe484954fcc9482 + languageName: node + linkType: hard + +"path-type@npm:^2.0.0": + version: 2.0.0 + resolution: "path-type@npm:2.0.0" + dependencies: + pify: "npm:^2.0.0" + checksum: 10c0/e475cead839e65a2f8fdde634b24a4116b49daea3917470552e19d49c63e59ef17963bec2f57df2c72a85fcd1f86c8850d9742e68dba9c9c8d9bcac38bab03d6 + languageName: node + linkType: hard + +"pbkdf2@npm:^3.0.3": + version: 3.1.2 + resolution: "pbkdf2@npm:3.1.2" + dependencies: + create-hash: "npm:^1.1.2" + create-hmac: "npm:^1.1.4" + ripemd160: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + sha.js: "npm:^2.4.8" + checksum: 10c0/5a30374e87d33fa080a92734d778cf172542cc7e41b96198c4c88763997b62d7850de3fbda5c3111ddf79805ee7c1da7046881c90ac4920b5e324204518b05fd + languageName: node + linkType: hard + +"php-date-formatter@npm:^1.3.4": + version: 1.3.6 + resolution: "php-date-formatter@npm:1.3.6" + checksum: 10c0/758a752df7aa6b8febbf41f3b049b841adfcc6beae5d2aae7a4e86fdf63b8cbfbcb32e78fd27287992b3dd52ad2f1f41504e1ed8c8a337eab1ab67a871d2b10a + languageName: node + linkType: hard + +"picomatch@npm:^4.0.3": + version: 4.0.3 + resolution: "picomatch@npm:4.0.3" + checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 + languageName: node + linkType: hard + +"pify@npm:^2.0.0": + version: 2.3.0 + resolution: "pify@npm:2.3.0" + checksum: 10c0/551ff8ab830b1052633f59cb8adc9ae8407a436e06b4a9718bcb27dc5844b83d535c3a8512b388b6062af65a98c49bdc0dd523d8b2617b188f7c8fee457158dc + languageName: node + linkType: hard + +"pify@npm:^3.0.0": + version: 3.0.0 + resolution: "pify@npm:3.0.0" + checksum: 10c0/fead19ed9d801f1b1fcd0638a1ac53eabbb0945bf615f2f8806a8b646565a04a1b0e7ef115c951d225f042cca388fdc1cd3add46d10d1ed6951c20bd2998af10 + languageName: node + linkType: hard + +"pify@npm:^4.0.1": + version: 4.0.1 + resolution: "pify@npm:4.0.1" + checksum: 10c0/6f9d404b0d47a965437403c9b90eca8bb2536407f03de165940e62e72c8c8b75adda5516c6b9b23675a5877cc0bcac6bdfb0ef0e39414cd2476d5495da40e7cf + languageName: node + linkType: hard + +"pinkie-promise@npm:^2.0.0": + version: 2.0.1 + resolution: "pinkie-promise@npm:2.0.1" + dependencies: + pinkie: "npm:^2.0.0" + checksum: 10c0/11b5e5ce2b090c573f8fad7b517cbca1bb9a247587306f05ae71aef6f9b2cd2b923c304aa9663c2409cfde27b367286179f1379bc4ec18a3fbf2bb0d473b160a + languageName: node + linkType: hard + +"pinkie@npm:^2.0.0": + version: 2.0.4 + resolution: "pinkie@npm:2.0.4" + checksum: 10c0/25228b08b5597da42dc384221aa0ce56ee0fbf32965db12ba838e2a9ca0193c2f0609c45551ee077ccd2060bf109137fdb185b00c6d7e0ed7e35006d20fdcbc6 + languageName: node + linkType: hard + +"pkg-dir@npm:^1.0.0": + version: 1.0.0 + resolution: "pkg-dir@npm:1.0.0" + dependencies: + find-up: "npm:^1.0.0" + checksum: 10c0/aa4c0322b5804fee90081ecc79f89b00922016ff56415a8e6bbafb19833e1bd8001a8999571599fb3212719d4e74e1fdb48338f6ff5b57d857a32cc939701e1a + languageName: node + linkType: hard + +"pkg-dir@npm:^2.0.0": + version: 2.0.0 + resolution: "pkg-dir@npm:2.0.0" + dependencies: + find-up: "npm:^2.1.0" + checksum: 10c0/7cdc46c4921bf2c5f9a438851d16243ddde9906928116647ec7784982dd9038ea61c964fbca6f489201845742188180ecd1001b4f69781de1d1dc7d100b14089 + languageName: node + linkType: hard + +"postcss-calc@npm:^5.2.0": + version: 5.3.1 + resolution: "postcss-calc@npm:5.3.1" + dependencies: + postcss: "npm:^5.0.2" + postcss-message-helpers: "npm:^2.0.0" + reduce-css-calc: "npm:^1.2.6" + checksum: 10c0/96444e979f0e7ef2c6e15d545a05c4ebc05eaa00d1743c9181c1008fb0cc06c926242e50b600ef627d9bd418c3fd24adb6732c482eeed0de8e60b64c1c105176 + languageName: node + linkType: hard + +"postcss-colormin@npm:^2.1.8": + version: 2.2.2 + resolution: "postcss-colormin@npm:2.2.2" + dependencies: + colormin: "npm:^1.0.5" + postcss: "npm:^5.0.13" + postcss-value-parser: "npm:^3.2.3" + checksum: 10c0/defcfa7e3c8daa0c116747acd01346867374505347e802115b2e7b476b6f74df4e67820bcd98743a0c02cd92159005d41db42e428700f873bb54647e54417e95 + languageName: node + linkType: hard + +"postcss-convert-values@npm:^2.3.4": + version: 2.6.1 + resolution: "postcss-convert-values@npm:2.6.1" + dependencies: + postcss: "npm:^5.0.11" + postcss-value-parser: "npm:^3.1.2" + checksum: 10c0/3efbc1c5feaa6c2eb56da61ad2c9e784c50aad1524d9c6a5a5992da43a276ead2b2d2986c8f8647fad484eefe3e22855993b2fe1984b392c45fd82aa92e7bfb9 + languageName: node + linkType: hard + +"postcss-discard-comments@npm:^2.0.4": + version: 2.0.4 + resolution: "postcss-discard-comments@npm:2.0.4" + dependencies: + postcss: "npm:^5.0.14" + checksum: 10c0/436039351e2e6fba1358077728f51c5923cf943584394fc38b441444fe572980f08c5c7d1733a2e48fa17096cb98e8180e73b45ed2aea7baabc162943ed403dc + languageName: node + linkType: hard + +"postcss-discard-duplicates@npm:^2.0.1": + version: 2.1.0 + resolution: "postcss-discard-duplicates@npm:2.1.0" + dependencies: + postcss: "npm:^5.0.4" + checksum: 10c0/0da451c605fa8b26981f2c8a059f9231eade6616026e01834dd5b305ad6ffbaae28916d3de5fe91b6d9810e0bff69e70ffe44cae3a908e12493bc4295cbf4a6f + languageName: node + linkType: hard + +"postcss-discard-empty@npm:^2.0.1": + version: 2.1.0 + resolution: "postcss-discard-empty@npm:2.1.0" + dependencies: + postcss: "npm:^5.0.14" + checksum: 10c0/e2008b574f80cc3621c3e318e59e36895077865a48800f1c25eb688128f8d43f0402c8effc21143533fd114200e532dcfbaca9813f0d07f9e71e32b6a859afbd + languageName: node + linkType: hard + +"postcss-discard-overridden@npm:^0.1.1": + version: 0.1.1 + resolution: "postcss-discard-overridden@npm:0.1.1" + dependencies: + postcss: "npm:^5.0.16" + checksum: 10c0/e1fd38e98045966be5f64252cbd553a597bc7678f64101025b850abe66851f35219320095321e4b0e9632843b6fc64e8bfe9b390064d9725a60a623a4a88b28d + languageName: node + linkType: hard + +"postcss-discard-unused@npm:^2.2.1": + version: 2.2.3 + resolution: "postcss-discard-unused@npm:2.2.3" + dependencies: + postcss: "npm:^5.0.14" + uniqs: "npm:^2.0.0" + checksum: 10c0/0058b5f15363a5a6a0d01e28aaea98506639e52e42b49878ffc80d75ab9c4c9a8136c99ca2b5c9bf4d734469620ff5c84ab4f811a7bf9bc2e7dfd5f76e6d68fb + languageName: node + linkType: hard + +"postcss-filter-plugins@npm:^2.0.0": + version: 2.0.3 + resolution: "postcss-filter-plugins@npm:2.0.3" + dependencies: + postcss: "npm:^5.0.4" + checksum: 10c0/a6d92215995486878dddab275ef65e55fd4432f779cc27ed435df49a22232743dad3285b9db8a5b32e4a618279d3f7415a501a9a4556411ee9d408bac447c5a0 + languageName: node + linkType: hard + +"postcss-merge-idents@npm:^2.1.5": + version: 2.1.7 + resolution: "postcss-merge-idents@npm:2.1.7" + dependencies: + has: "npm:^1.0.1" + postcss: "npm:^5.0.10" + postcss-value-parser: "npm:^3.1.1" + checksum: 10c0/5ef35d2ab59ceb32ca38d597753f8468dafb0782308930df820c96f3b23e4b4e36318ad29d76f88559c6a69d9c8d6283f1900617c0b6e4504bb5ab7523c120f8 + languageName: node + linkType: hard + +"postcss-merge-longhand@npm:^2.0.1": + version: 2.0.2 + resolution: "postcss-merge-longhand@npm:2.0.2" + dependencies: + postcss: "npm:^5.0.4" + checksum: 10c0/84145e5fee9e3064f1b22bde14fe5448449e519e3866a4c59cab42866309e3912638cc7e3d900c16090577a5f94899a2b46ed3a77c721592038671ce86e5395c + languageName: node + linkType: hard + +"postcss-merge-rules@npm:^2.0.3": + version: 2.1.2 + resolution: "postcss-merge-rules@npm:2.1.2" + dependencies: + browserslist: "npm:^1.5.2" + caniuse-api: "npm:^1.5.2" + postcss: "npm:^5.0.4" + postcss-selector-parser: "npm:^2.2.2" + vendors: "npm:^1.0.0" + checksum: 10c0/aa825593d06079de4776f8ec71a05276c145aab734b66fbdea2c42bb545c2ec9fe075912ecb28d18d9c3b506784e8cf7db0951f9af287bc090f3ed7e6e72c332 + languageName: node + linkType: hard + +"postcss-message-helpers@npm:^2.0.0": + version: 2.0.0 + resolution: "postcss-message-helpers@npm:2.0.0" + checksum: 10c0/5696c59befc408b208853a57994224f717c3a81a5b7129205c3087ad2af8159e209f29b66bfed7d79a1afc709cad76c3fbba06616ca71aeec77d7d029440dc72 + languageName: node + linkType: hard + +"postcss-minify-font-values@npm:^1.0.2": + version: 1.0.5 + resolution: "postcss-minify-font-values@npm:1.0.5" + dependencies: + object-assign: "npm:^4.0.1" + postcss: "npm:^5.0.4" + postcss-value-parser: "npm:^3.0.2" + checksum: 10c0/375fc0b1943b1d1e3c61bc33c19a70853ac2cebfdb0dcac23e5324edb218cf989bd7a8877cf846eafbb2d2e7cec4b7bc70922ac9300f9304c2422d807ccd4a85 + languageName: node + linkType: hard + +"postcss-minify-gradients@npm:^1.0.1": + version: 1.0.5 + resolution: "postcss-minify-gradients@npm:1.0.5" + dependencies: + postcss: "npm:^5.0.12" + postcss-value-parser: "npm:^3.3.0" + checksum: 10c0/ce5ed6151349ee4546b860cf9f7af38d8bfb942c32b45025b82c332603e2c49f6ee76ac9bda0cf8279cd2492baa4925b3298776deea7324f5efbd6a85782f0bc + languageName: node + linkType: hard + +"postcss-minify-params@npm:^1.0.4": + version: 1.2.2 + resolution: "postcss-minify-params@npm:1.2.2" + dependencies: + alphanum-sort: "npm:^1.0.1" + postcss: "npm:^5.0.2" + postcss-value-parser: "npm:^3.0.2" + uniqs: "npm:^2.0.0" + checksum: 10c0/e48823f55e60e8dc2c44fb7810a323146bd5f9aa3384a203ee56c08b77a84d5227446a005b84371e8560dd0d6cefed667acc8cf020367c6934c7233fd890f7c8 + languageName: node + linkType: hard + +"postcss-minify-selectors@npm:^2.0.4": + version: 2.1.1 + resolution: "postcss-minify-selectors@npm:2.1.1" + dependencies: + alphanum-sort: "npm:^1.0.2" + has: "npm:^1.0.1" + postcss: "npm:^5.0.14" + postcss-selector-parser: "npm:^2.0.0" + checksum: 10c0/3fd37f12d4d4518a4c7e3e4c9a6ab8cf4757faff6d388700e5d148b9b7b6f1d1f28a6be0ffda5f0077a4e4d509fec65cef3e1343ff72d02e1945a1fba2543ac1 + languageName: node + linkType: hard + +"postcss-modules-extract-imports@npm:^1.2.0": + version: 1.2.1 + resolution: "postcss-modules-extract-imports@npm:1.2.1" + dependencies: + postcss: "npm:^6.0.1" + checksum: 10c0/5746702936c1e1b78a7b31c4e20092197aa89c4e59c156249aea861c84cd0781c11c8c4648b95bcfdce010c48c8edd83b94eb9103f7c72ef8eb96c4b15716ed3 + languageName: node + linkType: hard + +"postcss-modules-local-by-default@npm:^1.2.0": + version: 1.2.0 + resolution: "postcss-modules-local-by-default@npm:1.2.0" + dependencies: + css-selector-tokenizer: "npm:^0.7.0" + postcss: "npm:^6.0.1" + checksum: 10c0/9139846ccefbb089cff17abda76e199c4d464d899816265f0b3939f5cf588b8ba59f9119b87eccaf3bfde3049bddd6ac5989f46e6d8fa9ba936cc6ccb27b89bd + languageName: node + linkType: hard + +"postcss-modules-scope@npm:^1.1.0": + version: 1.1.0 + resolution: "postcss-modules-scope@npm:1.1.0" + dependencies: + css-selector-tokenizer: "npm:^0.7.0" + postcss: "npm:^6.0.1" + checksum: 10c0/ef0328204912f2a3b98322ac5f3d377c234c391a2afd29f51ec83961ad0e0c4dc01192968649ce47c75c85a6c922dd8c608b137c1cce548fe5d92d6fb4454bb2 + languageName: node + linkType: hard + +"postcss-modules-values@npm:^1.3.0": + version: 1.3.0 + resolution: "postcss-modules-values@npm:1.3.0" + dependencies: + icss-replace-symbols: "npm:^1.1.0" + postcss: "npm:^6.0.1" + checksum: 10c0/11bb1af2478291b72f6cc106ba48dc566079021976b2da8c7989db6dca643db6fe81653aba43d4cfb0467754853d77d1eb0e3593a621affe62a1cc2d72541c70 + languageName: node + linkType: hard + +"postcss-normalize-charset@npm:^1.1.0": + version: 1.1.1 + resolution: "postcss-normalize-charset@npm:1.1.1" + dependencies: + postcss: "npm:^5.0.5" + checksum: 10c0/69e67c67ad2a71b2dee440769a3651c84dee7bfcb713749ebbef544454b0151ef0c84833228513d6f53afd63c721b38cd640c54eca9602e3768139158e0f316a + languageName: node + linkType: hard + +"postcss-normalize-url@npm:^3.0.7": + version: 3.0.8 + resolution: "postcss-normalize-url@npm:3.0.8" + dependencies: + is-absolute-url: "npm:^2.0.0" + normalize-url: "npm:^1.4.0" + postcss: "npm:^5.0.14" + postcss-value-parser: "npm:^3.2.3" + checksum: 10c0/c53225ca485dd10d156e33e5ee5c3a830082f3f68a337b9e48f5a9d5083f6bebdf13008103d056b2025622c56421284bd391d9a86949ca468541cd0e2df682a6 + languageName: node + linkType: hard + +"postcss-ordered-values@npm:^2.1.0": + version: 2.2.3 + resolution: "postcss-ordered-values@npm:2.2.3" + dependencies: + postcss: "npm:^5.0.4" + postcss-value-parser: "npm:^3.0.1" + checksum: 10c0/4d55a1c7f108f01181c22db1cb886ba0d47f71472a0e531f66b6d90094e74754a35a85cae7c142b4f6277066d2d4c586814dbd909ac7bb9d4c9d1180ac34d10b + languageName: node + linkType: hard + +"postcss-reduce-idents@npm:^2.2.2": + version: 2.4.0 + resolution: "postcss-reduce-idents@npm:2.4.0" + dependencies: + postcss: "npm:^5.0.4" + postcss-value-parser: "npm:^3.0.2" + checksum: 10c0/a63b42193dd19298b28411bb6186ec6aa5cc176cbb2a4e4e67567cecf116feaa02407744eb734521a49445be497156afad70d0ab5dcd1d9af772e2aca1fd127c + languageName: node + linkType: hard + +"postcss-reduce-initial@npm:^1.0.0": + version: 1.0.1 + resolution: "postcss-reduce-initial@npm:1.0.1" + dependencies: + postcss: "npm:^5.0.4" + checksum: 10c0/f1c40830ceea191cc31353cc5085a1dab8e94f40ce009d0779b0589329546c8f11a10c0ba3d6514032cbee1439d76dc5e0b49bb841b1ca388827cc8be79b587a + languageName: node + linkType: hard + +"postcss-reduce-transforms@npm:^1.0.3": + version: 1.0.4 + resolution: "postcss-reduce-transforms@npm:1.0.4" + dependencies: + has: "npm:^1.0.1" + postcss: "npm:^5.0.8" + postcss-value-parser: "npm:^3.0.1" + checksum: 10c0/9c8cf2373dd84adb132fcd15ca48379276ef353ab8e51c18506d2e9688658579affff77bcbff19e460e875483b9a7d18fb40488f89f8d15b635f10503da9d875 + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^2.0.0, postcss-selector-parser@npm:^2.2.2": + version: 2.2.3 + resolution: "postcss-selector-parser@npm:2.2.3" + dependencies: + flatten: "npm:^1.0.2" + indexes-of: "npm:^1.0.1" + uniq: "npm:^1.0.1" + checksum: 10c0/dc8aee6807096a93a6a1079bddb8d3e94ca385688889da087156ecfe48f3ad7db7581395fada92737d0d6e6a2cda96697fb2d94bbbf97484adb1acff261efe00 + languageName: node + linkType: hard + +"postcss-svgo@npm:^2.1.1": + version: 2.1.6 + resolution: "postcss-svgo@npm:2.1.6" + dependencies: + is-svg: "npm:^2.0.0" + postcss: "npm:^5.0.14" + postcss-value-parser: "npm:^3.2.3" + svgo: "npm:^0.7.0" + checksum: 10c0/a4e33316888c609b2db8e0dbaa7db49f4c0c880985df364d1a237fc1ef170815f21949433e4ea5684da2c2b3d8ef2f6c0e944d3757c6749b350dbf19d534b5f2 + languageName: node + linkType: hard + +"postcss-unique-selectors@npm:^2.0.2": + version: 2.0.2 + resolution: "postcss-unique-selectors@npm:2.0.2" + dependencies: + alphanum-sort: "npm:^1.0.1" + postcss: "npm:^5.0.4" + uniqs: "npm:^2.0.0" + checksum: 10c0/4d1fac25aec01952390df2746f1cb9392b1cfe29bd167608248408755bd8b510209f95213953bda61b3c1201fb580620acdffd4f29fb85c3986f2a04b9b6bb52 + languageName: node + linkType: hard + +"postcss-value-parser@npm:^3.0.1, postcss-value-parser@npm:^3.0.2, postcss-value-parser@npm:^3.1.1, postcss-value-parser@npm:^3.1.2, postcss-value-parser@npm:^3.2.3, postcss-value-parser@npm:^3.3.0": + version: 3.3.1 + resolution: "postcss-value-parser@npm:3.3.1" + checksum: 10c0/23eed98d8eeadb1f9ef1db4a2757da0f1d8e7c1dac2a38d6b35d971aab9eb3c6d8a967d0e9f435558834ffcd966afbbe875a56bcc5bcdd09e663008c106b3e47 + languageName: node + linkType: hard + +"postcss-zindex@npm:^2.0.1": + version: 2.2.0 + resolution: "postcss-zindex@npm:2.2.0" + dependencies: + has: "npm:^1.0.1" + postcss: "npm:^5.0.4" + uniqs: "npm:^2.0.0" + checksum: 10c0/3c99a8fcd7132ecd5f56df7d8bdbe9a9d78f6c92c784435d522e1909b4e5f624905734c528787b0257a2ae23ec45f5bf435f8e2dcd47733fad8d779b91f2ba09 + languageName: node + linkType: hard + +"postcss@npm:^5.0.10, postcss@npm:^5.0.11, postcss@npm:^5.0.12, postcss@npm:^5.0.13, postcss@npm:^5.0.14, postcss@npm:^5.0.16, postcss@npm:^5.0.2, postcss@npm:^5.0.4, postcss@npm:^5.0.5, postcss@npm:^5.0.6, postcss@npm:^5.0.8, postcss@npm:^5.2.16": + version: 5.2.18 + resolution: "postcss@npm:5.2.18" + dependencies: + chalk: "npm:^1.1.3" + js-base64: "npm:^2.1.9" + source-map: "npm:^0.5.6" + supports-color: "npm:^3.2.3" + checksum: 10c0/1f9f6673dd24d52f1ed33b800248e6ef752d6b6a092fe268021e398df0d7e0956f00fb961781647264d659240c3d67f5bfd3df9bf1b7af985aa996be619d30b1 + languageName: node + linkType: hard + +"postcss@npm:^6.0.1": + version: 6.0.23 + resolution: "postcss@npm:6.0.23" + dependencies: + chalk: "npm:^2.4.1" + source-map: "npm:^0.6.1" + supports-color: "npm:^5.4.0" + checksum: 10c0/45d45184ffbb9d510e7585d9441af9a1a771a56b7553b1d598544e54acdfd31df439a95d5f00a6dc57b85b76d0c8925fec18614b1cc795887c845c3965e32e63 + languageName: node + linkType: hard + +"prepend-http@npm:^1.0.0": + version: 1.0.4 + resolution: "prepend-http@npm:1.0.4" + checksum: 10c0/c6c173ca439e58163ba7bea7cbba52a1ed11e3e3da1c048da296f37d4b7654f78f7304e03f76d5923f4b83af7e2d55533e0f79064209c75b743ccddee13904f8 + languageName: node + linkType: hard + +"private@npm:^0.1.8": + version: 0.1.8 + resolution: "private@npm:0.1.8" + checksum: 10c0/829a23723e5fd3105c72b2dadeeb65743a430f7e6967a8a6f3e49392a1b3ea52975a255376d8c513b0c988bdf162f1a5edf9d9bac27d1ab11f8dba8cdb58880e + languageName: node + linkType: hard + +"proc-log@npm:^6.0.0": + version: 6.1.0 + resolution: "proc-log@npm:6.1.0" + checksum: 10c0/4f178d4062733ead9d71a9b1ab24ebcecdfe2250916a5b1555f04fe2eda972a0ec76fbaa8df1ad9c02707add6749219d118a4fc46dc56bdfe4dde4b47d80bb82 + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 + languageName: node + linkType: hard + +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: 10c0/40c3ce4b7e6d4b8c3355479df77aeed46f81b279818ccdc500124e6a5ab882c0cc81ff7ea16384873a95a74c4570b01b120f287abbdd4c877931460eca6084b3 + languageName: node + linkType: hard + +"promise-inflight@npm:^1.0.1": + version: 1.0.1 + resolution: "promise-inflight@npm:1.0.1" + checksum: 10c0/d179d148d98fbff3d815752fa9a08a87d3190551d1420f17c4467f628214db12235ae068d98cd001f024453676d8985af8f28f002345646c4ece4600a79620bc + languageName: node + linkType: hard + +"prr@npm:~1.0.1": + version: 1.0.1 + resolution: "prr@npm:1.0.1" + checksum: 10c0/5b9272c602e4f4472a215e58daff88f802923b84bc39c8860376bb1c0e42aaf18c25d69ad974bd06ec6db6f544b783edecd5502cd3d184748d99080d68e4be5f + languageName: node + linkType: hard + +"pseudomap@npm:^1.0.2": + version: 1.0.2 + resolution: "pseudomap@npm:1.0.2" + checksum: 10c0/5a91ce114c64ed3a6a553aa7d2943868811377388bb31447f9d8028271bae9b05b340fe0b6961a64e45b9c72946aeb0a4ab635e8f7cb3715ffd0ff2beeb6a679 + languageName: node + linkType: hard + +"public-encrypt@npm:^4.0.0": + version: 4.0.3 + resolution: "public-encrypt@npm:4.0.3" + dependencies: + bn.js: "npm:^4.1.0" + browserify-rsa: "npm:^4.0.0" + create-hash: "npm:^1.1.0" + parse-asn1: "npm:^5.0.0" + randombytes: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: 10c0/6c2cc19fbb554449e47f2175065d6b32f828f9b3badbee4c76585ac28ae8641aafb9bb107afc430c33c5edd6b05dbe318df4f7d6d7712b1093407b11c4280700 + languageName: node + linkType: hard + +"pump@npm:^2.0.0, pump@npm:^2.0.1": + version: 2.0.1 + resolution: "pump@npm:2.0.1" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: 10c0/f1fe8960f44d145f8617ea4c67de05392da4557052980314c8f85081aee26953bdcab64afad58a2b1df0e8ff7203e3710e848cbe81a01027978edc6e264db355 + languageName: node + linkType: hard + +"pumpify@npm:^1.3.3": + version: 1.5.1 + resolution: "pumpify@npm:1.5.1" + dependencies: + duplexify: "npm:^3.6.0" + inherits: "npm:^2.0.3" + pump: "npm:^2.0.0" + checksum: 10c0/0bcabf9e3dbf2d0cc1f9b84ac80d3c75386111caf8963bfd98817a1e2192000ac0ccc804ca6ccd5b2b8430fdb71347b20fb2f014fe3d41adbacb1b502a841c45 + languageName: node + linkType: hard + +"punycode@npm:1.3.2": + version: 1.3.2 + resolution: "punycode@npm:1.3.2" + checksum: 10c0/281fd20eaf4704f79d80cb0dc65065bf6452ee67989b3e8941aed6360a5a9a8a01d3e2ed71d0bde3cd74fb5a5dd9db4160bed5a8c20bed4b6764c24ce4c7d2d2 + languageName: node + linkType: hard + +"punycode@npm:^1.2.4": + version: 1.4.1 + resolution: "punycode@npm:1.4.1" + checksum: 10c0/354b743320518aef36f77013be6e15da4db24c2b4f62c5f1eb0529a6ed02fbaf1cb52925785f6ab85a962f2b590d9cd5ad730b70da72b5f180e2556b8bd3ca08 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.1.1 + resolution: "punycode@npm:2.1.1" + checksum: 10c0/83815ca9b9177f055771f31980cbec7ffaef10257d50a95ab99b4a30f0404846e85fa6887ee1bbc0aaddb7bad6d96e2fa150a016051ff0f6b92be4ad613ddca8 + languageName: node + linkType: hard + +"q@npm:^1.1.2": + version: 1.5.1 + resolution: "q@npm:1.5.1" + checksum: 10c0/7855fbdba126cb7e92ef3a16b47ba998c0786ec7fface236e3eb0135b65df36429d91a86b1fff3ab0927b4ac4ee88a2c44527c7c3b8e2a37efbec9fe34803df4 + languageName: node + linkType: hard + +"qs@npm:2.3.3": + version: 2.3.3 + resolution: "qs@npm:2.3.3" + checksum: 10c0/4c02f03f77e50219799f52608dd72f57389ea364be499f5e8b02d505377cb93f6414239e00b3a7342b0d05a730ad85b3ffb5e7f0a5ba2f3d8ef7303283c01e17 + languageName: node + linkType: hard + +"query-string@npm:^4.1.0": + version: 4.3.4 + resolution: "query-string@npm:4.3.4" + dependencies: + object-assign: "npm:^4.1.0" + strict-uri-encode: "npm:^1.0.0" + checksum: 10c0/6181c343074c2049fbbcde63f87c1da5d3a49c6e34c8d94a61d692e886e0b8cd1ae4a4be00b598112bb9c4cb819e423ed503a5d246e4d24ecb0990d8bb21570b + languageName: node + linkType: hard + +"querystring-es3@npm:^0.2.0": + version: 0.2.1 + resolution: "querystring-es3@npm:0.2.1" + checksum: 10c0/476938c1adb45c141f024fccd2ffd919a3746e79ed444d00e670aad68532977b793889648980e7ca7ff5ffc7bfece623118d0fbadcaf217495eeb7059ae51580 + languageName: node + linkType: hard + +"querystring@npm:0.2.0": + version: 0.2.0 + resolution: "querystring@npm:0.2.0" + checksum: 10c0/2036c9424beaacd3978bac9e4ba514331cc73163bea7bf3ad7e2c7355e55501938ec195312c607753f9c6e70b1bf9dfcda38db6241bd299c034e27ac639d64ed + languageName: node + linkType: hard + +"randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: "npm:^5.1.0" + checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 + languageName: node + linkType: hard + +"randomfill@npm:^1.0.3": + version: 1.0.4 + resolution: "randomfill@npm:1.0.4" + dependencies: + randombytes: "npm:^2.0.5" + safe-buffer: "npm:^5.1.0" + checksum: 10c0/11aeed35515872e8f8a2edec306734e6b74c39c46653607f03c68385ab8030e2adcc4215f76b5e4598e028c4750d820afd5c65202527d831d2a5f207fe2bc87c + languageName: node + linkType: hard + +"raven@npm:^2.6.4": + version: 2.6.4 + resolution: "raven@npm:2.6.4" + dependencies: + cookie: "npm:0.3.1" + md5: "npm:^2.2.1" + stack-trace: "npm:0.0.10" + timed-out: "npm:4.0.1" + uuid: "npm:3.3.2" + bin: + raven: ./bin/raven + checksum: 10c0/688dd6137c16f0d6cd67dadf1450b1cc0f74cbd3abac010c1d2aa84334a17799859f525a2a5478b803000f514dd74ef60bd97a96274c329ff7acf68dd6350927 + languageName: node + linkType: hard + +"read-pkg-up@npm:^2.0.0": + version: 2.0.0 + resolution: "read-pkg-up@npm:2.0.0" + dependencies: + find-up: "npm:^2.0.0" + read-pkg: "npm:^2.0.0" + checksum: 10c0/6fbb9f8c1a9ed3c8a5764387a77ac4456082f1fe98757d1ed300d8b0a4c70501f28cbb053ae7b3e0de6094930fb7258fbfe099957a53c999337aaf8bc53ff37f + languageName: node + linkType: hard + +"read-pkg@npm:^2.0.0": + version: 2.0.0 + resolution: "read-pkg@npm:2.0.0" + dependencies: + load-json-file: "npm:^2.0.0" + normalize-package-data: "npm:^2.3.2" + path-type: "npm:^2.0.0" + checksum: 10c0/c0d1b66c58e58fadaabe48c83c525fb1966304555e5089fab5ccce2c3dfe0fad726720b170a5fa23ff20452e22d1dbe817f5c63f03546bb85cbfb6b84da84c2b + languageName: node + linkType: hard + +"readable-stream@npm:1 || 2, readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.2, readable-stream@npm:^2.1.5, readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.3, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6": + version: 2.3.7 + resolution: "readable-stream@npm:2.3.7" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 10c0/1708755e6cf9daff6ff60fa5b4575636472289c5b95d38058a91f94732b8d024a940a0d4d955639195ce42c22cab16973ee8fea8deedd24b5fec3dd596465f86 + languageName: node + linkType: hard + +"readable-stream@npm:1.0.27-1": + version: 1.0.27-1 + resolution: "readable-stream@npm:1.0.27-1" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.1" + isarray: "npm:0.0.1" + string_decoder: "npm:~0.10.x" + checksum: 10c0/b887546e0a2c9e3204141be697d96f7966c4f25110925d9cd6714cf451d750b77ad873fd176ed03e40e4cb5da52f35a382ddd50e306e3f5fd37e238044897cd3 + languageName: node + linkType: hard + +"readable-stream@npm:>=1.0.33-1 <1.1.0-0": + version: 1.0.34 + resolution: "readable-stream@npm:1.0.34" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.1" + isarray: "npm:0.0.1" + string_decoder: "npm:~0.10.x" + checksum: 10c0/02272551396ed8930ddee1a088bdf0379f0f7cc47ac49ed8804e998076cb7daec9fbd2b1fd9c0490ec72e56e8bb3651abeb8080492b8e0a9c3f2158330908ed6 + languageName: node + linkType: hard + +"readable-stream@npm:^3.6.0": + version: 3.6.0 + resolution: "readable-stream@npm:3.6.0" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: 10c0/937bedd29ac8a68331666291922bea892fa2be1a33269e582de9f844a2002f146cf831e39cd49fe6a378d3f0c27358f259ed0e20d20f0bdc6a3f8fc21fce42dc + languageName: node + linkType: hard + +"reduce-component@npm:1.0.1": + version: 1.0.1 + resolution: "reduce-component@npm:1.0.1" + checksum: 10c0/a06392549d3783c626daff88e49ca29d02390b27028a37a75116c3f36b544ad1772d32332b0f374990545287edf4403159de990d0678fb799b254ebbe113fa71 + languageName: node + linkType: hard + +"reduce-css-calc@npm:^1.2.6": + version: 1.3.0 + resolution: "reduce-css-calc@npm:1.3.0" + dependencies: + balanced-match: "npm:^0.4.2" + math-expression-evaluator: "npm:^1.2.14" + reduce-function-call: "npm:^1.0.1" + checksum: 10c0/c0b192bbdc7617ee7e3bcd09332f7f810c2b52f1da8521c4eda03879ead00bcca65bcae78d5bc8cd925610f776532a3457e8b2fd8f4bb936bdb40f057590f20d + languageName: node + linkType: hard + +"reduce-function-call@npm:^1.0.1": + version: 1.0.3 + resolution: "reduce-function-call@npm:1.0.3" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/7e844708d8c3d2946d3df5c537ee1e23c3c60c98ac0dbc724828f36d8d309c391a14995f47ce4f5ba84eea2df5c73d58e4ba100ba331af496920932421a322ed + languageName: node + linkType: hard + +"regenerator-runtime@npm:^0.11.0": + version: 0.11.1 + resolution: "regenerator-runtime@npm:0.11.1" + checksum: 10c0/69cfa839efcf2d627fe358bf302ab8b24e5f182cb69f13e66f0612d3640d7838aad1e55662135e3ef2c1cc4322315b757626094fab13a48f9a64ab4bdeb8795b + languageName: node + linkType: hard + +"repeating@npm:^2.0.0": + version: 2.0.1 + resolution: "repeating@npm:2.0.1" + dependencies: + is-finite: "npm:^1.0.0" + checksum: 10c0/7f5cd293ec47d9c074ef0852800d5ff5c49028ce65242a7528d84f32bd2fe200b142930562af58c96d869c5a3046e87253030058e45231acaa129c1a7087d2e7 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"require-main-filename@npm:^1.0.1": + version: 1.0.1 + resolution: "require-main-filename@npm:1.0.1" + checksum: 10c0/1ab87efb72a0e223a667154e92f29ca753fd42eb87f22db142b91c86d134e29ecf18af929111ccd255fd340b57d84a9d39489498d8dfd5136b300ded30a5f0b6 + languageName: node + linkType: hard + +"resolve@npm:^1.10.0": + version: 1.22.1 + resolution: "resolve@npm:1.22.1" + dependencies: + is-core-module: "npm:^2.9.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/6d58b1cb40f3fc80b9e45dd799d84cdc3829a993e4b9fa3b59d331e1dfacd0870e1851f4d0eb549d68c796e0b7087b43d1aec162653ccccff9e18191221a6e7d + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin": + version: 1.22.1 + resolution: "resolve@patch:resolve@npm%3A1.22.1#optional!builtin::version=1.22.1&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.9.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/0d8ccceba5537769c42aa75e4aa75ae854aac866a11d7e9ffdb1663f0158ee646a0d48fc2818ed5e7fb364d64220a1fb9092a160e11e00cbdd5fbab39a13092c + languageName: node + linkType: hard + +"rimraf@npm:^2.5.4, rimraf@npm:^2.6.2": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: ./bin.js + checksum: 10c0/4eef73d406c6940927479a3a9dee551e14a54faf54b31ef861250ac815172bade86cc6f7d64a4dc5e98b65e4b18a2e1c9ff3b68d296be0c748413f092bb0dd40 + languageName: node + linkType: hard + +"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": + version: 2.0.2 + resolution: "ripemd160@npm:2.0.2" + dependencies: + hash-base: "npm:^3.0.0" + inherits: "npm:^2.0.1" + checksum: 10c0/f6f0df78817e78287c766687aed4d5accbebc308a8e7e673fb085b9977473c1f139f0c5335d353f172a915bb288098430755d2ad3c4f30612f4dd0c901cd2c3a + languageName: node + linkType: hard + +"run-queue@npm:^1.0.0, run-queue@npm:^1.0.3": + version: 1.0.3 + resolution: "run-queue@npm:1.0.3" + dependencies: + aproba: "npm:^1.1.1" + checksum: 10c0/4e8964279d8f160f9ffaabe82eaad11a1d4c0db596a0f2b5257ae9d2b900c7e1ffcece3e5719199436f50718e1e7f45bb4bf7a82e331a4e734d67c2588a90cbb + languageName: node + linkType: hard + +"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.1.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"sax@npm:^1.2.4, sax@npm:~1.2.1": + version: 1.2.4 + resolution: "sax@npm:1.2.4" + checksum: 10c0/6e9b05ff443ee5e5096ce92d31c0740a20d33002fad714ebcb8fc7a664d9ee159103ebe8f7aef0a1f7c5ecacdd01f177f510dff95611c589399baf76437d3fe3 + languageName: node + linkType: hard + +"schema-utils@npm:^0.4.5": + version: 0.4.7 + resolution: "schema-utils@npm:0.4.7" + dependencies: + ajv: "npm:^6.1.0" + ajv-keywords: "npm:^3.1.0" + checksum: 10c0/0de445cee6bf9a54b7b18b284b5f5ebe5b481f57e71854872c4215bd8eda73811a5f4964718c26f24b50f46a5eafbaf8a391459a7f10b78c242a798a3e0e24c8 + languageName: node + linkType: hard + +"schema-utils@npm:^1.0.0": + version: 1.0.0 + resolution: "schema-utils@npm:1.0.0" + dependencies: + ajv: "npm:^6.1.0" + ajv-errors: "npm:^1.0.0" + ajv-keywords: "npm:^3.1.0" + checksum: 10c0/670e22d7f0ff0b6f4514a4d6fb27c359101b44b7dbfd9563af201af72eb4a9ff06144020cab5f85b16e88821fd09b97cbdae6c893721c6528c8cb704124e6a2f + languageName: node + linkType: hard + +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.6.0": + version: 5.7.1 + resolution: "semver@npm:5.7.1" + bin: + semver: ./bin/semver + checksum: 10c0/d4884f2aeca28bff35d0bd40ff0a9b2dfc4b36a883bf0ea5dc15d10d9a01bdc9041035b05f825d4b5ac8a56e490703dbf0d986d054de82cc5e9bad3f02ca6e00 + languageName: node + linkType: hard + +"semver@npm:^7.3.5": + version: 7.7.4 + resolution: "semver@npm:7.7.4" + bin: + semver: bin/semver.js + checksum: 10c0/5215ad0234e2845d4ea5bb9d836d42b03499546ddafb12075566899fc617f68794bb6f146076b6881d755de17d6c6cc73372555879ec7dce2c2feee947866ad2 + languageName: node + linkType: hard + +"serialize-javascript@npm:^1.4.0": + version: 1.9.1 + resolution: "serialize-javascript@npm:1.9.1" + checksum: 10c0/01c1aabb28a50133ac7c86038ec14be26b13e0d8d43ac6ad4bad57789bc8dc33b33fef2424330ab9d138da40d9a3c2520f0d66e8c3474eeeab01669d3a38cae1 + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 + languageName: node + linkType: hard + +"setimmediate@npm:^1.0.4": + version: 1.0.5 + resolution: "setimmediate@npm:1.0.5" + checksum: 10c0/5bae81bfdbfbd0ce992893286d49c9693c82b1bcc00dcaaf3a09c8f428fdeacf4190c013598b81875dfac2b08a572422db7df779a99332d0fce186d15a3e4d49 + languageName: node + linkType: hard + +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": + version: 2.4.11 + resolution: "sha.js@npm:2.4.11" + dependencies: + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + bin: + sha.js: ./bin.js + checksum: 10c0/b7a371bca8821c9cc98a0aeff67444a03d48d745cb103f17228b96793f455f0eb0a691941b89ea1e60f6359207e36081d9be193252b0f128e0daf9cfea2815a5 + languageName: node + linkType: hard + +"shebang-command@npm:^1.2.0": + version: 1.2.0 + resolution: "shebang-command@npm:1.2.0" + dependencies: + shebang-regex: "npm:^1.0.0" + checksum: 10c0/7b20dbf04112c456b7fc258622dafd566553184ac9b6938dd30b943b065b21dabd3776460df534cc02480db5e1b6aec44700d985153a3da46e7db7f9bd21326d + languageName: node + linkType: hard + +"shebang-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "shebang-regex@npm:1.0.0" + checksum: 10c0/9abc45dee35f554ae9453098a13fdc2f1730e525a5eb33c51f096cc31f6f10a4b38074c1ebf354ae7bffa7229506083844008dfc3bb7818228568c0b2dc1fff2 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.0": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + +"simple-statistics@npm:7.7.3": + version: 7.7.3 + resolution: "simple-statistics@npm:7.7.3" + checksum: 10c0/a65fe89dbeb6233735f2aea0a9c41d9bb33b57779c3a47b0ea2daab62c6c2dd03ce867cde73083fb373bf6faaf874d10c1c7615eb5426237aa6d8c4e54fd6a47 + languageName: node + linkType: hard + +"slash@npm:^1.0.0": + version: 1.0.0 + resolution: "slash@npm:1.0.0" + checksum: 10c0/3944659885d905480f98810542fd314f3e1006eaad25ec78227a7835a469d9ed66fc3dd90abc7377dd2e71f4b5473e8f766bd08198fdd25152a80792e9ed464c + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 + languageName: node + linkType: hard + +"socks@npm:^2.8.3": + version: 2.8.7 + resolution: "socks@npm:2.8.7" + dependencies: + ip-address: "npm:^10.0.1" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/2805a43a1c4bcf9ebf6e018268d87b32b32b06fbbc1f9282573583acc155860dc361500f89c73bfbb157caa1b4ac78059eac0ef15d1811eb0ca75e0bdadbc9d2 + languageName: node + linkType: hard + +"sort-keys@npm:^1.0.0": + version: 1.1.2 + resolution: "sort-keys@npm:1.1.2" + dependencies: + is-plain-obj: "npm:^1.0.0" + checksum: 10c0/5dd383b0299a40277051f7498c3999520138e2eb50d422962f658738341c9e82349fad4a3024d5ba1a3122688fbaf958f2a472d4c53bade55515097c2ce15420 + languageName: node + linkType: hard + +"source-list-map@npm:^2.0.0": + version: 2.0.1 + resolution: "source-list-map@npm:2.0.1" + checksum: 10c0/2e5e421b185dcd857f46c3c70e2e711a65d717b78c5f795e2e248c9d67757882ea989b80ebc08cf164eeeda5f4be8aa95d3b990225070b2daaaf3257c5958149 + languageName: node + linkType: hard + +"source-map-support@npm:^0.4.15": + version: 0.4.18 + resolution: "source-map-support@npm:0.4.18" + dependencies: + source-map: "npm:^0.5.6" + checksum: 10c0/cd9f0309c1632b1e01a7715a009e0b036d565f3af8930fa8cda2a06aeec05ad1d86180e743b7e1f02cc3c97abe8b6d8de7c3878c2d8e01e86e17f876f7ecf98e + languageName: node + linkType: hard + +"source-map@npm:^0.5.3, source-map@npm:^0.5.6, source-map@npm:^0.5.7": + version: 0.5.7 + resolution: "source-map@npm:0.5.7" + checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 + languageName: node + linkType: hard + +"source-map@npm:^0.6.1, source-map@npm:~0.6.0, source-map@npm:~0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.1.1 + resolution: "spdx-correct@npm:3.1.1" + dependencies: + spdx-expression-parse: "npm:^3.0.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/25909eecc4024963a8e398399dbdd59ddb925bd7dbecd9c9cf6df0d75c29b68cd30b82123564acc51810eb02cfc4b634a2e16e88aa982433306012e318849249 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.3.0 + resolution: "spdx-exceptions@npm:2.3.0" + checksum: 10c0/83089e77d2a91cb6805a5c910a2bedb9e50799da091f532c2ba4150efdef6e53f121523d3e2dc2573a340dc0189e648b03157097f65465b3a0c06da1f18d7e8a + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.11 + resolution: "spdx-license-ids@npm:3.0.11" + checksum: 10c0/6c53cfdb3417e80fd612341319f1296507f797e0387e144047f547c378d9d38d6032ec342de42ef7883256f6690b2fca9889979d0dd015a61dc49b323f9b379b + languageName: node + linkType: hard + +"spin.js@npm:^2.0.1": + version: 2.3.2 + resolution: "spin.js@npm:2.3.2" + checksum: 10c0/bf3ff85e8dc1491ce6ea8c0b83b559bb5d315fcb55104dd9a103b42d3bad03a7d3a1e72c6d7b32b7cc28d6f0b4fd93ed4321a41184debfa20fb71898c748e599 + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + +"ssri@npm:^13.0.0": + version: 13.0.1 + resolution: "ssri@npm:13.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/cf6408a18676c57ff2ed06b8a20dc64bb3e748e5c7e095332e6aecaa2b8422b1e94a739a8453bf65156a8a47afe23757ba4ab52d3ea3b62322dc40875763e17a + languageName: node + linkType: hard + +"ssri@npm:^5.2.4": + version: 5.3.0 + resolution: "ssri@npm:5.3.0" + dependencies: + safe-buffer: "npm:^5.1.1" + checksum: 10c0/f80372ec982cacb3d8e4b53c2a82a7f7502d915a57aef99a29e6cd293302d5944185a569df5fce694a857abb1e602585fcee90182cd2e853bae3d1c20a84d8cb + languageName: node + linkType: hard + +"stack-trace@npm:0.0.10": + version: 0.0.10 + resolution: "stack-trace@npm:0.0.10" + checksum: 10c0/9ff3dabfad4049b635a85456f927a075c9d0c210e3ea336412d18220b2a86cbb9b13ec46d6c37b70a302a4ea4d49e30e5d4944dd60ae784073f1cde778ac8f4b + languageName: node + linkType: hard + +"stream-browserify@npm:^2.0.1": + version: 2.0.2 + resolution: "stream-browserify@npm:2.0.2" + dependencies: + inherits: "npm:~2.0.1" + readable-stream: "npm:^2.0.2" + checksum: 10c0/485562bd5d962d633ae178449029c6fa2611052e356bdb5668f768544aa4daa94c4f9a97de718f3f30ad98f3cb98a5f396252bb3855aff153c138f79c0e8f6ac + languageName: node + linkType: hard + +"stream-each@npm:^1.1.0": + version: 1.2.3 + resolution: "stream-each@npm:1.2.3" + dependencies: + end-of-stream: "npm:^1.1.0" + stream-shift: "npm:^1.0.0" + checksum: 10c0/7ed229d3b7c24373058b5742b00066da8d3122d1487c8219a025ed53a8978545c77654a529a8e9c62ba83ae80c424cbb0204776b49abf72270d2e8154831dd5f + languageName: node + linkType: hard + +"stream-http@npm:^2.7.2": + version: 2.8.3 + resolution: "stream-http@npm:2.8.3" + dependencies: + builtin-status-codes: "npm:^3.0.0" + inherits: "npm:^2.0.1" + readable-stream: "npm:^2.3.6" + to-arraybuffer: "npm:^1.0.0" + xtend: "npm:^4.0.0" + checksum: 10c0/fbe7d327a29216bbabe88d3819bb8f7a502f11eeacf3212579e5af1f76fa7283f6ffa66134ab7d80928070051f571d1029e85f65ce3369fffd4c4df3669446c4 + languageName: node + linkType: hard + +"stream-shift@npm:^1.0.0": + version: 1.0.1 + resolution: "stream-shift@npm:1.0.1" + checksum: 10c0/b63a0d178cde34b920ad93e2c0c9395b840f408d36803b07c61416edac80ef9e480a51910e0ceea0d679cec90921bcd2cccab020d3a9fa6c73a98b0fbec132fd + languageName: node + linkType: hard + +"strict-uri-encode@npm:^1.0.0": + version: 1.1.0 + resolution: "strict-uri-encode@npm:1.1.0" + checksum: 10c0/eb8a4109ba2588239787389313ba58ec49e043d4c64a1d44716defe5821a68ae49abe0cdefed9946ca9fc2a4af7ecf321da92422b0a67258ec0a3638b053ae62 + languageName: node + linkType: hard + +"string-width@npm:^1.0.1": + version: 1.0.2 + resolution: "string-width@npm:1.0.2" + dependencies: + code-point-at: "npm:^1.0.0" + is-fullwidth-code-point: "npm:^1.0.0" + strip-ansi: "npm:^3.0.0" + checksum: 10c0/c558438baed23a9ab9370bb6a939acbdb2b2ffc517838d651aad0f5b2b674fb85d460d9b1d0b6a4c210dffd09e3235222d89a5bd4c0c1587f78b2bb7bc00c65e + languageName: node + linkType: hard + +"string-width@npm:^2.0.0": + version: 2.1.1 + resolution: "string-width@npm:2.1.1" + dependencies: + is-fullwidth-code-point: "npm:^2.0.0" + strip-ansi: "npm:^4.0.0" + checksum: 10c0/e5f2b169fcf8a4257a399f95d069522f056e92ec97dbdcb9b0cdf14d688b7ca0b1b1439a1c7b9773cd79446cbafd582727279d6bfdd9f8edd306ea5e90e5b610 + languageName: node + linkType: hard + +"string_decoder@npm:^1.0.0, string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d + languageName: node + linkType: hard + +"string_decoder@npm:~0.10.x": + version: 0.10.31 + resolution: "string_decoder@npm:0.10.31" + checksum: 10c0/1c628d78f974aa7539c496029f48e7019acc32487fc695464f9d6bdfec98edd7d933a06b3216bc2016918f6e75074c611d84430a53cb0e43071597d6c1ac5e25 + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: "npm:~5.1.0" + checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e + languageName: node + linkType: hard + +"strip-ansi@npm:^2.0.1": + version: 2.0.1 + resolution: "strip-ansi@npm:2.0.1" + dependencies: + ansi-regex: "npm:^1.0.0" + bin: + strip-ansi: cli.js + checksum: 10c0/5517a3787f5fdb4fb621fbd13ae2688211329654a6e1415b4ba0af517adb1bc4e3a593abc40347ca0501cb68a978e25f46fb253ac369b44d25bb6f736cc48986 + languageName: node + linkType: hard + +"strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1": + version: 3.0.1 + resolution: "strip-ansi@npm:3.0.1" + dependencies: + ansi-regex: "npm:^2.0.0" + checksum: 10c0/f6e7fbe8e700105dccf7102eae20e4f03477537c74b286fd22cfc970f139002ed6f0d9c10d0e21aa9ed9245e0fa3c9275930e8795c5b947da136e4ecb644a70f + languageName: node + linkType: hard + +"strip-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-ansi@npm:4.0.0" + dependencies: + ansi-regex: "npm:^3.0.0" + checksum: 10c0/d75d9681e0637ea316ddbd7d4d3be010b1895a17e885155e0ed6a39755ae0fd7ef46e14b22162e66a62db122d3a98ab7917794e255532ab461bb0a04feb03e7d + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 + languageName: node + linkType: hard + +"strip-eof@npm:^1.0.0": + version: 1.0.0 + resolution: "strip-eof@npm:1.0.0" + checksum: 10c0/f336beed8622f7c1dd02f2cbd8422da9208fae81daf184f73656332899978919d5c0ca84dc6cfc49ad1fc4dd7badcde5412a063cf4e0d7f8ed95a13a63f68f45 + languageName: node + linkType: hard + +"style-loader@npm:^0.23.1": + version: 0.23.1 + resolution: "style-loader@npm:0.23.1" + dependencies: + loader-utils: "npm:^1.1.0" + schema-utils: "npm:^1.0.0" + checksum: 10c0/9752920e4284e53067282f8cca68402604db152b60251525106414ceb7dedbfa5571ad544c95062006c1ff8801aa337e231e848dd3f1a8f73ec3fa680f530895 + languageName: node + linkType: hard + +"superagent@npm:^1.8.3": + version: 1.8.5 + resolution: "superagent@npm:1.8.5" + dependencies: + component-emitter: "npm:~1.2.0" + cookiejar: "npm:2.0.6" + debug: "npm:2" + extend: "npm:3.0.0" + form-data: "npm:1.0.0-rc3" + formidable: "npm:~1.0.14" + methods: "npm:~1.1.1" + mime: "npm:1.3.4" + qs: "npm:2.3.3" + readable-stream: "npm:1.0.27-1" + reduce-component: "npm:1.0.1" + checksum: 10c0/636198862a8bad386adc9fbe5f129a2617893fb79dbc007b6c7e92be9a114a7b3aed32c08adf00d286fa8726e6b5d51b8d46345a037a0066d7764b0c41bde4f9 + languageName: node + linkType: hard + +"supports-color@npm:^2.0.0": + version: 2.0.0 + resolution: "supports-color@npm:2.0.0" + checksum: 10c0/570e0b63be36cccdd25186350a6cb2eaad332a95ff162fa06d9499982315f2fe4217e69dd98e862fbcd9c81eaff300a825a1fe7bf5cc752e5b84dfed042b0dda + languageName: node + linkType: hard + +"supports-color@npm:^3.2.3": + version: 3.2.3 + resolution: "supports-color@npm:3.2.3" + dependencies: + has-flag: "npm:^1.0.0" + checksum: 10c0/d39a57dbd75c3b5740654f8ec16aaf7203b8d12b8a51314507bed590c9081120805f105b4ce741db13105e6f842ac09700e4bd665b9ffc46eb0b34ba54720bd3 + languageName: node + linkType: hard + +"supports-color@npm:^4.2.1": + version: 4.5.0 + resolution: "supports-color@npm:4.5.0" + dependencies: + has-flag: "npm:^2.0.0" + checksum: 10c0/2dc369eeac73954e87037dea1ebae0238b2abc0a39d7e35aa60eb8a84cc8d1dcade8b62e010597f5859f94c937e992abe6a6195460855fcc5e51f8cfc7fcc72a + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0, supports-color@npm:^5.4.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: "npm:^3.0.0" + checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"svgo@npm:^0.7.0": + version: 0.7.2 + resolution: "svgo@npm:0.7.2" + dependencies: + coa: "npm:~1.0.1" + colors: "npm:~1.1.2" + csso: "npm:~2.3.1" + js-yaml: "npm:~3.7.0" + mkdirp: "npm:~0.5.1" + sax: "npm:~1.2.1" + whet.extend: "npm:~0.9.9" + bin: + svgo: ./bin/svgo + checksum: 10c0/cc3314ec0227b7fd4dfcbc622b69e45ac79462a2add2c5198b863f107e4afe459e01812e668fae868b3fb02326ffbb4cd25ca7d1f2580656b14beae10eb2596c + languageName: node + linkType: hard + +"tapable@npm:^0.2.7": + version: 0.2.9 + resolution: "tapable@npm:0.2.9" + checksum: 10c0/93d0e5994621a9496112fe241784d59325684b509eb74d1abd9032802639b53ba9619db0f5db6ccdab994a5279bc4ed07b638a8a25143ba6b10603e409f314fb + languageName: node + linkType: hard + +"tar@npm:^7.5.4": + version: 7.5.12 + resolution: "tar@npm:7.5.12" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.1.0" + yallist: "npm:^5.0.0" + checksum: 10c0/3825c5974f5fde792981f47ee9ffea021ee7f4b552b7ab95eeb98e5dfadfd5a5d5861f01fb772e2e5637a41980d3c019fd6cdad1be48b462b886abd7fe0fa17c + languageName: node + linkType: hard + +"through2@npm:0.6.3": + version: 0.6.3 + resolution: "through2@npm:0.6.3" + dependencies: + readable-stream: "npm:>=1.0.33-1 <1.1.0-0" + xtend: "npm:>=4.0.0 <4.1.0-0" + checksum: 10c0/5c3cd5427280d42378582fcb9c31eec15ffdcba482101c565e73715f4216eaa360d7ff339c7b29ff3a39a77a8a3f90010b390329446b10e61c5b3c59b064af75 + languageName: node + linkType: hard + +"through2@npm:^2.0.0": + version: 2.0.5 + resolution: "through2@npm:2.0.5" + dependencies: + readable-stream: "npm:~2.3.6" + xtend: "npm:~4.0.1" + checksum: 10c0/cbfe5b57943fa12b4f8c043658c2a00476216d79c014895cef1ac7a1d9a8b31f6b438d0e53eecbb81054b93128324a82ecd59ec1a4f91f01f7ac113dcb14eade + languageName: node + linkType: hard + +"timed-out@npm:4.0.1": + version: 4.0.1 + resolution: "timed-out@npm:4.0.1" + checksum: 10c0/86f03ffce5b80c5a066e02e59e411d3fbbfcf242b19290ba76817b4180abd1b85558489586b6022b798fb1cf26fc644c0ce0efb9c271d67ec83fada4b9542a56 + languageName: node + linkType: hard + +"timers-browserify@npm:^2.0.4": + version: 2.0.12 + resolution: "timers-browserify@npm:2.0.12" + dependencies: + setimmediate: "npm:^1.0.4" + checksum: 10c0/98e84db1a685bc8827c117a8bc62aac811ad56a995d07938fc7ed8cdc5bf3777bfe2d4e5da868847194e771aac3749a20f6cdd22091300fe889a76fe214a4641 + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.12": + version: 0.2.15 + resolution: "tinyglobby@npm:0.2.15" + dependencies: + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.3" + checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 + languageName: node + linkType: hard + +"to-arraybuffer@npm:^1.0.0": + version: 1.0.1 + resolution: "to-arraybuffer@npm:1.0.1" + checksum: 10c0/2460bd95524f4845a751e4f8bf9937f9f3dcd1651f104e1512868782f858f8302c1cf25bbc30794bc1b3ff65c4e135158377302f2abaff43a2d8e3c38dfe098c + languageName: node + linkType: hard + +"to-fast-properties@npm:^1.0.3": + version: 1.0.3 + resolution: "to-fast-properties@npm:1.0.3" + checksum: 10c0/78974a4f4528700d18e4c2bbf0b1fb1b19862dcc20a18dc5ed659843dea2dff4f933d167a11d3819865c1191042003aea65f7f035791af9e65d070f2e05af787 + languageName: node + linkType: hard + +"trim-right@npm:^1.0.1": + version: 1.0.1 + resolution: "trim-right@npm:1.0.1" + checksum: 10c0/71989ec179c6b42a56e03db68e60190baabf39d32d4e1252fa1501c4e478398ae29d7191beffe015b9d9dc76f04f4b3a946bdb9949ad6b0c0b0c5db65f3eb672 + languageName: node + linkType: hard + +"tslib@npm:^2.3.0": + version: 2.4.0 + resolution: "tslib@npm:2.4.0" + checksum: 10c0/eb19bda3ae545b03caea6a244b34593468e23d53b26bf8649fbc20fce43e9b21a71127fd6d2b9662c0fe48ee6ff668ead48fd00d3b88b2b716b1c12edae25b5d + languageName: node + linkType: hard + +"tty-browserify@npm:0.0.0": + version: 0.0.0 + resolution: "tty-browserify@npm:0.0.0" + checksum: 10c0/c0c68206565f1372e924d5cdeeff1a0d9cc729833f1da98c03d78be8f939e5f61a107bd0ab77d1ef6a47d62bb0e48b1081fbea273acf404959e22fd3891439c5 + languageName: node + linkType: hard + +"type@npm:^1.0.1": + version: 1.2.0 + resolution: "type@npm:1.2.0" + checksum: 10c0/444660849aaebef8cbb9bc43b28ec2068952064cfce6a646f88db97aaa2e2d6570c5629cd79238b71ba23aa3f75146a0b96e24e198210ee0089715a6f8889bf7 + languageName: node + linkType: hard + +"type@npm:^2.5.0": + version: 2.6.0 + resolution: "type@npm:2.6.0" + checksum: 10c0/d08063a1c3415140d0b6fd17ede55f373cdd6c5503776693ad5ead574a06404823374d62d6233e43bc30ec22f596b790cbb8661429bed75a75dab986b506ac60 + languageName: node + linkType: hard + +"typedarray@npm:^0.0.6": + version: 0.0.6 + resolution: "typedarray@npm:0.0.6" + checksum: 10c0/6005cb31df50eef8b1f3c780eb71a17925f3038a100d82f9406ac2ad1de5eb59f8e6decbdc145b3a1f8e5836e17b0c0002fb698b9fe2516b8f9f9ff602d36412 + languageName: node + linkType: hard + +"uglify-es@npm:^3.3.4": + version: 3.3.9 + resolution: "uglify-es@npm:3.3.9" + dependencies: + commander: "npm:~2.13.0" + source-map: "npm:~0.6.1" + bin: + uglifyjs: bin/uglifyjs + checksum: 10c0/b591de4ea2c7153f446f80f2559bbabcb4ff53a17dbfd27b9bb980b31f5fb7e563bdae6e9abc07d97ecb484ac4ceba4c7a207e6854cb2aaca72e80e6090c989e + languageName: node + linkType: hard + +"uglifyjs-webpack-plugin@npm:1.3.0": + version: 1.3.0 + resolution: "uglifyjs-webpack-plugin@npm:1.3.0" + dependencies: + cacache: "npm:^10.0.4" + find-cache-dir: "npm:^1.0.0" + schema-utils: "npm:^0.4.5" + serialize-javascript: "npm:^1.4.0" + source-map: "npm:^0.6.1" + uglify-es: "npm:^3.3.4" + webpack-sources: "npm:^1.1.0" + worker-farm: "npm:^1.5.2" + peerDependencies: + webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 + checksum: 10c0/d10ae2ac25f64afddff328fbaa58640450c099c53e44d66829681a5415ef72aa2563d1e5ed43e0e9c409db869575fd914293faaa39288e21da518084878de413 + languageName: node + linkType: hard + +"uniq@npm:^1.0.1": + version: 1.0.1 + resolution: "uniq@npm:1.0.1" + checksum: 10c0/369dca4a07fdd8de9e48378b9d4b6861722ca71d5f496e91687916bd4b48b8cf3d6db1677be1b40eea63bc6d4728efb4b4e0bd7a89c5fd2d23e7a2cff8009c7a + languageName: node + linkType: hard + +"uniqs@npm:^2.0.0": + version: 2.0.0 + resolution: "uniqs@npm:2.0.0" + checksum: 10c0/f244b158f6b3d30ddea2092c581fe9eb746d6db889a859fd0001e4b7566767bfcc53cdf11e6286f097bb130ebad71025709f41f2e4dd38e5c2f03ec28052baab + languageName: node + linkType: hard + +"unique-filename@npm:^1.1.0": + version: 1.1.1 + resolution: "unique-filename@npm:1.1.1" + dependencies: + unique-slug: "npm:^2.0.0" + checksum: 10c0/d005bdfaae6894da8407c4de2b52f38b3c58ec86e79fc2ee19939da3085374413b073478ec54e721dc8e32b102cf9e50d0481b8331abdc62202e774b789ea874 + languageName: node + linkType: hard + +"unique-slug@npm:^2.0.0": + version: 2.0.2 + resolution: "unique-slug@npm:2.0.2" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/9eabc51680cf0b8b197811a48857e41f1364b25362300c1ff636c0eca5ec543a92a38786f59cf0697e62c6f814b11ecbe64e8093db71246468a1f03b80c83970 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + +"urijs@npm:^1.19.7": + version: 1.19.11 + resolution: "urijs@npm:1.19.11" + checksum: 10c0/96e15eea5b41a99361d506e4d8fcc64dc43f334bd5fd34e08261467b6954b97a6b45929a8d6c79e2dc76aadfd6ca950e0f4bd7f3c0757a08978429634d07eda1 + languageName: node + linkType: hard + +"url@npm:^0.11.0": + version: 0.11.0 + resolution: "url@npm:0.11.0" + dependencies: + punycode: "npm:1.3.2" + querystring: "npm:0.2.0" + checksum: 10c0/bbe05f9f570ec5c06421c50ca63f287e61279092eed0891db69a9619323703ccd3987e6eed234c468794cf25680c599680d5c1f58d26090f1956c8e9ed8346a2 + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + languageName: node + linkType: hard + +"util@npm:0.10.3": + version: 0.10.3 + resolution: "util@npm:0.10.3" + dependencies: + inherits: "npm:2.0.1" + checksum: 10c0/88bb58fec3b1f5f43dea27795f61f24b3b505bbba6f3ad6e91b32db0cd0928b2acb54ebe21603a75743c6e21a52f954cd2ffb6cddafed5a01169dd1287db3ff3 + languageName: node + linkType: hard + +"util@npm:^0.11.0": + version: 0.11.1 + resolution: "util@npm:0.11.1" + dependencies: + inherits: "npm:2.0.3" + checksum: 10c0/8e9d1a85e661c8a8d9883d821aedbff3f8d9c3accd85357020905386ada5653b20389fc3591901e2a0bde64f8dc86b28c3f990114aa5a38eaaf30b455fa3cdf6 + languageName: node + linkType: hard + +"uuid@npm:3.3.2": + version: 3.3.2 + resolution: "uuid@npm:3.3.2" + bin: + uuid: ./bin/uuid + checksum: 10c0/847bd7b389f44d05cf5341134d52803116b616c7344f12c74040effd75280b58273ea3a2bee6ba6e5405688c5edbb0696f4adcbc89e1206dc1d8650bdaece7a6 + languageName: node + linkType: hard + +"validate-npm-package-license@npm:^3.0.1": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f + languageName: node + linkType: hard + +"vendors@npm:^1.0.0": + version: 1.0.4 + resolution: "vendors@npm:1.0.4" + checksum: 10c0/a9b097f3607013a23bf447cbaff85b79b694cc23b20e81a6aea1ea9e1c59854c93f7c87abcc71b57999e050606e499d9ce18df67968823644b20f6e03d56022a + languageName: node + linkType: hard + +"vm-browserify@npm:^1.0.1": + version: 1.1.2 + resolution: "vm-browserify@npm:1.1.2" + checksum: 10c0/0cc1af6e0d880deb58bc974921320c187f9e0a94f25570fca6b1bd64e798ce454ab87dfd797551b1b0cc1849307421aae0193cedf5f06bdb5680476780ee344b + languageName: node + linkType: hard + +"watchpack@npm:^2.3.1": + version: 2.4.0 + resolution: "watchpack@npm:2.4.0" + dependencies: + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.1.2" + checksum: 10c0/c5e35f9fb9338d31d2141d9835643c0f49b5f9c521440bb648181059e5940d93dd8ed856aa8a33fbcdd4e121dad63c7e8c15c063cf485429cd9d427be197fe62 + languageName: node + linkType: hard + +"webpack-bundle-tracker@npm:0.0.9": + version: 0.0.9 + resolution: "webpack-bundle-tracker@npm:0.0.9" + dependencies: + mkdirp: "npm:^0.5.1" + strip-ansi: "npm:^2.0.1" + checksum: 10c0/76da10a1a26deec3e3d10ac4143e9fec9434147a08572561bf00d45ba38807296ff5eb894d5595e2c4124067bcb048f9fa3622932f7f9b5c8111d2526bddb9fe + languageName: node + linkType: hard + +"webpack-sources@npm:^1.0.1, webpack-sources@npm:^1.1.0": + version: 1.4.3 + resolution: "webpack-sources@npm:1.4.3" + dependencies: + source-list-map: "npm:^2.0.0" + source-map: "npm:~0.6.1" + checksum: 10c0/78dafb3e1e297d3f4eb6204311e8c64d28cd028f82887ba33aaf03fffc82482d8e1fdf6de25a60f4dde621d3565f4c3b1bfb350f09add8f4e54e00279ff3db5e + languageName: node + linkType: hard + +"webpack@npm:3.12.0": + version: 3.12.0 + resolution: "webpack@npm:3.12.0" + dependencies: + acorn: "npm:^5.0.0" + acorn-dynamic-import: "npm:^2.0.0" + ajv: "npm:^6.1.0" + ajv-keywords: "npm:^3.1.0" + async: "npm:^2.1.2" + enhanced-resolve: "npm:^3.4.0" + escope: "npm:^3.6.0" + interpret: "npm:^1.0.0" + json-loader: "npm:^0.5.4" + json5: "npm:^0.5.1" + loader-runner: "npm:^2.3.0" + loader-utils: "npm:^1.1.0" + memory-fs: "npm:~0.4.1" + mkdirp: "npm:~0.5.0" + node-libs-browser: "npm:^2.0.0" + source-map: "npm:^0.5.3" + supports-color: "npm:^4.2.1" + tapable: "npm:^0.2.7" + uglifyjs-webpack-plugin: "npm:^0.4.6" + watchpack: "npm:^1.4.0" + webpack-sources: "npm:^1.0.1" + yargs: "npm:^8.0.2" + bin: + webpack: ./bin/webpack.js + checksum: 10c0/64051e33b94d641ea6ed85e6d33d0964ff27ce28f4dd9a989dee39ce98b67fadd057fecd2bfdf49c8fe8909c0c74e415f01381e7a105f926968b1a6eb92f5220 + languageName: node + linkType: hard + +"whet.extend@npm:~0.9.9": + version: 0.9.9 + resolution: "whet.extend@npm:0.9.9" + checksum: 10c0/75c48bfe0cdd36b7c510286d591b34a1a6810ba914b0c8f23788c2a17f4592706debaf1f1f667c7f46f1a657c4f1d5f2889ce234b570827acbb29bf28799ce7f + languageName: node + linkType: hard + +"which-module@npm:^2.0.0": + version: 2.0.0 + resolution: "which-module@npm:2.0.0" + checksum: 10c0/946ffdbcd6f0cf517638f8f2319c6d51e528c3b41bc2c0f5dc3dc46047347abd7326aea5cdf5def0a8b32bdca313ac87a32ce5a76b943fe1ca876c4557e6b716 + languageName: node + linkType: hard + +"which@npm:^1.2.9": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: "npm:^2.0.0" + bin: + which: ./bin/which + checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 + languageName: node + linkType: hard + +"which@npm:^6.0.0": + version: 6.0.1 + resolution: "which@npm:6.0.1" + dependencies: + isexe: "npm:^4.0.0" + bin: + node-which: bin/which.js + checksum: 10c0/7e710e54ea36d2d6183bee2f9caa27a3b47b9baf8dee55a199b736fcf85eab3b9df7556fca3d02b50af7f3dfba5ea3a45644189836df06267df457e354da66d5 + languageName: node + linkType: hard + +"worker-farm@npm:^1.5.2": + version: 1.7.0 + resolution: "worker-farm@npm:1.7.0" + dependencies: + errno: "npm:~0.1.7" + checksum: 10c0/069a032f9198a07273a7608dc0c23d7288c1c25256b66008e1ae95838cda6fa2c7aefb3b7ba760f975c8d18120ca54eb193afb66d7237b2a05e5da12c1c961f7 + languageName: node + linkType: hard + +"wrap-ansi@npm:^2.0.0": + version: 2.1.0 + resolution: "wrap-ansi@npm:2.1.0" + dependencies: + string-width: "npm:^1.0.1" + strip-ansi: "npm:^3.0.1" + checksum: 10c0/1a47367eef192fc9ecaf00238bad5de8987c3368082b619ab36c5e2d6d7b0a2aef95a2ca65840be598c56ced5090a3ba487956c7aee0cac7c45017502fa980fb + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"xtend@npm:>=4.0.0 <4.1.0-0, xtend@npm:^4.0.0, xtend@npm:~4.0.1": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e + languageName: node + linkType: hard + +"y18n@npm:^3.2.1": + version: 3.2.2 + resolution: "y18n@npm:3.2.2" + checksum: 10c0/08dc1880f6f766057ed25cd61ef0c7dab3db93639db9a7487a84f75dac7a349dface8dff8d1d8b7bdf50969fcd69ab858ab26b06968b4e4b12ee60d195233c46 + languageName: node + linkType: hard + +"y18n@npm:^4.0.0": + version: 4.0.3 + resolution: "y18n@npm:4.0.3" + checksum: 10c0/308a2efd7cc296ab2c0f3b9284fd4827be01cfeb647b3ba18230e3a416eb1bc887ac050de9f8c4fd9e7856b2e8246e05d190b53c96c5ad8d8cb56dffb6f81024 + languageName: node + linkType: hard + +"yallist@npm:^2.1.2": + version: 2.1.2 + resolution: "yallist@npm:2.1.2" + checksum: 10c0/0b9e25aa00adf19e01d2bcd4b208aee2b0db643d9927131797b7af5ff69480fc80f1c3db738cbf3946f0bddf39d8f2d0a5709c644fd42d4aa3a4e6e786c087b5 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + +"yargs-parser@npm:^7.0.0": + version: 7.0.0 + resolution: "yargs-parser@npm:7.0.0" + dependencies: + camelcase: "npm:^4.1.0" + checksum: 10c0/6fde2df522dd071cf76308fe4e37fd2fb8eae3eb1fb6c6759c2d448264c8451162649eb8558ac8d83aff79278cabfddc17ecba3e1a0d0fe2e406cf4e1bc95b0d + languageName: node + linkType: hard + +"yargs@npm:^8.0.2": + version: 8.0.2 + resolution: "yargs@npm:8.0.2" + dependencies: + camelcase: "npm:^4.1.0" + cliui: "npm:^3.2.0" + decamelize: "npm:^1.1.1" + get-caller-file: "npm:^1.0.1" + os-locale: "npm:^2.0.0" + read-pkg-up: "npm:^2.0.0" + require-directory: "npm:^2.1.1" + require-main-filename: "npm:^1.0.1" + set-blocking: "npm:^2.0.0" + string-width: "npm:^2.0.0" + which-module: "npm:^2.0.0" + y18n: "npm:^3.2.1" + yargs-parser: "npm:^7.0.0" + checksum: 10c0/70e4ed99e3f1e8a034d0b600773db9fb44e03ec88cfa7125fc65a965428051ad59e77c074afa1afcbe3ec34436d3a6e7ba18b3ec62b4e5f59f30606df791b125 + languageName: node + linkType: hard From 2ea532e0b5e7566dabb82314bf0a65805fef18d8 Mon Sep 17 00:00:00 2001 From: Yuhuai Liu Date: Mon, 23 Mar 2026 13:10:04 -0400 Subject: [PATCH 29/31] yarn with 1.22.19 (#11648) --- admin/yarn.lock | 8603 ++++++++++++++++++++--------------------------- yarn.lock | 7878 ++++++++++++++++++------------------------- 2 files changed, 6941 insertions(+), 9540 deletions(-) diff --git a/admin/yarn.lock b/admin/yarn.lock index 7a99e1b573b..b253aa5b5a0 100644 --- a/admin/yarn.lock +++ b/admin/yarn.lock @@ -1,4965 +1,3638 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 8 - cacheKey: 10c0 - -"@gar/promise-retry@npm:^1.0.0": - version: 1.0.3 - resolution: "@gar/promise-retry@npm:1.0.3" - checksum: 10c0/885b02c8b0d75b2d215da25f3b639158c4fbe8fefe0d79163304534b9a6d0710db4b7699f7cd3cc1a730792bff04cbe19f4850a62d3e105a663eaeec88f38332 - languageName: node - linkType: hard - -"@isaacs/fs-minipass@npm:^4.0.0": - version: 4.0.1 - resolution: "@isaacs/fs-minipass@npm:4.0.1" - dependencies: - minipass: "npm:^7.0.4" - checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 - languageName: node - linkType: hard - -"@npmcli/agent@npm:^4.0.0": - version: 4.0.0 - resolution: "@npmcli/agent@npm:4.0.0" - dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^11.2.1" - socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/f7b5ce0f3dd42c3f8c6546e8433573d8049f67ef11ec22aa4704bc41483122f68bf97752e06302c455ead667af5cb753e6a09bff06632bc465c1cfd4c4b75a53 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^5.0.0": - version: 5.0.0 - resolution: "@npmcli/fs@npm:5.0.0" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/26e376d780f60ff16e874a0ac9bc3399186846baae0b6e1352286385ac134d900cc5dafaded77f38d77f86898fc923ae1cee9d7399f0275b1aa24878915d722b - languageName: node - linkType: hard - -"@npmcli/redact@npm:^4.0.0": - version: 4.0.0 - resolution: "@npmcli/redact@npm:4.0.0" - checksum: 10c0/a1e9ba9c70a6b40e175bda2c3dd8cfdaf096e6b7f7a132c855c083c8dfe545c3237cd56702e2e6627a580b1d63373599d49a1192c4078a85bf47bbde824df31c - languageName: node - linkType: hard - -"JSON2@npm:^0.1.0": - version: 0.1.0 - resolution: "JSON2@npm:0.1.0" - checksum: 10c0/7c8b82a50ff93fd28bf545eaad64c9237fea6df75dab779d2845fdd165806b1534bc420614807ec3f3d6c8697eb545b967daaea7fe1bd69f4df3211fa7635040 - languageName: node - linkType: hard - -"OSF_Admin@workspace:.": - version: 0.0.0-use.local - resolution: "OSF_Admin@workspace:." - dependencies: - babel-core: "npm:^6.0.0" - babel-loader: "npm:^6.4.1" - bootstrap-colorpicker: "npm:^2.5.2" - bootstrap-tagsinput: "npm:^0.7.1" - bower: "npm:^1.3.12" - font-awesome: "npm:^4.5.0" - font-awesome-webpack: "npm:0.0.5-beta.2" - jquery-datetimepicker: "npm:^2.5.21" - json-loader: "npm:^0.5.1" - keen-js: "npm:^3.0.0" - knockout: "npm:3.5.1" - less: "npm:^4.1.2" - less-loader: "npm:^10.2.0" - raven: "npm:^2.6.4" - simple-statistics: "npm:7.7.3" - urijs: "npm:^1.19.7" - webpack: "npm:3.12.0" - webpack-bundle-tracker: "npm:0.0.9" - languageName: unknown - linkType: soft - -"abbrev@npm:^4.0.0": - version: 4.0.0 - resolution: "abbrev@npm:4.0.0" - checksum: 10c0/b4cc16935235e80702fc90192e349e32f8ef0ed151ef506aa78c81a7c455ec18375c4125414b99f84b2e055199d66383e787675f0bcd87da7a4dbd59f9eac1d5 - languageName: node - linkType: hard - -"acorn-dynamic-import@npm:^2.0.0": - version: 2.0.2 - resolution: "acorn-dynamic-import@npm:2.0.2" - dependencies: - acorn: "npm:^4.0.3" - checksum: 10c0/5dcac220ae8ddc8f8439402691c6da21f4e44f3a91b5645884cd2a5f03c8e39a40006a189de9ccd50fdfcdeda6c52724db45cd2100e56e9e9656d7b19e2bfd22 - languageName: node - linkType: hard - -"acorn@npm:^4.0.3": - version: 4.0.13 - resolution: "acorn@npm:4.0.13" - bin: - acorn: ./bin/acorn - checksum: 10c0/ed73e42711474f80d7f2f94d68109e83a40d48c9596f0bcfd1a4c64e086636495259432421357524d04bfe317eed6de5b6202d2ab30f1b1c26bca12684979aa5 - languageName: node - linkType: hard - -"acorn@npm:^5.0.0": - version: 5.7.4 - resolution: "acorn@npm:5.7.4" - bin: - acorn: bin/acorn - checksum: 10c0/b29e61d48fa31ae69d38d74bb213b77b32de6317f125890a6cb76b44d173adccbcd3a07fc9a86acdfe8ab0a80f42b5ec6290df8b7944e0506504ac3b716232bd - languageName: node - linkType: hard - -"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": - version: 7.1.4 - resolution: "agent-base@npm:7.1.4" - checksum: 10c0/c2c9ab7599692d594b6a161559ada307b7a624fa4c7b03e3afdb5a5e31cd0e53269115b620fcab024c5ac6a6f37fa5eb2e004f076ad30f5f7e6b8b671f7b35fe - languageName: node - linkType: hard - -"ajv-errors@npm:^1.0.0": - version: 1.0.1 - resolution: "ajv-errors@npm:1.0.1" - peerDependencies: - ajv: ">=5.0.0" - checksum: 10c0/de2d6e8100c8707ea063ee4785d53adf599b457c0d4f72c3592244d67ad16448a6d35f7ce45f12bdd2819939447c876e8ef2f1c0800896d7f2aa25c3838acdf1 - languageName: node - linkType: hard - -"ajv-keywords@npm:^3.1.0": - version: 3.5.2 - resolution: "ajv-keywords@npm:3.5.2" - peerDependencies: - ajv: ^6.9.1 - checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 - languageName: node - linkType: hard - -"ajv@npm:^6.1.0": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: "npm:^3.1.1" - fast-json-stable-stringify: "npm:^2.0.0" - json-schema-traverse: "npm:^0.4.1" - uri-js: "npm:^4.2.2" - checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 - languageName: node - linkType: hard - -"alphanum-sort@npm:^1.0.1, alphanum-sort@npm:^1.0.2": - version: 1.0.2 - resolution: "alphanum-sort@npm:1.0.2" - checksum: 10c0/2944e7ae4d36328a2df071017c01cd1d06ef6a5d87c8fbbeffd9075d42f4da48051bde79a5e3d863b98f37778c76e8eebd4353c1e7bbba2480382096953ec2b8 - languageName: node - linkType: hard - -"ansi-regex@npm:^1.0.0": - version: 1.1.1 - resolution: "ansi-regex@npm:1.1.1" - checksum: 10c0/182450558e72f6d285fad08eede78f8b4b57d64e5b63c1ef0b1c2274f57daccb5b1c73900e7ee5306c97916a5d9c20e3dee3bdbd4d816d368320151cd17b5a4a - languageName: node - linkType: hard - -"ansi-regex@npm:^2.0.0": - version: 2.1.1 - resolution: "ansi-regex@npm:2.1.1" - checksum: 10c0/78cebaf50bce2cb96341a7230adf28d804611da3ce6bf338efa7b72f06cc6ff648e29f80cd95e582617ba58d5fdbec38abfeed3500a98bce8381a9daec7c548b - languageName: node - linkType: hard - -"ansi-regex@npm:^3.0.0": - version: 3.0.1 - resolution: "ansi-regex@npm:3.0.1" - checksum: 10c0/d108a7498b8568caf4a46eea4f1784ab4e0dfb2e3f3938c697dee21443d622d765c958f2b7e2b9f6b9e55e2e2af0584eaa9915d51782b89a841c28e744e7a167 - languageName: node - linkType: hard - -"ansi-styles@npm:^2.2.1": - version: 2.2.1 - resolution: "ansi-styles@npm:2.2.1" - checksum: 10c0/7c68aed4f1857389e7a12f85537ea5b40d832656babbf511cc7ecd9efc52889b9c3e5653a71a6aade783c3c5e0aa223ad4ff8e83c27ac8a666514e6c79068cab - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.0" - checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b - languageName: node - linkType: hard - -"aproba@npm:^1.1.1": - version: 1.2.0 - resolution: "aproba@npm:1.2.0" - checksum: 10c0/2d34f008c9edfa991f42fe4b667d541d38a474a39ae0e24805350486d76744cd91ee45313283c1d39a055b14026dd0fc4d0cbfc13f210855d59d7e8b5a61dc51 - languageName: node - linkType: hard - -"argparse@npm:^1.0.7": - version: 1.0.10 - resolution: "argparse@npm:1.0.10" - dependencies: - sprintf-js: "npm:~1.0.2" - checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de - languageName: node - linkType: hard - -"asn1.js@npm:^5.2.0": - version: 5.4.1 - resolution: "asn1.js@npm:5.4.1" - dependencies: - bn.js: "npm:^4.0.0" - inherits: "npm:^2.0.1" - minimalistic-assert: "npm:^1.0.0" - safer-buffer: "npm:^2.1.0" - checksum: 10c0/b577232fa6069cc52bb128e564002c62b2b1fe47f7137bdcd709c0b8495aa79cee0f8cc458a831b2d8675900eea0d05781b006be5e1aa4f0ae3577a73ec20324 - languageName: node - linkType: hard - -"assert@npm:^1.1.1": - version: 1.5.0 - resolution: "assert@npm:1.5.0" - dependencies: - object-assign: "npm:^4.1.1" - util: "npm:0.10.3" - checksum: 10c0/188da37d63be479a3b14657c01080db90cdf7fa004e346af916cf8beebcaffb11359c596d0c9c3cd8174c9125a6225796ef1ce533487edc97f8ce3b18c1ab590 - languageName: node - linkType: hard - -"async@npm:^1.4.0": - version: 1.5.2 - resolution: "async@npm:1.5.2" - checksum: 10c0/9ee84592c393aad1047d1223004317ecc65a9a3f76101e0f4614a0818eac962e666510353400a3c9ea158df540579a293f486f3578e918c5e90a0f5ed52e8aea - languageName: node - linkType: hard - -"async@npm:^2.1.2": - version: 2.6.4 - resolution: "async@npm:2.6.4" - dependencies: - lodash: "npm:^4.17.14" - checksum: 10c0/0ebb3273ef96513389520adc88e0d3c45e523d03653cc9b66f5c46f4239444294899bfd13d2b569e7dbfde7da2235c35cf5fd3ece9524f935d41bbe4efccdad0 - languageName: node - linkType: hard - -"autoprefixer@npm:^6.3.1": - version: 6.7.7 - resolution: "autoprefixer@npm:6.7.7" - dependencies: - browserslist: "npm:^1.7.6" - caniuse-db: "npm:^1.0.30000634" - normalize-range: "npm:^0.1.2" - num2fraction: "npm:^1.2.2" - postcss: "npm:^5.2.16" - postcss-value-parser: "npm:^3.2.3" - checksum: 10c0/bdcf8e53eacef1feb54940bbe33fcb67e12eb07d5572d5f0fbadb638b84be15ca91b3a343763962a2ce6ed12ba611e039c62e871d12e29b956b8f2b189c263ae - languageName: node - linkType: hard - -"babel-code-frame@npm:^6.26.0": - version: 6.26.0 - resolution: "babel-code-frame@npm:6.26.0" - dependencies: - chalk: "npm:^1.1.3" - esutils: "npm:^2.0.2" - js-tokens: "npm:^3.0.2" - checksum: 10c0/7fecc128e87578cf1b96e78d2b25e0b260e202bdbbfcefa2eac23b7f8b7b2f7bc9276a14599cde14403cc798cc2a38e428e2cab50b77658ab49228b09ae92473 - languageName: node - linkType: hard - -"babel-core@npm:^6.0.0, babel-core@npm:^6.26.0": - version: 6.26.3 - resolution: "babel-core@npm:6.26.3" - dependencies: - babel-code-frame: "npm:^6.26.0" - babel-generator: "npm:^6.26.0" - babel-helpers: "npm:^6.24.1" - babel-messages: "npm:^6.23.0" - babel-register: "npm:^6.26.0" - babel-runtime: "npm:^6.26.0" - babel-template: "npm:^6.26.0" - babel-traverse: "npm:^6.26.0" - babel-types: "npm:^6.26.0" - babylon: "npm:^6.18.0" - convert-source-map: "npm:^1.5.1" - debug: "npm:^2.6.9" - json5: "npm:^0.5.1" - lodash: "npm:^4.17.4" - minimatch: "npm:^3.0.4" - path-is-absolute: "npm:^1.0.1" - private: "npm:^0.1.8" - slash: "npm:^1.0.0" - source-map: "npm:^0.5.7" - checksum: 10c0/10292649779f8c33d1908f5671c92ca9df036c9e1b9f35f97e7f62c9da9e3a146ee069f94fc401283ce129ba980f34a30339f137c512f3e62ddd354653b2da0e - languageName: node - linkType: hard - -"babel-generator@npm:^6.26.0": - version: 6.26.1 - resolution: "babel-generator@npm:6.26.1" - dependencies: - babel-messages: "npm:^6.23.0" - babel-runtime: "npm:^6.26.0" - babel-types: "npm:^6.26.0" - detect-indent: "npm:^4.0.0" - jsesc: "npm:^1.3.0" - lodash: "npm:^4.17.4" - source-map: "npm:^0.5.7" - trim-right: "npm:^1.0.1" - checksum: 10c0/d5f9d20c6f7d8644dc41ee57d48c98a78d24d5b74dc305cc518d6e0872d4fa73c5fd8d47ec00e3515858eaf3c3e512a703cdbc184ff0061af5979bc206618555 - languageName: node - linkType: hard - -"babel-helpers@npm:^6.24.1": - version: 6.24.1 - resolution: "babel-helpers@npm:6.24.1" - dependencies: - babel-runtime: "npm:^6.22.0" - babel-template: "npm:^6.24.1" - checksum: 10c0/bbd082e42adaa9c584242515e8c5b1e861108e03ed9517f0b600189e1c1041376ab6a15c71265a2cc095c5af4bd15cfc97158e30ce95a81cbfcea1bfd81ce3e6 - languageName: node - linkType: hard - -"babel-loader@npm:^6.4.1": - version: 6.4.1 - resolution: "babel-loader@npm:6.4.1" - dependencies: - find-cache-dir: "npm:^0.1.1" - loader-utils: "npm:^0.2.16" - mkdirp: "npm:^0.5.1" - object-assign: "npm:^4.0.1" - peerDependencies: - babel-core: ^6.0.0 - webpack: 1 || 2 || ^2.1.0-beta || ^2.2.0-rc - checksum: 10c0/6f7395e9433eddfcec39b6ad452b21d4c68798a980e62906e3b2b11926e2c49b949d9ffe97a2ef88cd6843f89ba6110f5634a3b9fc27566d6505dc9496f0e4a5 - languageName: node - linkType: hard - -"babel-messages@npm:^6.23.0": - version: 6.23.0 - resolution: "babel-messages@npm:6.23.0" - dependencies: - babel-runtime: "npm:^6.22.0" - checksum: 10c0/d4fd6414ee5bb1aa0dad6d8d2c4ffaa66331ec5a507959e11f56b19a683566e2c1e7a4d0b16cfef58ea4cc07db8acf5ff3dc8b25c585407cff2e09ac60553401 - languageName: node - linkType: hard - -"babel-register@npm:^6.26.0": - version: 6.26.0 - resolution: "babel-register@npm:6.26.0" - dependencies: - babel-core: "npm:^6.26.0" - babel-runtime: "npm:^6.26.0" - core-js: "npm:^2.5.0" - home-or-tmp: "npm:^2.0.0" - lodash: "npm:^4.17.4" - mkdirp: "npm:^0.5.1" - source-map-support: "npm:^0.4.15" - checksum: 10c0/4ffbc1bfa60a817fb306c98d1a6d10852b0130a614dae3a91e45f391dbebdc95f428d95b489943d85724e046527d2aac3bafb74d3c24f62143492b5f606e2e04 - languageName: node - linkType: hard - -"babel-runtime@npm:^6.22.0, babel-runtime@npm:^6.26.0": - version: 6.26.0 - resolution: "babel-runtime@npm:6.26.0" - dependencies: - core-js: "npm:^2.4.0" - regenerator-runtime: "npm:^0.11.0" - checksum: 10c0/caa752004936b1463765ed3199c52f6a55d0613b9bed108743d6f13ca532b821d4ea9decc4be1b583193164462b1e3e7eefdfa36b15c72e7daac58dd72c1772f - languageName: node - linkType: hard - -"babel-template@npm:^6.24.1, babel-template@npm:^6.26.0": - version: 6.26.0 - resolution: "babel-template@npm:6.26.0" - dependencies: - babel-runtime: "npm:^6.26.0" - babel-traverse: "npm:^6.26.0" - babel-types: "npm:^6.26.0" - babylon: "npm:^6.18.0" - lodash: "npm:^4.17.4" - checksum: 10c0/67bc875f19d289dabb1830a1cde93d7f1e187e4599dac9b1d16392fd47f1d12b53fea902dacf7be360acd09807d440faafe0f7907758c13275b1a14d100b68e4 - languageName: node - linkType: hard - -"babel-traverse@npm:^6.26.0": - version: 6.26.0 - resolution: "babel-traverse@npm:6.26.0" - dependencies: - babel-code-frame: "npm:^6.26.0" - babel-messages: "npm:^6.23.0" - babel-runtime: "npm:^6.26.0" - babel-types: "npm:^6.26.0" - babylon: "npm:^6.18.0" - debug: "npm:^2.6.8" - globals: "npm:^9.18.0" - invariant: "npm:^2.2.2" - lodash: "npm:^4.17.4" - checksum: 10c0/dca71b23d07e3c00833c3222d7998202e687105f461048107afeb2b4a7aa2507efab1bd5a6e3e724724ebb9b1e0b14f0113621e1d8c25b4ffdb829392b54b8de - languageName: node - linkType: hard - -"babel-types@npm:^6.26.0": - version: 6.26.0 - resolution: "babel-types@npm:6.26.0" - dependencies: - babel-runtime: "npm:^6.26.0" - esutils: "npm:^2.0.2" - lodash: "npm:^4.17.4" - to-fast-properties: "npm:^1.0.3" - checksum: 10c0/cabe371de1b32c4bbb1fd4ed0fe8a8726d42e5ad7d5cefb83cdae6de0f0a152dce591e4026719743fdf3aa45f84fea2c8851fb822fbe29b0c78a1f0094b67418 - languageName: node - linkType: hard - -"babylon@npm:^6.18.0": - version: 6.18.0 - resolution: "babylon@npm:6.18.0" - bin: - babylon: ./bin/babylon.js - checksum: 10c0/9b1bf946e16782deadb1f5414c1269efa6044eb1e97a3de2051f09a3f2a54e97be3542d4242b28d23de0ef67816f519d38ce1ec3ddb7be306131c39a60e5a667 - languageName: node - linkType: hard - -"balanced-match@npm:^0.4.2": - version: 0.4.2 - resolution: "balanced-match@npm:0.4.2" - checksum: 10c0/cd4e15add0f4ef14c4fe960d9f4a343052d7c0f7939e1b5e54c8f24417a501bde1f17e191b676daebd16ae316955c918f93b8ed0414bb03d038dd0159c9998e5 - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee - languageName: node - linkType: hard - -"balanced-match@npm:^4.0.2": - version: 4.0.4 - resolution: "balanced-match@npm:4.0.4" - checksum: 10c0/07e86102a3eb2ee2a6a1a89164f29d0dbaebd28f2ca3f5ca786f36b8b23d9e417eb3be45a4acf754f837be5ac0a2317de90d3fcb7f4f4dc95720a1f36b26a17b - languageName: node - linkType: hard - -"base64-js@npm:^1.0.2": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf - languageName: node - linkType: hard - -"big.js@npm:^3.1.3": - version: 3.2.0 - resolution: "big.js@npm:3.2.0" - checksum: 10c0/de0b8e275171060a37846b521e8ebfe077c650532306c2470474da6720feb04351cc8588ef26088756b224923782946ae67e817b90122cc85692bbda7ccd2d0d - languageName: node - linkType: hard - -"big.js@npm:^5.2.2": - version: 5.2.2 - resolution: "big.js@npm:5.2.2" - checksum: 10c0/230520f1ff920b2d2ce3e372d77a33faa4fa60d802fe01ca4ffbc321ee06023fe9a741ac02793ee778040a16b7e497f7d60c504d1c402b8fdab6f03bb785a25f - languageName: node - linkType: hard - -"bluebird@npm:^3.5.1": - version: 3.7.2 - resolution: "bluebird@npm:3.7.2" - checksum: 10c0/680de03adc54ff925eaa6c7bb9a47a0690e8b5de60f4792604aae8ed618c65e6b63a7893b57ca924beaf53eee69c5af4f8314148c08124c550fe1df1add897d2 - languageName: node - linkType: hard - -"bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.9": - version: 4.12.0 - resolution: "bn.js@npm:4.12.0" - checksum: 10c0/9736aaa317421b6b3ed038ff3d4491935a01419ac2d83ddcfebc5717385295fcfcf0c57311d90fe49926d0abbd7a9dbefdd8861e6129939177f7e67ebc645b21 - languageName: node - linkType: hard - -"bn.js@npm:^5.0.0, bn.js@npm:^5.1.1": - version: 5.2.1 - resolution: "bn.js@npm:5.2.1" - checksum: 10c0/bed3d8bd34ec89dbcf9f20f88bd7d4a49c160fda3b561c7bb227501f974d3e435a48fb9b61bc3de304acab9215a3bda0803f7017ffb4d0016a0c3a740a283caa - languageName: node - linkType: hard - -"bootstrap-colorpicker@npm:^2.5.2": - version: 2.5.3 - resolution: "bootstrap-colorpicker@npm:2.5.3" - dependencies: - jquery: "npm:>=1.10" - checksum: 10c0/c150d2b0be75e859cd20957bcd0f75e0d0881553274ccd23783db9f9a844b3fd9ddf048bd831b0a59cf6910c1c2c861198718ada2605a5dd3e3a6076fc77e9ec - languageName: node - linkType: hard - -"bootstrap-tagsinput@npm:^0.7.1": - version: 0.7.1 - resolution: "bootstrap-tagsinput@npm:0.7.1" - checksum: 10c0/3e50b7146c8ea9a704fefe742829099a4bc4f27db723177838f1a796024a4b3a6c03dd269a12369e2e8a4d847284e1f2c058c3398fddbbe80da526946e0ac7f1 - languageName: node - linkType: hard - -"bower@npm:^1.3.12": - version: 1.8.14 - resolution: "bower@npm:1.8.14" - bin: - bower: bin/bower - checksum: 10c0/dbf71f95eaf34785f98793b8dfa2c1eba0b18b9e94b5c052f2019cfbe6135c041f106901c3e96fdc1d83b486472a8da8aea245b1490fe0ea4211f13ea8dd3463 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 - languageName: node - linkType: hard - -"brace-expansion@npm:^5.0.2": - version: 5.0.4 - resolution: "brace-expansion@npm:5.0.4" - dependencies: - balanced-match: "npm:^4.0.2" - checksum: 10c0/359cbcfa80b2eb914ca1f3440e92313fbfe7919ee6b274c35db55bec555aded69dac5ee78f102cec90c35f98c20fa43d10936d0cd9978158823c249257e1643a - languageName: node - linkType: hard - -"brorand@npm:^1.0.1, brorand@npm:^1.1.0": - version: 1.1.0 - resolution: "brorand@npm:1.1.0" - checksum: 10c0/6f366d7c4990f82c366e3878492ba9a372a73163c09871e80d82fb4ae0d23f9f8924cb8a662330308206e6b3b76ba1d528b4601c9ef73c2166b440b2ea3b7571 - languageName: node - linkType: hard - -"browserify-aes@npm:^1.0.0, browserify-aes@npm:^1.0.4": - version: 1.2.0 - resolution: "browserify-aes@npm:1.2.0" - dependencies: - buffer-xor: "npm:^1.0.3" - cipher-base: "npm:^1.0.0" - create-hash: "npm:^1.1.0" - evp_bytestokey: "npm:^1.0.3" - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/967f2ae60d610b7b252a4cbb55a7a3331c78293c94b4dd9c264d384ca93354c089b3af9c0dd023534efdc74ffbc82510f7ad4399cf82bc37bc07052eea485f18 - languageName: node - linkType: hard - -"browserify-cipher@npm:^1.0.0": - version: 1.0.1 - resolution: "browserify-cipher@npm:1.0.1" - dependencies: - browserify-aes: "npm:^1.0.4" - browserify-des: "npm:^1.0.0" - evp_bytestokey: "npm:^1.0.0" - checksum: 10c0/aa256dcb42bc53a67168bbc94ab85d243b0a3b56109dee3b51230b7d010d9b78985ffc1fb36e145c6e4db151f888076c1cfc207baf1525d3e375cbe8187fe27d - languageName: node - linkType: hard - -"browserify-des@npm:^1.0.0": - version: 1.0.2 - resolution: "browserify-des@npm:1.0.2" - dependencies: - cipher-base: "npm:^1.0.1" - des.js: "npm:^1.0.0" - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.1.2" - checksum: 10c0/943eb5d4045eff80a6cde5be4e5fbb1f2d5002126b5a4789c3c1aae3cdddb1eb92b00fb92277f512288e5c6af330730b1dbabcf7ce0923e749e151fcee5a074d - languageName: node - linkType: hard - -"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.0.1": - version: 4.1.0 - resolution: "browserify-rsa@npm:4.1.0" - dependencies: - bn.js: "npm:^5.0.0" - randombytes: "npm:^2.0.1" - checksum: 10c0/fb2b5a8279d8a567a28d8ee03fb62e448428a906bab5c3dc9e9c3253ace551b5ea271db15e566ac78f1b1d71b243559031446604168b9235c351a32cae99d02a - languageName: node - linkType: hard - -"browserify-sign@npm:^4.0.0": - version: 4.2.1 - resolution: "browserify-sign@npm:4.2.1" - dependencies: - bn.js: "npm:^5.1.1" - browserify-rsa: "npm:^4.0.1" - create-hash: "npm:^1.2.0" - create-hmac: "npm:^1.1.7" - elliptic: "npm:^6.5.3" - inherits: "npm:^2.0.4" - parse-asn1: "npm:^5.1.5" - readable-stream: "npm:^3.6.0" - safe-buffer: "npm:^5.2.0" - checksum: 10c0/8f00a370e3e97060977dc58e51251d3ca398ee73523994a44430321e8de2c7d85395362d59014b2b07efe4190f369baee2ff28eb8f405ff4660b776651cf052d - languageName: node - linkType: hard - -"browserify-versionify@npm:1.0.3": - version: 1.0.3 - resolution: "browserify-versionify@npm:1.0.3" - dependencies: - find-root: "npm:^0.1.1" - through2: "npm:0.6.3" - checksum: 10c0/ffe542d32e2536bcc735d382f3f8b9ef0870aa730c5330ff33fe48e182cb4a2b8d7afe6718b2dbefa02a0edbc0293f7d4e34c2b889371d4a08e6c8f28c7d15af - languageName: node - linkType: hard - -"browserify-zlib@npm:^0.2.0": - version: 0.2.0 - resolution: "browserify-zlib@npm:0.2.0" - dependencies: - pako: "npm:~1.0.5" - checksum: 10c0/9ab10b6dc732c6c5ec8ebcbe5cb7fe1467f97402c9b2140113f47b5f187b9438f93a8e065d8baf8b929323c18324fbf1105af479ee86d9d36cab7d7ef3424ad9 - languageName: node - linkType: hard - -"browserslist@npm:^1.3.6, browserslist@npm:^1.5.2, browserslist@npm:^1.7.6": - version: 1.7.7 - resolution: "browserslist@npm:1.7.7" - dependencies: - caniuse-db: "npm:^1.0.30000639" - electron-to-chromium: "npm:^1.2.7" - bin: - browserslist: ./cli.js - checksum: 10c0/1caae2f00800711b3c18a834b84ab3109b955836f23e00a7eb0227e54c22a101b95a9606c1347a04ec882524a724ba57691f856a7aba3fde6dd197b867b8cd41 - languageName: node - linkType: hard - -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 - languageName: node - linkType: hard - -"buffer-xor@npm:^1.0.3": - version: 1.0.3 - resolution: "buffer-xor@npm:1.0.3" - checksum: 10c0/fd269d0e0bf71ecac3146187cfc79edc9dbb054e2ee69b4d97dfb857c6d997c33de391696d04bdd669272751fa48e7872a22f3a6c7b07d6c0bc31dbe02a4075c - languageName: node - linkType: hard - -"buffer@npm:^4.3.0": - version: 4.9.2 - resolution: "buffer@npm:4.9.2" - dependencies: - base64-js: "npm:^1.0.2" - ieee754: "npm:^1.1.4" - isarray: "npm:^1.0.0" - checksum: 10c0/dc443d7e7caab23816b58aacdde710b72f525ad6eecd7d738fcaa29f6d6c12e8d9c13fed7219fd502be51ecf0615f5c077d4bdc6f9308dde2e53f8e5393c5b21 - languageName: node - linkType: hard - -"builtin-status-codes@npm:^3.0.0": - version: 3.0.0 - resolution: "builtin-status-codes@npm:3.0.0" - checksum: 10c0/c37bbba11a34c4431e56bd681b175512e99147defbe2358318d8152b3a01df7bf25e0305873947e5b350073d5ef41a364a22b37e48f1fb6d2fe6d5286a0f348c - languageName: node - linkType: hard - -"cacache@npm:^10.0.4": - version: 10.0.4 - resolution: "cacache@npm:10.0.4" - dependencies: - bluebird: "npm:^3.5.1" - chownr: "npm:^1.0.1" - glob: "npm:^7.1.2" - graceful-fs: "npm:^4.1.11" - lru-cache: "npm:^4.1.1" - mississippi: "npm:^2.0.0" - mkdirp: "npm:^0.5.1" - move-concurrently: "npm:^1.0.1" - promise-inflight: "npm:^1.0.1" - rimraf: "npm:^2.6.2" - ssri: "npm:^5.2.4" - unique-filename: "npm:^1.1.0" - y18n: "npm:^4.0.0" - checksum: 10c0/4c82d037ecc0ef87f58f96ecd3662bdb24aaedd18fa96d749363bc20dee3ac9f623e2c41e09bf894a3f62de1612a8cea8ddae22563a91ce2ef5cb69fe4cf54dd - languageName: node - linkType: hard - -"cacache@npm:^20.0.1": - version: 20.0.4 - resolution: "cacache@npm:20.0.4" - dependencies: - "@npmcli/fs": "npm:^5.0.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^13.0.0" - lru-cache: "npm:^11.1.0" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^7.0.2" - ssri: "npm:^13.0.0" - checksum: 10c0/539bf4020e44ba9ca5afc2ec435623ed7e0dd80c020097677e6b4a0545df5cc9d20b473212d01209c8b4aea43c0d095af0bb6da97bcb991642ea6fac0d7c462b - languageName: node - linkType: hard - -"camelcase@npm:^4.1.0": - version: 4.1.0 - resolution: "camelcase@npm:4.1.0" - checksum: 10c0/54c0b6a85b54fb4e96a9d834a9d0d8f760fd608ab6752a6789042b5e1c38d3dd60f878d2c590d005046445d32d77f6e05e568a91fe8db3e282da0a1560d83058 - languageName: node - linkType: hard - -"caniuse-api@npm:^1.5.2": - version: 1.6.1 - resolution: "caniuse-api@npm:1.6.1" - dependencies: - browserslist: "npm:^1.3.6" - caniuse-db: "npm:^1.0.30000529" - lodash.memoize: "npm:^4.1.2" - lodash.uniq: "npm:^4.5.0" - checksum: 10c0/0769ffb827dcc9d7f6fb1d9616d6ac9dcb0a271cfacd3b1026459f0c5052491ef5a458bdaca12c2204b65bf65aa0c43b880b9bfbe497a0469e319cb48f5da4fb - languageName: node - linkType: hard - -"caniuse-db@npm:^1.0.30000529, caniuse-db@npm:^1.0.30000634, caniuse-db@npm:^1.0.30000639": - version: 1.0.30001359 - resolution: "caniuse-db@npm:1.0.30001359" - checksum: 10c0/8e079ed42d1094b3fd47816947bb1dea3f8efa3dc6cdf7a53482c504c9d8899ab068cb2c922427ada5e00132aeaddde8dff071785399315e32d3173e8c34bc64 - languageName: node - linkType: hard - -"chalk@npm:^1.1.3": - version: 1.1.3 - resolution: "chalk@npm:1.1.3" - dependencies: - ansi-styles: "npm:^2.2.1" - escape-string-regexp: "npm:^1.0.2" - has-ansi: "npm:^2.0.0" - strip-ansi: "npm:^3.0.0" - supports-color: "npm:^2.0.0" - checksum: 10c0/28c3e399ec286bb3a7111fd4225ebedb0d7b813aef38a37bca7c498d032459c265ef43404201d5fbb8d888d29090899c95335b4c0cda13e8b126ff15c541cef8 - languageName: node - linkType: hard - -"chalk@npm:^2.4.1": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 - languageName: node - linkType: hard - -"charenc@npm:0.0.2": - version: 0.0.2 - resolution: "charenc@npm:0.0.2" - checksum: 10c0/a45ec39363a16799d0f9365c8dd0c78e711415113c6f14787a22462ef451f5013efae8a28f1c058f81fc01f2a6a16955f7a5fd0cd56247ce94a45349c89877d8 - languageName: node - linkType: hard - -"chownr@npm:^1.0.1": - version: 1.1.4 - resolution: "chownr@npm:1.1.4" - checksum: 10c0/ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db - languageName: node - linkType: hard - -"chownr@npm:^3.0.0": - version: 3.0.0 - resolution: "chownr@npm:3.0.0" - checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 - languageName: node - linkType: hard - -"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": - version: 1.0.4 - resolution: "cipher-base@npm:1.0.4" - dependencies: - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/d8d005f8b64d8a77b3d3ce531301ae7b45902c9cab4ec8b66bdbd2bf2a1d9fceb9a2133c293eb3c060b2d964da0f14c47fb740366081338aa3795dd1faa8984b - languageName: node - linkType: hard - -"clap@npm:^1.0.9": - version: 1.2.3 - resolution: "clap@npm:1.2.3" - dependencies: - chalk: "npm:^1.1.3" - checksum: 10c0/55da8d6a8b60e4718652e7b4310773cb618fbc0386c7648e57a2639a5696f409cb7b5e079b058759232de80cfda32d01fb38934520bbf7c07cd49898fb74bae2 - languageName: node - linkType: hard - -"cliui@npm:^3.2.0": - version: 3.2.0 - resolution: "cliui@npm:3.2.0" - dependencies: - string-width: "npm:^1.0.1" - strip-ansi: "npm:^3.0.1" - wrap-ansi: "npm:^2.0.0" - checksum: 10c0/07b121fac7fd33ff8dbf3523f0d3dca0329d4e457e57dee54502aa5f27a33cbd9e66aa3e248f0260d8a1431b65b2bad8f510cd97fb8ab6a8e0506310a92e18d5 - languageName: node - linkType: hard - -"clone@npm:^1.0.2": - version: 1.0.4 - resolution: "clone@npm:1.0.4" - checksum: 10c0/2176952b3649293473999a95d7bebfc9dc96410f6cbd3d2595cf12fd401f63a4bf41a7adbfd3ab2ff09ed60cb9870c58c6acdd18b87767366fabfc163700f13b - languageName: node - linkType: hard - -"coa@npm:~1.0.1": - version: 1.0.4 - resolution: "coa@npm:1.0.4" - dependencies: - q: "npm:^1.1.2" - checksum: 10c0/b15bb8d10f8a29b364fa6e4980aff1fee1da7ae4fe721ca9d806d04ddd95e394dcc9b6390028077b1911675e9cae26ea13c0d3fc332cdc3bb0a64e58547f7e60 - languageName: node - linkType: hard - -"code-point-at@npm:^1.0.0": - version: 1.1.0 - resolution: "code-point-at@npm:1.1.0" - checksum: 10c0/33f6b234084e46e6e369b6f0b07949392651b4dde70fc6a592a8d3dafa08d5bb32e3981a02f31f6fc323a26bc03a4c063a9d56834848695bda7611c2417ea2e6 - languageName: node - linkType: hard - -"color-convert@npm:^1.3.0, color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: "npm:1.1.3" - checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 - languageName: node - linkType: hard - -"color-name@npm:^1.0.0": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 - languageName: node - linkType: hard - -"color-string@npm:^0.3.0": - version: 0.3.0 - resolution: "color-string@npm:0.3.0" - dependencies: - color-name: "npm:^1.0.0" - checksum: 10c0/836bbbf58358c541cc5558ecb0376a4c857f08ed37519c2ab63f3d57ec205b52af929629f3d2d58b7d6f7fb7b6769697d83694454b667698be4eb46654f1f818 - languageName: node - linkType: hard - -"color@npm:^0.11.0": - version: 0.11.4 - resolution: "color@npm:0.11.4" - dependencies: - clone: "npm:^1.0.2" - color-convert: "npm:^1.3.0" - color-string: "npm:^0.3.0" - checksum: 10c0/93abcc7e2eb7c254d42b96a889aab887d2bf6fedf901fc13af88f8885377b84a0f0f11a033c3e9ef9e37dca65214466261acc781f00fdec1c8d221d20c4120ee - languageName: node - linkType: hard - -"colormin@npm:^1.0.5": - version: 1.1.2 - resolution: "colormin@npm:1.1.2" - dependencies: - color: "npm:^0.11.0" - css-color-names: "npm:0.0.4" - has: "npm:^1.0.1" - checksum: 10c0/3488aca21bb100864c28b8070d5f86387fd4966bff93f552bb10cdc506a8ed9d42c4e239975b224c70eb664f170f543c74d8bda62f28216268141e8dba12777a - languageName: node - linkType: hard - -"colors@npm:~1.1.2": - version: 1.1.2 - resolution: "colors@npm:1.1.2" - checksum: 10c0/21fa4c575e636d889187b4666988ff16a6464a845089ff7b5e0263883da8cfa9140029300ba67bc3e231f67a4eb610725f9e77cc1d74df47741b691a695aea11 - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.5": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: "npm:~1.0.0" - checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 - languageName: node - linkType: hard - -"commander@npm:~2.13.0": - version: 2.13.0 - resolution: "commander@npm:2.13.0" - checksum: 10c0/e3441096034439e506493ca1e5e9d5d5723ee0eadc3b2b92b3dd332b1d8fcbe72b70a1127f6790e6b3bedde3054316e9fe2cb36cef6ac051000b01559a16ba58 - languageName: node - linkType: hard - -"commondir@npm:^1.0.1": - version: 1.0.1 - resolution: "commondir@npm:1.0.1" - checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 - languageName: node - linkType: hard - -"component-emitter@npm:^1.1.3": - version: 1.3.0 - resolution: "component-emitter@npm:1.3.0" - checksum: 10c0/68774a0a3754fb6c0ba53c2e88886dfbd0c773931066abb1d7fd1b0c893b2a838d8f088ab4dca1f18cc1a4fc2e6932019eba3ded2d931b5ba2241ce40e93a24f - languageName: node - linkType: hard - -"component-emitter@npm:~1.2.0": - version: 1.2.1 - resolution: "component-emitter@npm:1.2.1" - checksum: 10c0/6c27bd7bba028776464cee6c1686c8e02cb9a576a11df93f1fc211ae3eb2de234ae90952d0b7fb3acc9c92c8baa389fa7389681b2e8689d2ca463e94f3ad30b2 - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f - languageName: node - linkType: hard - -"concat-stream@npm:^1.5.0": - version: 1.6.2 - resolution: "concat-stream@npm:1.6.2" - dependencies: - buffer-from: "npm:^1.0.0" - inherits: "npm:^2.0.3" - readable-stream: "npm:^2.2.2" - typedarray: "npm:^0.0.6" - checksum: 10c0/2e9864e18282946dabbccb212c5c7cec0702745e3671679eb8291812ca7fd12023f7d8cb36493942a62f770ac96a7f90009dc5c82ad69893438371720fa92617 - languageName: node - linkType: hard - -"console-browserify@npm:^1.1.0": - version: 1.2.0 - resolution: "console-browserify@npm:1.2.0" - checksum: 10c0/89b99a53b7d6cee54e1e64fa6b1f7ac24b844b4019c5d39db298637e55c1f4ffa5c165457ad984864de1379df2c8e1886cbbdac85d9dbb6876a9f26c3106f226 - languageName: node - linkType: hard - -"constants-browserify@npm:^1.0.0": - version: 1.0.0 - resolution: "constants-browserify@npm:1.0.0" - checksum: 10c0/ab49b1d59a433ed77c964d90d19e08b2f77213fb823da4729c0baead55e3c597f8f97ebccfdfc47bd896d43854a117d114c849a6f659d9986420e97da0f83ac5 - languageName: node - linkType: hard - -"convert-source-map@npm:^1.5.1": - version: 1.8.0 - resolution: "convert-source-map@npm:1.8.0" - dependencies: - safe-buffer: "npm:~5.1.1" - checksum: 10c0/da4649990b633c070c0dab1680b89a67b9315dd2b1168d143536f667214c97e4eb4a49e5b7ff912f0196fe303e31fc16a529457436d25b2b5a89613eaf4f27fa - languageName: node - linkType: hard - -"cookie@npm:0.3.1": - version: 0.3.1 - resolution: "cookie@npm:0.3.1" - checksum: 10c0/0d73c4d605b234c4d04de335aefa4988157f03265845f4a89ea311e3ba1ce73ab42b52d33652ed1c9671342eb77742a58f61753f3e90f31711284fb6031b2962 - languageName: node - linkType: hard - -"cookiejar@npm:2.0.6": - version: 2.0.6 - resolution: "cookiejar@npm:2.0.6" - checksum: 10c0/e62e345b74f29c396720e0592c9f6b7de6b29250867cf5abf6a7e798e4ea2efcb811210439ab6243b5dc2cde9d992133214039b08f7e474142eef441b102a58d - languageName: node - linkType: hard - -"copy-anything@npm:^2.0.1": - version: 2.0.6 - resolution: "copy-anything@npm:2.0.6" - dependencies: - is-what: "npm:^3.14.1" - checksum: 10c0/2702998a8cc015f9917385b7f16b0d85f1f6e5e2fd34d99f14df584838f492f49aa0c390d973684c687e895c5c58d08b308a0400ac3e1e3d6fa1e5884a5402ad - languageName: node - linkType: hard - -"copy-concurrently@npm:^1.0.0": - version: 1.0.5 - resolution: "copy-concurrently@npm:1.0.5" - dependencies: - aproba: "npm:^1.1.1" - fs-write-stream-atomic: "npm:^1.0.8" - iferr: "npm:^0.1.5" - mkdirp: "npm:^0.5.1" - rimraf: "npm:^2.5.4" - run-queue: "npm:^1.0.0" - checksum: 10c0/c2ce213cb27ee3df584d16eb6c9bfe99cfb531585007533c3e4c752521b4fbf0b2f7f90807d79c496683330808ecd9fdbd9ab9ddfa0913150b7f5097423348ce - languageName: node - linkType: hard - -"core-js@npm:^2.4.0, core-js@npm:^2.5.0": - version: 2.6.12 - resolution: "core-js@npm:2.6.12" - checksum: 10c0/00128efe427789120a06b819adc94cc72b96955acb331cb71d09287baf9bd37bebd191d91f1ee4939c893a050307ead4faea08876f09115112612b6a05684b63 - languageName: node - linkType: hard - -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 - languageName: node - linkType: hard - -"create-ecdh@npm:^4.0.0": - version: 4.0.4 - resolution: "create-ecdh@npm:4.0.4" - dependencies: - bn.js: "npm:^4.1.0" - elliptic: "npm:^6.5.3" - checksum: 10c0/77b11a51360fec9c3bce7a76288fc0deba4b9c838d5fb354b3e40c59194d23d66efe6355fd4b81df7580da0661e1334a235a2a5c040b7569ba97db428d466e7f - languageName: node - linkType: hard - -"create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": - version: 1.2.0 - resolution: "create-hash@npm:1.2.0" - dependencies: - cipher-base: "npm:^1.0.1" - inherits: "npm:^2.0.1" - md5.js: "npm:^1.3.4" - ripemd160: "npm:^2.0.1" - sha.js: "npm:^2.4.0" - checksum: 10c0/d402e60e65e70e5083cb57af96d89567954d0669e90550d7cec58b56d49c4b193d35c43cec8338bc72358198b8cbf2f0cac14775b651e99238e1cf411490f915 - languageName: node - linkType: hard - -"create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": - version: 1.1.7 - resolution: "create-hmac@npm:1.1.7" - dependencies: - cipher-base: "npm:^1.0.3" - create-hash: "npm:^1.1.0" - inherits: "npm:^2.0.1" - ripemd160: "npm:^2.0.0" - safe-buffer: "npm:^5.0.1" - sha.js: "npm:^2.4.8" - checksum: 10c0/24332bab51011652a9a0a6d160eed1e8caa091b802335324ae056b0dcb5acbc9fcf173cf10d128eba8548c3ce98dfa4eadaa01bd02f44a34414baee26b651835 - languageName: node - linkType: hard - -"cross-spawn@npm:^5.0.1": - version: 5.1.0 - resolution: "cross-spawn@npm:5.1.0" - dependencies: - lru-cache: "npm:^4.0.1" - shebang-command: "npm:^1.2.0" - which: "npm:^1.2.9" - checksum: 10c0/1918621fddb9f8c61e02118b2dbf81f611ccd1544ceaca0d026525341832b8511ce2504c60f935dbc06b35e5ef156fe8c1e72708c27dd486f034e9c0e1e07201 - languageName: node - linkType: hard - -"crypt@npm:0.0.2": - version: 0.0.2 - resolution: "crypt@npm:0.0.2" - checksum: 10c0/adbf263441dd801665d5425f044647533f39f4612544071b1471962209d235042fb703c27eea2795c7c53e1dfc242405173003f83cf4f4761a633d11f9653f18 - languageName: node - linkType: hard - -"crypto-browserify@npm:^3.11.0": - version: 3.12.0 - resolution: "crypto-browserify@npm:3.12.0" - dependencies: - browserify-cipher: "npm:^1.0.0" - browserify-sign: "npm:^4.0.0" - create-ecdh: "npm:^4.0.0" - create-hash: "npm:^1.1.0" - create-hmac: "npm:^1.1.0" - diffie-hellman: "npm:^5.0.0" - inherits: "npm:^2.0.1" - pbkdf2: "npm:^3.0.3" - public-encrypt: "npm:^4.0.0" - randombytes: "npm:^2.0.0" - randomfill: "npm:^1.0.3" - checksum: 10c0/0c20198886576050a6aa5ba6ae42f2b82778bfba1753d80c5e7a090836890dc372bdc780986b2568b4fb8ed2a91c958e61db1f0b6b1cc96af4bd03ffc298ba92 - languageName: node - linkType: hard - -"css-color-names@npm:0.0.4": - version: 0.0.4 - resolution: "css-color-names@npm:0.0.4" - checksum: 10c0/88ef97c25bcfb217469cdff428049022438cc546eb208210f0edec03b75050723db3ba02cd0f4959c84cd0659be0b43af3323eff80d1ba5fb15c2accf09ccbe2 - languageName: node - linkType: hard - -"css-loader@npm:^0.28.11": - version: 0.28.11 - resolution: "css-loader@npm:0.28.11" - dependencies: - babel-code-frame: "npm:^6.26.0" - css-selector-tokenizer: "npm:^0.7.0" - cssnano: "npm:^3.10.0" - icss-utils: "npm:^2.1.0" - loader-utils: "npm:^1.0.2" - lodash.camelcase: "npm:^4.3.0" - object-assign: "npm:^4.1.1" - postcss: "npm:^5.0.6" - postcss-modules-extract-imports: "npm:^1.2.0" - postcss-modules-local-by-default: "npm:^1.2.0" - postcss-modules-scope: "npm:^1.1.0" - postcss-modules-values: "npm:^1.3.0" - postcss-value-parser: "npm:^3.3.0" - source-list-map: "npm:^2.0.0" - checksum: 10c0/36434d7fafde8a4de3995c444713a455df17f74cfe10f089481cb7918db6f206267301daf2ae0496544809ca35bb226df47aa4edeb9580704c96281a07091f8b - languageName: node - linkType: hard - -"css-selector-tokenizer@npm:^0.7.0": - version: 0.7.3 - resolution: "css-selector-tokenizer@npm:0.7.3" - dependencies: - cssesc: "npm:^3.0.0" - fastparse: "npm:^1.1.2" - checksum: 10c0/bc4d14204bf5716f70085526bf370cbdd1c643dcb2e7366ba96212649fa5a07885e3f5dc2bde53646bac557ded79a60c7118cf7cf5d4dda898353a9e08277649 - languageName: node - linkType: hard - -"cssesc@npm:^3.0.0": - version: 3.0.0 - resolution: "cssesc@npm:3.0.0" - bin: - cssesc: bin/cssesc - checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7 - languageName: node - linkType: hard - -"cssnano@npm:^3.10.0": - version: 3.10.0 - resolution: "cssnano@npm:3.10.0" - dependencies: - autoprefixer: "npm:^6.3.1" - decamelize: "npm:^1.1.2" - defined: "npm:^1.0.0" - has: "npm:^1.0.1" - object-assign: "npm:^4.0.1" - postcss: "npm:^5.0.14" - postcss-calc: "npm:^5.2.0" - postcss-colormin: "npm:^2.1.8" - postcss-convert-values: "npm:^2.3.4" - postcss-discard-comments: "npm:^2.0.4" - postcss-discard-duplicates: "npm:^2.0.1" - postcss-discard-empty: "npm:^2.0.1" - postcss-discard-overridden: "npm:^0.1.1" - postcss-discard-unused: "npm:^2.2.1" - postcss-filter-plugins: "npm:^2.0.0" - postcss-merge-idents: "npm:^2.1.5" - postcss-merge-longhand: "npm:^2.0.1" - postcss-merge-rules: "npm:^2.0.3" - postcss-minify-font-values: "npm:^1.0.2" - postcss-minify-gradients: "npm:^1.0.1" - postcss-minify-params: "npm:^1.0.4" - postcss-minify-selectors: "npm:^2.0.4" - postcss-normalize-charset: "npm:^1.1.0" - postcss-normalize-url: "npm:^3.0.7" - postcss-ordered-values: "npm:^2.1.0" - postcss-reduce-idents: "npm:^2.2.2" - postcss-reduce-initial: "npm:^1.0.0" - postcss-reduce-transforms: "npm:^1.0.3" - postcss-svgo: "npm:^2.1.1" - postcss-unique-selectors: "npm:^2.0.2" - postcss-value-parser: "npm:^3.2.3" - postcss-zindex: "npm:^2.0.1" - checksum: 10c0/1231f79be4761fa61478fb2a51d1aa95798eb426e33cde95341b5e9c71ec56c170fcc4c8d0618a8961033efb9da6230539eea933431c983ef065c014865e50f4 - languageName: node - linkType: hard - -"csso@npm:~2.3.1": - version: 2.3.2 - resolution: "csso@npm:2.3.2" - dependencies: - clap: "npm:^1.0.9" - source-map: "npm:^0.5.3" - bin: - csso: ./bin/csso - checksum: 10c0/e36a1cae8f371327cbf22d6770b8827291fa4f372bbaab938d5afc869e73f0a452ba4e87738bf03bfbb3bba27770efa04a6b4acaf5f36e94f88e8c481b9df7fa - languageName: node - linkType: hard - -"cyclist@npm:^1.0.1": - version: 1.0.1 - resolution: "cyclist@npm:1.0.1" - checksum: 10c0/3381d3b66a3b268e6e0abcc1fa8fbeeb9a98391d8455677509f9833813d7680cc737a10141f54c229e42f5b3133250f36f1aa04f56ef4ba9b29fa728c3c48c01 - languageName: node - linkType: hard - -"d@npm:1, d@npm:^1.0.1": - version: 1.0.1 - resolution: "d@npm:1.0.1" - dependencies: - es5-ext: "npm:^0.10.50" - type: "npm:^1.0.1" - checksum: 10c0/1fedcb3b956a461f64d86b94b347441beff5cef8910b6ac4ec509a2c67eeaa7093660a98b26601ac91f91260238add73bdf25867a9c0cb783774642bc4c1523f - languageName: node - linkType: hard - -"debug@npm:2, debug@npm:^2.6.8, debug@npm:^2.6.9": - version: 2.6.9 - resolution: "debug@npm:2.6.9" - dependencies: - ms: "npm:2.0.0" - checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.3.4": - version: 4.4.3 - resolution: "debug@npm:4.4.3" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 - languageName: node - linkType: hard - -"debug@npm:^3.2.6": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: "npm:^2.1.1" - checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a - languageName: node - linkType: hard - -"decamelize@npm:^1.1.1, decamelize@npm:^1.1.2": - version: 1.2.0 - resolution: "decamelize@npm:1.2.0" - checksum: 10c0/85c39fe8fbf0482d4a1e224ef0119db5c1897f8503bcef8b826adff7a1b11414972f6fef2d7dec2ee0b4be3863cf64ac1439137ae9e6af23a3d8dcbe26a5b4b2 - languageName: node - linkType: hard - -"defined@npm:^1.0.0": - version: 1.0.0 - resolution: "defined@npm:1.0.0" - checksum: 10c0/2b9929414857729a97cfcc77987e65005e03b3fd92747e1d6a743b054c1387b62e669dc453b53e3a8105f1398df6aad54c07eed984871c93be8c7f4560a1828b - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 - languageName: node - linkType: hard - -"des.js@npm:^1.0.0": - version: 1.0.1 - resolution: "des.js@npm:1.0.1" - dependencies: - inherits: "npm:^2.0.1" - minimalistic-assert: "npm:^1.0.0" - checksum: 10c0/69bf742d1c381e01d75151bdcaac71a18d251d7debfc9b6ae5ee4b4edaf39691ae203c5ec9173ba89aedb3ddc622cdff4fca065448c6c2afb1140d9fb826339d - languageName: node - linkType: hard - -"detect-indent@npm:^4.0.0": - version: 4.0.0 - resolution: "detect-indent@npm:4.0.0" - dependencies: - repeating: "npm:^2.0.0" - checksum: 10c0/066a0d13eadebb1e7d2ba395fdf9f3956f31f8383a6db263320108c283e2230250a102f4871f54926cc8a77c6323ac7103f30550a4ac3d6518aa1b934c041295 - languageName: node - linkType: hard - -"diffie-hellman@npm:^5.0.0": - version: 5.0.3 - resolution: "diffie-hellman@npm:5.0.3" - dependencies: - bn.js: "npm:^4.1.0" - miller-rabin: "npm:^4.0.0" - randombytes: "npm:^2.0.0" - checksum: 10c0/ce53ccafa9ca544b7fc29b08a626e23a9b6562efc2a98559a0c97b4718937cebaa9b5d7d0a05032cc9c1435e9b3c1532b9e9bf2e0ede868525922807ad6e1ecf - languageName: node - linkType: hard - -"domain-browser@npm:^1.1.1": - version: 1.2.0 - resolution: "domain-browser@npm:1.2.0" - checksum: 10c0/a955f482f4b4710fbd77c12a33e77548d63603c30c80f61a80519f27e3db1ba8530b914584cc9e9365d2038753d6b5bd1f4e6c81e432b007b0ec95b8b5e69b1b - languageName: node - linkType: hard - -"domready@npm:0.3.0": - version: 0.3.0 - resolution: "domready@npm:0.3.0" - checksum: 10c0/c08ad5ece9e4d4bb5425422534c580c93443956acb1963019788ac1607c671d25de38f540b6d57f18e9364690ae010b81eb13a4c1fbef1cbedddeabf08963eff - languageName: node - linkType: hard - -"duplexify@npm:^3.4.2, duplexify@npm:^3.6.0": - version: 3.7.1 - resolution: "duplexify@npm:3.7.1" - dependencies: - end-of-stream: "npm:^1.0.0" - inherits: "npm:^2.0.1" - readable-stream: "npm:^2.0.0" - stream-shift: "npm:^1.0.0" - checksum: 10c0/59d1440c1b4e3a4db35ae96933392703ce83518db1828d06b9b6322920d6cbbf0b7159e88be120385fe459e77f1eb0c7622f26e9ec1f47c9ff05c2b35747dbd3 - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.2.7": - version: 1.4.172 - resolution: "electron-to-chromium@npm:1.4.172" - checksum: 10c0/b0543ef0331708ccfb049f71be39edd340d9d4e8e0f7cafec9c7e3e8a7982c88d36bbc143b2e29858e42d5bccafbe394b6f389c95c23ed9f8c499e59b93ce623 - languageName: node - linkType: hard - -"elliptic@npm:^6.5.3": - version: 6.5.4 - resolution: "elliptic@npm:6.5.4" - dependencies: - bn.js: "npm:^4.11.9" - brorand: "npm:^1.1.0" - hash.js: "npm:^1.0.0" - hmac-drbg: "npm:^1.0.1" - inherits: "npm:^2.0.4" - minimalistic-assert: "npm:^1.0.1" - minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 10c0/5f361270292c3b27cf0843e84526d11dec31652f03c2763c6c2b8178548175ff5eba95341dd62baff92b2265d1af076526915d8af6cc9cb7559c44a62f8ca6e2 - languageName: node - linkType: hard - -"emojis-list@npm:^2.0.0": - version: 2.1.0 - resolution: "emojis-list@npm:2.1.0" - checksum: 10c0/bbb941223bfb3e38054cb52ed1b3098a8dac0a90fdd2699eb8a3af3b2172cdc4af0932e05c3edd52e814997c8f45cf1d7f5e86e9ecdcd4e2390a0f27e6914db5 - languageName: node - linkType: hard - -"emojis-list@npm:^3.0.0": - version: 3.0.0 - resolution: "emojis-list@npm:3.0.0" - checksum: 10c0/7dc4394b7b910444910ad64b812392159a21e1a7ecc637c775a440227dcb4f80eff7fe61f4453a7d7603fa23d23d30cc93fe9e4b5ed985b88d6441cd4a35117b - languageName: node - linkType: hard - -"end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" - dependencies: - once: "npm:^1.4.0" - checksum: 10c0/870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 - languageName: node - linkType: hard - -"enhanced-resolve@npm:^3.4.0": - version: 3.4.1 - resolution: "enhanced-resolve@npm:3.4.1" - dependencies: - graceful-fs: "npm:^4.1.2" - memory-fs: "npm:^0.4.0" - object-assign: "npm:^4.0.1" - tapable: "npm:^0.2.7" - checksum: 10c0/91f2da7e8e5ab2376823843a0e0176f683cfdb5749efbb6e1f26580b285593bb5b69006a1ae5e068c21ab1eb90271eec8b8fd6aa3ac36cc6f1f6de4d37a06456 - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 - languageName: node - linkType: hard - -"errno@npm:^0.1.1, errno@npm:^0.1.3, errno@npm:~0.1.7": - version: 0.1.8 - resolution: "errno@npm:0.1.8" - dependencies: - prr: "npm:~1.0.1" - bin: - errno: cli.js - checksum: 10c0/83758951967ec57bf00b5f5b7dc797e6d65a6171e57ea57adcf1bd1a0b477fd9b5b35fae5be1ff18f4090ed156bce1db749fe7e317aac19d485a5d150f6a4936 - languageName: node - linkType: hard - -"error-ex@npm:^1.2.0": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" - dependencies: - is-arrayish: "npm:^0.2.1" - checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce - languageName: node - linkType: hard - -"es5-ext@npm:^0.10.35, es5-ext@npm:^0.10.46, es5-ext@npm:^0.10.50, es5-ext@npm:~0.10.14": - version: 0.10.61 - resolution: "es5-ext@npm:0.10.61" - dependencies: - es6-iterator: "npm:^2.0.3" - es6-symbol: "npm:^3.1.3" - next-tick: "npm:^1.1.0" - checksum: 10c0/fceee484bbf3d7b064b8b3b9ad9095fa64e8736de322f8b48abd162f215bdd503390a3bb8c3cdeebae619825111f7eff83e1e4400fe232733da027ade8e1823e - languageName: node - linkType: hard - -"es6-iterator@npm:^2.0.3, es6-iterator@npm:~2.0.1": - version: 2.0.3 - resolution: "es6-iterator@npm:2.0.3" - dependencies: - d: "npm:1" - es5-ext: "npm:^0.10.35" - es6-symbol: "npm:^3.1.1" - checksum: 10c0/91f20b799dba28fb05bf623c31857fc1524a0f1c444903beccaf8929ad196c8c9ded233e5ac7214fc63a92b3f25b64b7f2737fcca8b1f92d2d96cf3ac902f5d8 - languageName: node - linkType: hard - -"es6-map@npm:^0.1.3": - version: 0.1.5 - resolution: "es6-map@npm:0.1.5" - dependencies: - d: "npm:1" - es5-ext: "npm:~0.10.14" - es6-iterator: "npm:~2.0.1" - es6-set: "npm:~0.1.5" - es6-symbol: "npm:~3.1.1" - event-emitter: "npm:~0.3.5" - checksum: 10c0/62fe1a90ead1704bed699cb9c975e642023f590d5338c2a640d60ce0a846de7d5197561393ac03dd11473b96087cf8793c9e4836fe05ad4d2ef6afda6b9a3511 - languageName: node - linkType: hard - -"es6-set@npm:~0.1.5": - version: 0.1.5 - resolution: "es6-set@npm:0.1.5" - dependencies: - d: "npm:1" - es5-ext: "npm:~0.10.14" - es6-iterator: "npm:~2.0.1" - es6-symbol: "npm:3.1.1" - event-emitter: "npm:~0.3.5" - checksum: 10c0/a1fe925f77bd529b7b5135ca1a8bc9ff378fa0e3fd9686f3ac1b8e87eb00fbffc100e81a3c44262cd324cbfcc772d7a75ca5471e3fb24247ac85c5beb6af0d14 - languageName: node - linkType: hard - -"es6-symbol@npm:3.1.1": - version: 3.1.1 - resolution: "es6-symbol@npm:3.1.1" - dependencies: - d: "npm:1" - es5-ext: "npm:~0.10.14" - checksum: 10c0/eb4ec788a99dc2c04e5e9abd90f478991425a881eced99a7165eada0c832bfc9a8fbb76b688c3c3b6e103f94d23e8e19addf9cf18abb537fb918d066d5ce1d7f - languageName: node - linkType: hard - -"es6-symbol@npm:^3.1.1, es6-symbol@npm:^3.1.3, es6-symbol@npm:~3.1.1": - version: 3.1.3 - resolution: "es6-symbol@npm:3.1.3" - dependencies: - d: "npm:^1.0.1" - ext: "npm:^1.1.2" - checksum: 10c0/22982f815f00df553a89f4fb74c5048fed85df598482b4bd38dbd173174247949c72982a7d7132a58b147525398400e5f182db59b0916cb49f1e245fb0e22233 - languageName: node - linkType: hard - -"es6-weak-map@npm:^2.0.1": - version: 2.0.3 - resolution: "es6-weak-map@npm:2.0.3" - dependencies: - d: "npm:1" - es5-ext: "npm:^0.10.46" - es6-iterator: "npm:^2.0.3" - es6-symbol: "npm:^3.1.1" - checksum: 10c0/460932be9542473dbbddd183e21c15a66cfec1b2c17dae2b514e190d6fb2896b7eb683783d4b36da036609d2e1c93d2815f21b374dfccaf02a8978694c2f7b67 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 - languageName: node - linkType: hard - -"escope@npm:^3.6.0": - version: 3.6.0 - resolution: "escope@npm:3.6.0" - dependencies: - es6-map: "npm:^0.1.3" - es6-weak-map: "npm:^2.0.1" - esrecurse: "npm:^4.1.0" - estraverse: "npm:^4.1.1" - checksum: 10c0/79cbb30bf126628eb7e586575b2f5fd31b14ea108cd2379c571fe4dc09ea5208f42dacf1cd43a702b59efccb128e9c9e7762d5cd670d2d184a889947aea509e5 - languageName: node - linkType: hard - -"esprima@npm:^2.6.0": - version: 2.7.3 - resolution: "esprima@npm:2.7.3" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: 10c0/6e1e99f280eed2ecd521ae28217c5f7c7a03fd0a1ac913bffd4a4ba278caf32cb8d9fc01e41d4b4bc904617282873dea297d60e1f93ea20156f29994c348a04f - languageName: node - linkType: hard - -"esrecurse@npm:^4.1.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: "npm:^5.2.0" - checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 - languageName: node - linkType: hard - -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d - languageName: node - linkType: hard - -"estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 - languageName: node - linkType: hard - -"event-emitter@npm:~0.3.5": - version: 0.3.5 - resolution: "event-emitter@npm:0.3.5" - dependencies: - d: "npm:1" - es5-ext: "npm:~0.10.14" - checksum: 10c0/75082fa8ffb3929766d0f0a063bfd6046bd2a80bea2666ebaa0cfd6f4a9116be6647c15667bea77222afc12f5b4071b68d393cf39fdaa0e8e81eda006160aff0 - languageName: node - linkType: hard - -"events@npm:^3.0.0": - version: 3.3.0 - resolution: "events@npm:3.3.0" - checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 - languageName: node - linkType: hard - -"evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3": - version: 1.0.3 - resolution: "evp_bytestokey@npm:1.0.3" - dependencies: - md5.js: "npm:^1.3.4" - node-gyp: "npm:latest" - safe-buffer: "npm:^5.1.1" - checksum: 10c0/77fbe2d94a902a80e9b8f5a73dcd695d9c14899c5e82967a61b1fc6cbbb28c46552d9b127cff47c45fcf684748bdbcfa0a50410349109de87ceb4b199ef6ee99 - languageName: node - linkType: hard - -"execa@npm:^0.7.0": - version: 0.7.0 - resolution: "execa@npm:0.7.0" - dependencies: - cross-spawn: "npm:^5.0.1" - get-stream: "npm:^3.0.0" - is-stream: "npm:^1.1.0" - npm-run-path: "npm:^2.0.0" - p-finally: "npm:^1.0.0" - signal-exit: "npm:^3.0.0" - strip-eof: "npm:^1.0.0" - checksum: 10c0/812f1776e2a6b2226532e43c1af87d8a12e26de03a06e7e043f653acf5565e0656f5f6c64d66726fefa17178ac129caaa419a50905934e7c4a846417abb25d4a - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.3 - resolution: "exponential-backoff@npm:3.1.3" - checksum: 10c0/77e3ae682b7b1f4972f563c6dbcd2b0d54ac679e62d5d32f3e5085feba20483cf28bd505543f520e287a56d4d55a28d7874299941faf637e779a1aa5994d1267 - languageName: node - linkType: hard - -"ext@npm:^1.1.2": - version: 1.6.0 - resolution: "ext@npm:1.6.0" - dependencies: - type: "npm:^2.5.0" - checksum: 10c0/d6ff29ca86fbe4e69743d10702ece124e0239faa435a6c3b2833282787b9eace2c8cbf5d8439d0c85312255d5472d251bf3cd4c4d1b9de8f8a8090e6b43db948 - languageName: node - linkType: hard - -"extend@npm:3.0.0": - version: 3.0.0 - resolution: "extend@npm:3.0.0" - checksum: 10c0/67a867fd39abcd36f3d11e99c6e2808d0237214239ca7a194278b1a91790945a3755e22fd4e16521a247e511f9bce866142b483e1ca61d33d7c2317aa98ecf5a - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b - languageName: node - linkType: hard - -"fastparse@npm:^1.1.2": - version: 1.1.2 - resolution: "fastparse@npm:1.1.2" - checksum: 10c0/c08d6e7ef10c0928426c1963dd4593e2baaf44d223ab1e5ba5d7b30470144b3a4ecb3605958b73754cea3f857ecef00b67c885f07ca2c312b38b67d9d88b84b5 - languageName: node - linkType: hard - -"fdir@npm:^6.5.0": - version: 6.5.0 - resolution: "fdir@npm:6.5.0" - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f - languageName: node - linkType: hard - -"find-cache-dir@npm:^0.1.1": - version: 0.1.1 - resolution: "find-cache-dir@npm:0.1.1" - dependencies: - commondir: "npm:^1.0.1" - mkdirp: "npm:^0.5.1" - pkg-dir: "npm:^1.0.0" - checksum: 10c0/797d978c94352851f684d0565e3a60eca4aa380be91643c0a9066eec48c75ee0b382f6b04309fa6d183dea0bff1471ad7da116fcc7c8f95d4af8f5aca444ec41 - languageName: node - linkType: hard - -"find-cache-dir@npm:^1.0.0": - version: 1.0.0 - resolution: "find-cache-dir@npm:1.0.0" - dependencies: - commondir: "npm:^1.0.1" - make-dir: "npm:^1.0.0" - pkg-dir: "npm:^2.0.0" - checksum: 10c0/264b706771f30b39385cf921a5576c80ef95cb4c8ef2df8761b8be62326a1537ea63feecf0deac52cd84d6937b312a8d9554b4012a092937ade43a165cd5b6f9 - languageName: node - linkType: hard - -"find-root@npm:^0.1.1": - version: 0.1.2 - resolution: "find-root@npm:0.1.2" - checksum: 10c0/698fd94b2505da9c5ceee77d76b7a152ec5dbd3000f354497f95a66de3c0f249d5cd43fb2a05afb5715baf1a4a91498f90a66e0c3844a09fbd0afe0f16024058 - languageName: node - linkType: hard - -"find-up@npm:^1.0.0": - version: 1.1.2 - resolution: "find-up@npm:1.1.2" - dependencies: - path-exists: "npm:^2.0.0" - pinkie-promise: "npm:^2.0.0" - checksum: 10c0/51e35c62d9b7efe82d7d5cce966bfe10c2eaa78c769333f8114627e3a8a4a4f50747f5f50bff50b1094cbc6527776f0d3b9ff74d3561ef714a5290a17c80c2bc - languageName: node - linkType: hard - -"find-up@npm:^2.0.0, find-up@npm:^2.1.0": - version: 2.1.0 - resolution: "find-up@npm:2.1.0" - dependencies: - locate-path: "npm:^2.0.0" - checksum: 10c0/c080875c9fe28eb1962f35cbe83c683796a0321899f1eed31a37577800055539815de13d53495049697d3ba313013344f843bb9401dd337a1b832be5edfc6840 - languageName: node - linkType: hard - -"flatten@npm:^1.0.2": - version: 1.0.3 - resolution: "flatten@npm:1.0.3" - checksum: 10c0/9f9b1f3dcd05be057bb83ec27f2513da5306e7bfc0cf8bd839ab423eb1b0f99683a25c97b48fafd5959819159659ce9f1397623a46f89a8577ba095fcf5fb753 - languageName: node - linkType: hard - -"flush-write-stream@npm:^1.0.0": - version: 1.1.1 - resolution: "flush-write-stream@npm:1.1.1" - dependencies: - inherits: "npm:^2.0.3" - readable-stream: "npm:^2.3.6" - checksum: 10c0/2cd4f65b728d5f388197a03dafabc6a5e4f0c2ed1a2d912e288f7aa1c2996dd90875e55b50cf32c78dca55ad2e2dfae5d3db09b223838388033d87cf5920dd87 - languageName: node - linkType: hard - -"font-awesome-webpack@npm:0.0.5-beta.2": - version: 0.0.5-beta.2 - resolution: "font-awesome-webpack@npm:0.0.5-beta.2" - dependencies: - css-loader: "npm:~0.26.1" - less-loader: "npm:~2.2.3" - style-loader: "npm:~0.13.1" - peerDependencies: - font-awesome: ">=4.3.0" - checksum: 10c0/fd36231eba4f9e9cacbcbcc1b814b03c99ba9ea0d8520a0870da6bf8bd049f2107b39866769e678c4f214e93da9a13a056d40ee260fed1071a1abf0763fdf0a4 - languageName: node - linkType: hard - -"font-awesome@npm:^4.5.0": - version: 4.7.0 - resolution: "font-awesome@npm:4.7.0" - checksum: 10c0/1c456e2939c55192eed67db9c0efb8db3e92fd357ca189ca00030eb44acffa1e9f835288d2204c14b9a9c490a7b14b7090dfaff80ded6b2473f50a923dfb41e7 - languageName: node - linkType: hard - -"form-data@npm:1.0.0-rc3": - version: 1.0.0-rc3 - resolution: "form-data@npm:1.0.0-rc3" - dependencies: - async: "npm:^1.4.0" - combined-stream: "npm:^1.0.5" - mime-types: "npm:^2.1.3" - checksum: 10c0/d67674a76f46253f69aebdc5c1c86aa123385940d147346b2f801681656ab5df6b82bd9568483e1579fd53bf277795f2da7592c6a842893465ef69e9073c342f - languageName: node - linkType: hard - -"formidable@npm:~1.0.14": - version: 1.0.17 - resolution: "formidable@npm:1.0.17" - checksum: 10c0/651c7394574ab6b451467200495bcb5064776419d883e6f82512f31019a0528de90c729d28d89d519eb00cb456302206aa389a4d63d2aba69eef5653ba863714 - languageName: node - linkType: hard - -"from2@npm:^2.1.0": - version: 2.3.0 - resolution: "from2@npm:2.3.0" - dependencies: - inherits: "npm:^2.0.1" - readable-stream: "npm:^2.0.0" - checksum: 10c0/f87f7a2e4513244d551454a7f8324ef1f7837864a8701c536417286ec19ff4915606b1dfa8909a21b7591ebd8440ffde3642f7c303690b9a4d7c832d62248aa1 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 - languageName: node - linkType: hard - -"fs-write-stream-atomic@npm:^1.0.8": - version: 1.0.10 - resolution: "fs-write-stream-atomic@npm:1.0.10" - dependencies: - graceful-fs: "npm:^4.1.2" - iferr: "npm:^0.1.5" - imurmurhash: "npm:^0.1.4" - readable-stream: "npm:1 || 2" - checksum: 10c0/293b2b4ed346d35a28f8637a20cb2aef31be86503da501c42c2eda8fefed328bac16ce0e5daa7019f9329d73930c58031eaea2ce0c70f1680943fbfb7cff808b - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 - languageName: node - linkType: hard - -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: 10c0/60b74b2407e1942e1ed7f8c284f8ef714d0689dcfce5319985a5b7da3fc727f40b4a59ec72dc55aa83365ad7b8fa4fac3a30d93c850a2b452f29ae03dbc10a1e - languageName: node - linkType: hard - -"get-caller-file@npm:^1.0.1": - version: 1.0.3 - resolution: "get-caller-file@npm:1.0.3" - checksum: 10c0/763dcee2de8ff60ae7e13a4bad8306205a2fbe108e555686344ddd9ef211b8bebfe459d3a739669257014c59e7cc1e7a44003c21af805c1214673e6a45f06c51 - languageName: node - linkType: hard - -"get-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "get-stream@npm:3.0.0" - checksum: 10c0/003f5f3b8870da59c6aafdf6ed7e7b07b48c2f8629cd461bd3900726548b6b8cfa2e14d6b7814fbb08f07a42f4f738407fa70b989928b2783a76b278505bba22 - languageName: node - linkType: hard - -"glob-to-regexp@npm:^0.4.1": - version: 0.4.1 - resolution: "glob-to-regexp@npm:0.4.1" - checksum: 10c0/0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 - languageName: node - linkType: hard - -"glob@npm:^13.0.0": - version: 13.0.6 - resolution: "glob@npm:13.0.6" - dependencies: - minimatch: "npm:^10.2.2" - minipass: "npm:^7.1.3" - path-scurry: "npm:^2.0.2" - checksum: 10c0/269c236f11a9b50357fe7a8c6aadac667e01deb5242b19c84975628f05f4438d8ee1354bb62c5d6c10f37fd59911b54d7799730633a2786660d8c69f1d18120a - languageName: node - linkType: hard - -"glob@npm:^7.1.2, glob@npm:^7.1.3": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.1.1" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe - languageName: node - linkType: hard - -"globals@npm:^9.18.0": - version: 9.18.0 - resolution: "globals@npm:9.18.0" - checksum: 10c0/5ab74cb67cf060a9fceede4a0f2babc4c2c0b90dbb13847d2659defdf2121c60035ef23823c8417ce8c11bdaa7b412396077f2b3d2a7dedab490a881a0a96754 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2": - version: 4.2.10 - resolution: "graceful-fs@npm:4.2.10" - checksum: 10c0/4223a833e38e1d0d2aea630c2433cfb94ddc07dfc11d511dbd6be1d16688c5be848acc31f9a5d0d0ddbfb56d2ee5a6ae0278aceeb0ca6a13f27e06b9956fb952 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 - languageName: node - linkType: hard - -"has-ansi@npm:^2.0.0": - version: 2.0.0 - resolution: "has-ansi@npm:2.0.0" - dependencies: - ansi-regex: "npm:^2.0.0" - checksum: 10c0/f54e4887b9f8f3c4bfefd649c48825b3c093987c92c27880ee9898539e6f01aed261e82e73153c3f920fde0db5bf6ebd58deb498ed1debabcb4bc40113ccdf05 - languageName: node - linkType: hard - -"has-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-flag@npm:1.0.0" - checksum: 10c0/d0ad4bebbbc005edccfa1e2c0600c89375be5663d23f49a129e0f817187405748b0b515abfc5b3c209c92692e39bb0481c83c0ee4df69433d6ffd0242183100b - languageName: node - linkType: hard - -"has-flag@npm:^2.0.0": - version: 2.0.0 - resolution: "has-flag@npm:2.0.0" - checksum: 10c0/5e1f136c7f801c2719048bedfabcf834a1ed46276cd4c98c6fcddb89a482f5d6a16df0771a38805cfc2d9010b4de157909e1a71b708e1d339b6e311041bde9b4 - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 - languageName: node - linkType: hard - -"has@npm:^1.0.1, has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" - dependencies: - function-bind: "npm:^1.1.1" - checksum: 10c0/e1da0d2bd109f116b632f27782cf23182b42f14972ca9540e4c5aa7e52647407a0a4a76937334fddcb56befe94a3494825ec22b19b51f5e5507c3153fd1a5e1b - languageName: node - linkType: hard - -"hash-base@npm:^3.0.0": - version: 3.1.0 - resolution: "hash-base@npm:3.1.0" - dependencies: - inherits: "npm:^2.0.4" - readable-stream: "npm:^3.6.0" - safe-buffer: "npm:^5.2.0" - checksum: 10c0/663eabcf4173326fbb65a1918a509045590a26cc7e0964b754eef248d281305c6ec9f6b31cb508d02ffca383ab50028180ce5aefe013e942b44a903ac8dc80d0 - languageName: node - linkType: hard - -"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": - version: 1.1.7 - resolution: "hash.js@npm:1.1.7" - dependencies: - inherits: "npm:^2.0.3" - minimalistic-assert: "npm:^1.0.1" - checksum: 10c0/41ada59494eac5332cfc1ce6b7ebdd7b88a3864a6d6b08a3ea8ef261332ed60f37f10877e0c825aaa4bddebf164fbffa618286aeeec5296675e2671cbfa746c4 - languageName: node - linkType: hard - -"hmac-drbg@npm:^1.0.1": - version: 1.0.1 - resolution: "hmac-drbg@npm:1.0.1" - dependencies: - hash.js: "npm:^1.0.3" - minimalistic-assert: "npm:^1.0.0" - minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 10c0/f3d9ba31b40257a573f162176ac5930109816036c59a09f901eb2ffd7e5e705c6832bedfff507957125f2086a0ab8f853c0df225642a88bf1fcaea945f20600d - languageName: node - linkType: hard - -"home-or-tmp@npm:^2.0.0": - version: 2.0.0 - resolution: "home-or-tmp@npm:2.0.0" - dependencies: - os-homedir: "npm:^1.0.0" - os-tmpdir: "npm:^1.0.1" - checksum: 10c0/a0e0d26db09dc0b3245f52a9159d3e970e628ddc22d69842e8413ea42f81d5a29c3808f9b08ea4d48db084e4e693193cc238c114775aa92d753bf95a9daa10fb - languageName: node - linkType: hard - -"hosted-git-info@npm:^2.1.4": - version: 2.8.9 - resolution: "hosted-git-info@npm:2.8.9" - checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 - languageName: node - linkType: hard - -"html-comment-regex@npm:^1.1.0": - version: 1.1.2 - resolution: "html-comment-regex@npm:1.1.2" - checksum: 10c0/c6fe47e7efbb2e853217854cdf352e53a6d414f87a6029456010250179f9ac2c77ef657dd4e26f4d3930f8def0e2fad015c233a3181a195a59fb4eeda6d333f9 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.2.0 - resolution: "http-cache-semantics@npm:4.2.0" - checksum: 10c0/45b66a945cf13ec2d1f29432277201313babf4a01d9e52f44b31ca923434083afeca03f18417f599c9ab3d0e7b618ceb21257542338b57c54b710463b4a53e37 - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: "npm:^7.1.0" - debug: "npm:^4.3.4" - checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 - languageName: node - linkType: hard - -"https-browserify@npm:^1.0.0": - version: 1.0.0 - resolution: "https-browserify@npm:1.0.0" - checksum: 10c0/e17b6943bc24ea9b9a7da5714645d808670af75a425f29baffc3284962626efdc1eb3aa9bbffaa6e64028a6ad98af5b09fabcb454a8f918fb686abfdc9e9b8ae - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.1": - version: 7.0.6 - resolution: "https-proxy-agent@npm:7.0.6" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:4" - checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.3": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.7.2": - version: 0.7.2 - resolution: "iconv-lite@npm:0.7.2" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/3c228920f3bd307f56bf8363706a776f4a060eb042f131cd23855ceca962951b264d0997ab38a1ad340e1c5df8499ed26e1f4f0db6b2a2ad9befaff22f14b722 - languageName: node - linkType: hard - -"icss-replace-symbols@npm:^1.1.0": - version: 1.1.0 - resolution: "icss-replace-symbols@npm:1.1.0" - checksum: 10c0/aaa5b67f82781fccc77bf6df14eaa9177ce3944462ef82b2b9e3b9f17d8fcd90f8851ffd5e6e249ebc5c464bfda07c2eccce2d122274c51c9d5b359b087f7049 - languageName: node - linkType: hard - -"icss-utils@npm:^2.1.0": - version: 2.1.0 - resolution: "icss-utils@npm:2.1.0" - dependencies: - postcss: "npm:^6.0.1" - checksum: 10c0/69d3b8fdea58fbf5c26d8dc2d1b7d8ded34fd8fb0800ed60b390e0ae5f596e77b155c587fb62e7642d1064d2d72fc672676df58ef935eba7303d79467e43edbf - languageName: node - linkType: hard - -"ieee754@npm:^1.1.4": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb - languageName: node - linkType: hard - -"iferr@npm:^0.1.5": - version: 0.1.5 - resolution: "iferr@npm:0.1.5" - checksum: 10c0/e0669b1757d0501b43a158321945d1cc1fe56f28a972df2f88a5818f05c8853c7669ba5d6cfbbf9a1a312850699de6e528626df108d559005df7e15d16ee334c - languageName: node - linkType: hard - -"image-size@npm:~0.5.0": - version: 0.5.5 - resolution: "image-size@npm:0.5.5" - bin: - image-size: bin/image-size.js - checksum: 10c0/655204163af06732f483a9fe7cce9dff4a29b7b2e88f5c957a5852e8143fa750f5e54b1955a2ca83de99c5220dbd680002d0d4e09140b01433520f4d5a0b1f4c - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 - languageName: node - linkType: hard - -"indexes-of@npm:^1.0.1": - version: 1.0.1 - resolution: "indexes-of@npm:1.0.1" - checksum: 10c0/1ea1d2d00173fa38f728acfa00303657e1115361481e52f6cbae47c5d603219006c9357abf6bc323f1fb0fbe937e363bbb19e5c66c12578eea6ec6b7e892bdba - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: "npm:^1.3.0" - wrappy: "npm:1" - checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 - languageName: node - linkType: hard - -"inherits@npm:2.0.1": - version: 2.0.1 - resolution: "inherits@npm:2.0.1" - checksum: 10c0/bfc7b37c21a2cddb272adc65b053b1716612d408bb2c9a4e5c32679dc2b08032aadd67880c405be3dff060a62e45b353fc3d9fa79a3067ad7a3deb6a283cc5c6 - languageName: node - linkType: hard - -"inherits@npm:2.0.3": - version: 2.0.3 - resolution: "inherits@npm:2.0.3" - checksum: 10c0/6e56402373149ea076a434072671f9982f5fad030c7662be0332122fe6c0fa490acb3cc1010d90b6eff8d640b1167d77674add52dfd1bb85d545cf29e80e73e7 - languageName: node - linkType: hard - -"interpret@npm:^1.0.0": - version: 1.4.0 - resolution: "interpret@npm:1.4.0" - checksum: 10c0/08c5ad30032edeec638485bc3f6db7d0094d9b3e85e0f950866600af3c52e9fd69715416d29564731c479d9f4d43ff3e4d302a178196bdc0e6837ec147640450 - languageName: node - linkType: hard - -"invariant@npm:^2.2.2": - version: 2.2.4 - resolution: "invariant@npm:2.2.4" - dependencies: - loose-envify: "npm:^1.0.0" - checksum: 10c0/5af133a917c0bcf65e84e7f23e779e7abc1cd49cb7fdc62d00d1de74b0d8c1b5ee74ac7766099fb3be1b05b26dfc67bab76a17030d2fe7ea2eef867434362dfc - languageName: node - linkType: hard - -"invert-kv@npm:^1.0.0": - version: 1.0.0 - resolution: "invert-kv@npm:1.0.0" - checksum: 10c0/9ccef12ada8494c56175cc0380b4cea18b6c0a368436f324a30e43a332db90bdfb83cd3a7987b71df359cdf931ce45b7daf35b677da56658565d61068e4bc20b - languageName: node - linkType: hard - -"ip-address@npm:^10.0.1": - version: 10.1.0 - resolution: "ip-address@npm:10.1.0" - checksum: 10c0/0103516cfa93f6433b3bd7333fa876eb21263912329bfa47010af5e16934eeeff86f3d2ae700a3744a137839ddfad62b900c7a445607884a49b5d1e32a3d7566 - languageName: node - linkType: hard - -"is-absolute-url@npm:^2.0.0": - version: 2.1.0 - resolution: "is-absolute-url@npm:2.1.0" - checksum: 10c0/2c324c3118752d82c18afadffbea14d35224e76f37a2ee80e05b209386c46d19bef77b58ede41f7b3be552cde16c6cdb0d884807175a6eb40e8c61281dc67c2f - languageName: node - linkType: hard - -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 - languageName: node - linkType: hard - -"is-buffer@npm:~1.1.6": - version: 1.1.6 - resolution: "is-buffer@npm:1.1.6" - checksum: 10c0/ae18aa0b6e113d6c490ad1db5e8df9bdb57758382b313f5a22c9c61084875c6396d50bbf49315f5b1926d142d74dfb8d31b40d993a383e0a158b15fea7a82234 - languageName: node - linkType: hard - -"is-core-module@npm:^2.9.0": - version: 2.9.0 - resolution: "is-core-module@npm:2.9.0" - dependencies: - has: "npm:^1.0.3" - checksum: 10c0/056fe4c5f9f383dc1c1b0dc3250c300880b9b1e17e1885077d64a1667926ecc11ba696776597616bfd2fd7f87c7476c01b127a0c842b4821bee2414d0e296e6e - languageName: node - linkType: hard - -"is-finite@npm:^1.0.0": - version: 1.1.0 - resolution: "is-finite@npm:1.1.0" - checksum: 10c0/ca6bc7a0321b339f098e657bd4cbf4bb2410f5a11f1b9adb1a1a9ab72288b64368e8251326cb1f74e985f2779299cec3e1f1e558b68ce7e1e2c9be17b7cfd626 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^1.0.0": - version: 1.0.0 - resolution: "is-fullwidth-code-point@npm:1.0.0" - dependencies: - number-is-nan: "npm:^1.0.0" - checksum: 10c0/12acfcf16142f2d431bf6af25d68569d3198e81b9799b4ae41058247aafcc666b0127d64384ea28e67a746372611fcbe9b802f69175287aba466da3eddd5ba0f - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^2.0.0": - version: 2.0.0 - resolution: "is-fullwidth-code-point@npm:2.0.0" - checksum: 10c0/e58f3e4a601fc0500d8b2677e26e9fe0cd450980e66adb29d85b6addf7969731e38f8e43ed2ec868a09c101a55ac3d8b78902209269f38c5286bc98f5bc1b4d9 - languageName: node - linkType: hard - -"is-plain-obj@npm:^1.0.0": - version: 1.1.0 - resolution: "is-plain-obj@npm:1.1.0" - checksum: 10c0/daaee1805add26f781b413fdf192fc91d52409583be30ace35c82607d440da63cc4cac0ac55136716688d6c0a2c6ef3edb2254fecbd1fe06056d6bd15975ee8c - languageName: node - linkType: hard - -"is-stream@npm:^1.1.0": - version: 1.1.0 - resolution: "is-stream@npm:1.1.0" - checksum: 10c0/b8ae7971e78d2e8488d15f804229c6eed7ed36a28f8807a1815938771f4adff0e705218b7dab968270433f67103e4fef98062a0beea55d64835f705ee72c7002 - languageName: node - linkType: hard - -"is-svg@npm:^2.0.0": - version: 2.1.0 - resolution: "is-svg@npm:2.1.0" - dependencies: - html-comment-regex: "npm:^1.1.0" - checksum: 10c0/b2709e619c6159dabd27731c7ff69b73319bc8694b1dd27dc886026a6e1f895f04c1cc9903ca90310d3766a5f2d01a959735ae9a69be71f3cc9545f8206e1bb9 - languageName: node - linkType: hard - -"is-what@npm:^3.14.1": - version: 3.14.1 - resolution: "is-what@npm:3.14.1" - checksum: 10c0/4b770b85454c877b6929a84fd47c318e1f8c2ff70fd72fd625bc3fde8e0c18a6e57345b6e7aa1ee9fbd1c608d27cfe885df473036c5c2e40cd2187250804a2c7 - languageName: node - linkType: hard - -"isarray@npm:0.0.1": - version: 0.0.1 - resolution: "isarray@npm:0.0.1" - checksum: 10c0/ed1e62da617f71fe348907c71743b5ed550448b455f8d269f89a7c7ddb8ae6e962de3dab6a74a237b06f5eb7f6ece7a45ada8ce96d87fe972926530f91ae3311 - languageName: node - linkType: hard - -"isarray@npm:^1.0.0, isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d - languageName: node - linkType: hard - -"isexe@npm:^4.0.0": - version: 4.0.0 - resolution: "isexe@npm:4.0.0" - checksum: 10c0/5884815115bceac452877659a9c7726382531592f43dc29e5d48b7c4100661aed54018cb90bd36cb2eaeba521092570769167acbb95c18d39afdccbcca06c5ce - languageName: node - linkType: hard - -"jquery-datetimepicker@npm:^2.5.21": - version: 2.5.21 - resolution: "jquery-datetimepicker@npm:2.5.21" - dependencies: - jquery: "npm:>= 1.7.2" - jquery-mousewheel: "npm:>= 3.1.13" - php-date-formatter: "npm:^1.3.4" - checksum: 10c0/e8d91b51cbf41379d4d357d697a7a613427703f4a42f6dc8aed3f9f932431f02a8ebda14327c80b2db00b69fa172070e6daa5c0e97b199f922c28172ce3ec56f - languageName: node - linkType: hard - -"jquery-mousewheel@npm:>= 3.1.13": - version: 3.1.13 - resolution: "jquery-mousewheel@npm:3.1.13" - checksum: 10c0/acd57dfe7d2268ddddb906cfca6316fb364aeb74dc4d15379baa60c88b5fd3cc0aa7830e09cb6e702a4de9306e467519f147396e49f2f9c9f2c7118537721fab - languageName: node - linkType: hard - -"jquery@npm:>= 1.7.2, jquery@npm:>=1.10": - version: 3.6.0 - resolution: "jquery@npm:3.6.0" - checksum: 10c0/45a63f8376a8918087c0277b2394dd382fcacff765c41ccbb5009a9336f8c971bf41c6a0519062edc1dff6333d96959c3a3ec55c95eb6c94d5372253d6cbf82f - languageName: node - linkType: hard - -"js-base64@npm:^2.1.9": - version: 2.6.4 - resolution: "js-base64@npm:2.6.4" - checksum: 10c0/95d93c4eca0bbe0f2d5ffe8682d9acd23051e5c0ad71873ff5a48dd46a5f19025de9f7b36e63fa3f02f342ae4a8ca4c56e7b590d7300ebb6639ce09675e0fd02 - languageName: node - linkType: hard - -"js-tokens@npm:^3.0.0 || ^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed - languageName: node - linkType: hard - -"js-tokens@npm:^3.0.2": - version: 3.0.2 - resolution: "js-tokens@npm:3.0.2" - checksum: 10c0/e3c3ee4d12643d90197628eb022a2884a15f08ea7dcac1ce97fdeee43031fbfc7ede674f2cdbbb582dcd4c94388b22e52d56c6cbeb2ac7d1b57c2f33c405e2ba - languageName: node - linkType: hard - -"js-yaml@npm:~3.7.0": - version: 3.7.0 - resolution: "js-yaml@npm:3.7.0" - dependencies: - argparse: "npm:^1.0.7" - esprima: "npm:^2.6.0" - bin: - js-yaml: bin/js-yaml.js - checksum: 10c0/e236852d4439c7750c810f217ca80631844cfb0e4ab4993349c3e612ee273256d9895e1bb06b3990a3cc42fa1105ffcaa55a6b711f25901c0d803287bdcf52e1 - languageName: node - linkType: hard - -"jsesc@npm:^1.3.0": - version: 1.3.0 - resolution: "jsesc@npm:1.3.0" - bin: - jsesc: bin/jsesc - checksum: 10c0/62420889dd46b4cdba4df20fe6ffdefa6eeab7532fb4079170ea1b53c45d5a6abcb485144905833e5a69cc1735db12319b1e0b0f9a556811ec926b57a22318a7 - languageName: node - linkType: hard - -"json-loader@npm:^0.5.1, json-loader@npm:^0.5.4": - version: 0.5.7 - resolution: "json-loader@npm:0.5.7" - checksum: 10c0/b155b81f644693b5418e595c127c552c34373f749d2d125df24cfe753de6b3b0af88dda5d58e7b65940ed03ec46c19fc3d09f53b932b45c9ae3ca1fb55e44a15 - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce - languageName: node - linkType: hard - -"json3@npm:^3.3.2": - version: 3.3.3 - resolution: "json3@npm:3.3.3" - checksum: 10c0/ca6942dbcef852c8fda5a87261b82dfa9135b43777cd05bdfc08d071592bd328e289c78eb15d0c45884d9cfe71a2a20601aaa9be16e98d488b5a2f51ee91f259 - languageName: node - linkType: hard - -"json5@npm:^0.5.0, json5@npm:^0.5.1": - version: 0.5.1 - resolution: "json5@npm:0.5.1" - bin: - json5: lib/cli.js - checksum: 10c0/aca0ab7ccf1883d3fc2ecc16219bc389716a773f774552817deaadb549acc0bb502e317a81946fc0a48f9eb6e0822cf1dc5a097009203f2c94de84c8db02a1f3 - languageName: node - linkType: hard - -"json5@npm:^1.0.1": - version: 1.0.1 - resolution: "json5@npm:1.0.1" - dependencies: - minimist: "npm:^1.2.0" - bin: - json5: lib/cli.js - checksum: 10c0/7f75dd797151680a4e14c4224c1343b32a43272aa6e6333ddec2b0822df4ea116971689b251879a1248592da24f7929902c13f83d7390c3f3d44f18e8e9719f5 - languageName: node - linkType: hard - -"keen-js@npm:^3.0.0": - version: 3.5.0 - resolution: "keen-js@npm:3.5.0" - dependencies: - JSON2: "npm:^0.1.0" - browserify-versionify: "npm:1.0.3" - component-emitter: "npm:^1.1.3" - domready: "npm:0.3.0" - json3: "npm:^3.3.2" - spin.js: "npm:^2.0.1" - superagent: "npm:^1.8.3" - checksum: 10c0/ebaf9e5f04e61fe15bf69c7fe50c231431784bae28c9b215a4dab8b173a6e73dec5cd56c4d27b561591997b532758047614af1ab8ef37f42dbfeb0dde477673d - languageName: node - linkType: hard - -"klona@npm:^2.0.4": - version: 2.0.5 - resolution: "klona@npm:2.0.5" - checksum: 10c0/5b752c11ca8e2996612386699f52cc5aed802aa4116663d26239ac0b054fae25191dacb95587ecf1a167b039daa9fc3fa2da17dfd5d0821f3037de3821d9a9e5 - languageName: node - linkType: hard - -"knockout@npm:3.5.1": - version: 3.5.1 - resolution: "knockout@npm:3.5.1" - checksum: 10c0/cf091711cbdcbccab12ab814b3a2f44f7b6cc00e30b08045ba514a78c369066fa7b979e07b4caad20eea3457e3b589ff86779cb214bafbc9943ff36240eb5c00 - languageName: node - linkType: hard - -"lcid@npm:^1.0.0": - version: 1.0.0 - resolution: "lcid@npm:1.0.0" - dependencies: - invert-kv: "npm:^1.0.0" - checksum: 10c0/87fb32196c3c80458778f34f71c042e114f3134a3c86c0d60ee9c94f0750e467d7ca0c005a5224ffd9d49a6e449b5e5c31e1544f1827765a0ba8747298f5980e - languageName: node - linkType: hard - -"less-loader@npm:^10.2.0": - version: 10.2.0 - resolution: "less-loader@npm:10.2.0" - dependencies: - klona: "npm:^2.0.4" - peerDependencies: - less: ^3.5.0 || ^4.0.0 - webpack: ^5.0.0 - checksum: 10c0/214f190c7139a6a005f8f505d7f05e929361b1a16eaae427be8809f722ef798d1cb6525114d9e03ab87b6fa5e3fbe2d849494016df971cb29b9c10fd9f1a5a66 - languageName: node - linkType: hard - -"less-loader@npm:~2.2.3": - version: 2.2.3 - resolution: "less-loader@npm:2.2.3" - dependencies: - loader-utils: "npm:^0.2.5" - peerDependencies: - less: ^2.3.1 - checksum: 10c0/fe0b5b5965023869b7a734d4fa5fc6a883436db36f2a7b723d55a5fd1bdd7bbdc69c1a249365693baa3e7592b311b6da0a7d8ec2ffae5a236a710b4ca3b7b277 - languageName: node - linkType: hard - -"less@npm:^4.1.2": - version: 4.1.3 - resolution: "less@npm:4.1.3" - dependencies: - copy-anything: "npm:^2.0.1" - errno: "npm:^0.1.1" - graceful-fs: "npm:^4.1.2" - image-size: "npm:~0.5.0" - make-dir: "npm:^2.1.0" - mime: "npm:^1.4.1" - needle: "npm:^3.1.0" - parse-node-version: "npm:^1.0.1" - source-map: "npm:~0.6.0" - tslib: "npm:^2.3.0" - dependenciesMeta: - errno: - optional: true - graceful-fs: - optional: true - image-size: - optional: true - make-dir: - optional: true - mime: - optional: true - needle: - optional: true - source-map: - optional: true - bin: - lessc: bin/lessc - checksum: 10c0/d67ca673a2c409a3069bb088c21976fa6a22eaf4428a23f486afa3ca57c2c004f424e7466dfc8d38a4dca25bc7b75943de5e3394d3a7841d8812cec696790e22 - languageName: node - linkType: hard - -"load-json-file@npm:^2.0.0": - version: 2.0.0 - resolution: "load-json-file@npm:2.0.0" - dependencies: - graceful-fs: "npm:^4.1.2" - parse-json: "npm:^2.2.0" - pify: "npm:^2.0.0" - strip-bom: "npm:^3.0.0" - checksum: 10c0/15cf1259361325fadfc54cd4ecc5d6729103c8873492001ba5473fb1ef753000f680c887db6c86fec69a4ede009efeb8c0c0c77b2a31bc54d2793767e25577c9 - languageName: node - linkType: hard - -"loader-runner@npm:^2.3.0": - version: 2.4.0 - resolution: "loader-runner@npm:2.4.0" - checksum: 10c0/1f723bd8318453c2d073d7befbf891ba6d2a02f22622688bf7d22e7ba527a0f9476c7fdfedc6bfa2b55c0389d9f406f3a5239ed1b33c9088d77cfed085086a1e - languageName: node - linkType: hard - -"loader-utils@npm:^0.2.16, loader-utils@npm:^0.2.5": - version: 0.2.17 - resolution: "loader-utils@npm:0.2.17" - dependencies: - big.js: "npm:^3.1.3" - emojis-list: "npm:^2.0.0" - json5: "npm:^0.5.0" - object-assign: "npm:^4.0.1" - checksum: 10c0/d6b65a0d460d2c8621f72e0471127895f4a25ea3a5d2caabf0710c8e58a904af5876834c6ad89d2fbab35e74c6e7f2f4f8137559e6e4e84b74957f4592bcab0b - languageName: node - linkType: hard - -"loader-utils@npm:^1.0.2, loader-utils@npm:^1.1.0": - version: 1.4.0 - resolution: "loader-utils@npm:1.4.0" - dependencies: - big.js: "npm:^5.2.2" - emojis-list: "npm:^3.0.0" - json5: "npm:^1.0.1" - checksum: 10c0/b3f383612c23c0adf535d61709fb3eaf864afa54dae45608e3831156b89b4b05a0a4ddc6db7d742071babe872750ba3f4f9ce89326d94f6e096dbed978fa424e - languageName: node - linkType: hard - -"locate-path@npm:^2.0.0": - version: 2.0.0 - resolution: "locate-path@npm:2.0.0" - dependencies: - p-locate: "npm:^2.0.0" - path-exists: "npm:^3.0.0" - checksum: 10c0/24efa0e589be6aa3c469b502f795126b26ab97afa378846cb508174211515633b770aa0ba610cab113caedab8d2a4902b061a08aaed5297c12ab6f5be4df0133 - languageName: node - linkType: hard - -"lodash.camelcase@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.camelcase@npm:4.3.0" - checksum: 10c0/fcba15d21a458076dd309fce6b1b4bf611d84a0ec252cb92447c948c533ac250b95d2e00955801ebc367e5af5ed288b996d75d37d2035260a937008e14eaf432 - languageName: node - linkType: hard - -"lodash.memoize@npm:^4.1.2": - version: 4.1.2 - resolution: "lodash.memoize@npm:4.1.2" - checksum: 10c0/c8713e51eccc650422716a14cece1809cfe34bc5ab5e242b7f8b4e2241c2483697b971a604252807689b9dd69bfe3a98852e19a5b89d506b000b4187a1285df8 - languageName: node - linkType: hard - -"lodash.uniq@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.uniq@npm:4.5.0" - checksum: 10c0/262d400bb0952f112162a320cc4a75dea4f66078b9e7e3075ffbc9c6aa30b3e9df3cf20e7da7d566105e1ccf7804e4fbd7d804eee0b53de05d83f16ffbf41c5e - languageName: node - linkType: hard - -"lodash@npm:^4.17.14, lodash@npm:^4.17.4": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c - languageName: node - linkType: hard - -"loose-envify@npm:^1.0.0": - version: 1.4.0 - resolution: "loose-envify@npm:1.4.0" - dependencies: - js-tokens: "npm:^3.0.0 || ^4.0.0" - bin: - loose-envify: cli.js - checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e - languageName: node - linkType: hard - -"lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1": - version: 11.2.7 - resolution: "lru-cache@npm:11.2.7" - checksum: 10c0/549cdb59488baa617135fc12159cafb1a97f91079f35093bb3bcad72e849fc64ace636d244212c181dfdf1a99bbfa90757ff303f98561958ee4d0f885d9bd5f7 - languageName: node - linkType: hard - -"lru-cache@npm:^4.0.1, lru-cache@npm:^4.1.1": - version: 4.1.5 - resolution: "lru-cache@npm:4.1.5" - dependencies: - pseudomap: "npm:^1.0.2" - yallist: "npm:^2.1.2" - checksum: 10c0/1ca5306814e5add9ec63556d6fd9b24a4ecdeaef8e9cea52cbf30301e6b88c8d8ddc7cab45b59b56eb763e6c45af911585dc89925a074ab65e1502e3fe8103cf - languageName: node - linkType: hard - -"make-dir@npm:^1.0.0": - version: 1.3.0 - resolution: "make-dir@npm:1.3.0" - dependencies: - pify: "npm:^3.0.0" - checksum: 10c0/5eb94f47d7ef41d89d1b8eef6539b8950d5bd99eeba093a942bfd327faa37d2d62227526b88b73633243a2ec7972d21eb0f4e5d62ae4e02a79e389f4a7bb3022 - languageName: node - linkType: hard - -"make-dir@npm:^2.1.0": - version: 2.1.0 - resolution: "make-dir@npm:2.1.0" - dependencies: - pify: "npm:^4.0.1" - semver: "npm:^5.6.0" - checksum: 10c0/ada869944d866229819735bee5548944caef560d7a8536ecbc6536edca28c72add47cc4f6fc39c54fb25d06b58da1f8994cf7d9df7dadea047064749efc085d8 - languageName: node - linkType: hard - -"make-fetch-happen@npm:^15.0.0": - version: 15.0.5 - resolution: "make-fetch-happen@npm:15.0.5" - dependencies: - "@gar/promise-retry": "npm:^1.0.0" - "@npmcli/agent": "npm:^4.0.0" - "@npmcli/redact": "npm:^4.0.0" - cacache: "npm:^20.0.1" - http-cache-semantics: "npm:^4.1.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^5.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^1.0.0" - proc-log: "npm:^6.0.0" - ssri: "npm:^13.0.0" - checksum: 10c0/527580eb5e5476e6ad07a4e3bd017d13e935f4be815674b442081ae5a721c13d3af5715006619e6be79a85723067e047f83a0c9e699f41d8cec43609a8de4f7b - languageName: node - linkType: hard - -"math-expression-evaluator@npm:^1.2.14": - version: 1.3.14 - resolution: "math-expression-evaluator@npm:1.3.14" - checksum: 10c0/a98dcb54510f57d9d78c66f73c6ee5e8e3a69d7dcfd3f0e611bc6957a764f23fed3b342888fca79ed49b865b09338581d19bb3acc4d788ee308618c7c7cdca10 - languageName: node - linkType: hard - -"md5.js@npm:^1.3.4": - version: 1.3.5 - resolution: "md5.js@npm:1.3.5" - dependencies: - hash-base: "npm:^3.0.0" - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.1.2" - checksum: 10c0/b7bd75077f419c8e013fc4d4dada48be71882e37d69a44af65a2f2804b91e253441eb43a0614423a1c91bb830b8140b0dc906bc797245e2e275759584f4efcc5 - languageName: node - linkType: hard - -"md5@npm:^2.2.1": - version: 2.3.0 - resolution: "md5@npm:2.3.0" - dependencies: - charenc: "npm:0.0.2" - crypt: "npm:0.0.2" - is-buffer: "npm:~1.1.6" - checksum: 10c0/14a21d597d92e5b738255fbe7fe379905b8cb97e0a49d44a20b58526a646ec5518c337b817ce0094ca94d3e81a3313879c4c7b510d250c282d53afbbdede9110 - languageName: node - linkType: hard - -"mem@npm:^1.1.0": - version: 1.1.0 - resolution: "mem@npm:1.1.0" - dependencies: - mimic-fn: "npm:^1.0.0" - checksum: 10c0/f5150bb975a7d641375d3c1962426bf338952142a429ce01e9792b03df9b63d5911d3feb7e5e50f406531ace646f3fbe39b7dc716c729d617a28b3bbdc799649 - languageName: node - linkType: hard - -"memory-fs@npm:^0.4.0, memory-fs@npm:~0.4.1": - version: 0.4.1 - resolution: "memory-fs@npm:0.4.1" - dependencies: - errno: "npm:^0.1.3" - readable-stream: "npm:^2.0.1" - checksum: 10c0/f114c44ad8285103cb0e71420cf5bb628d3eb6cbd918197f5951590ff56ba2072f4a97924949c170320cdf180d2da4e8d16a0edd92ba0ca2d2de51dc932841e2 - languageName: node - linkType: hard - -"methods@npm:~1.1.1": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 - languageName: node - linkType: hard - -"miller-rabin@npm:^4.0.0": - version: 4.0.1 - resolution: "miller-rabin@npm:4.0.1" - dependencies: - bn.js: "npm:^4.0.0" - brorand: "npm:^1.0.1" - bin: - miller-rabin: bin/miller-rabin - checksum: 10c0/26b2b96f6e49dbcff7faebb78708ed2f5f9ae27ac8cbbf1d7c08f83cf39bed3d418c0c11034dce997da70d135cc0ff6f3a4c15dc452f8e114c11986388a64346 - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa - languageName: node - linkType: hard - -"mime-types@npm:^2.1.3": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: "npm:1.52.0" - checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 - languageName: node - linkType: hard - -"mime@npm:1.3.4": - version: 1.3.4 - resolution: "mime@npm:1.3.4" - bin: - mime: cli.js - checksum: 10c0/06ca13fe3be58eedfadc4351ca735c19ad25f2f8f0ecc746c1b2e780934829cc0e4b303269f0abfc919ecb6f149f1b648700f996d2b7935fb23208f7357438d4 - languageName: node - linkType: hard - -"mime@npm:^1.4.1": - version: 1.6.0 - resolution: "mime@npm:1.6.0" - bin: - mime: cli.js - checksum: 10c0/b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 - languageName: node - linkType: hard - -"mimic-fn@npm:^1.0.0": - version: 1.2.0 - resolution: "mimic-fn@npm:1.2.0" - checksum: 10c0/ad55214aec6094c0af4c0beec1a13787556f8116ed88807cf3f05828500f21f93a9482326bcd5a077ae91e3e8795b4e76b5b4c8bb12237ff0e4043a365516cba - languageName: node - linkType: hard - -"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-assert@npm:1.0.1" - checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd - languageName: node - linkType: hard - -"minimalistic-crypto-utils@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-crypto-utils@npm:1.0.1" - checksum: 10c0/790ecec8c5c73973a4fbf2c663d911033e8494d5fb0960a4500634766ab05d6107d20af896ca2132e7031741f19888154d44b2408ada0852446705441383e9f8 - languageName: node - linkType: hard - -"minimatch@npm:^10.2.2": - version: 10.2.4 - resolution: "minimatch@npm:10.2.4" - dependencies: - brace-expansion: "npm:^5.0.2" - checksum: 10c0/35f3dfb7b99b51efd46afd378486889f590e7efb10e0f6a10ba6800428cf65c9a8dedb74427d0570b318d749b543dc4e85f06d46d2858bc8cac7e1eb49a95945 - languageName: node - linkType: hard - -"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 - languageName: node - linkType: hard - -"minimist@npm:^1.2.0, minimist@npm:^1.2.6": - version: 1.2.6 - resolution: "minimist@npm:1.2.6" - checksum: 10c0/d0b566204044481c4401abbd24cc75814e753b37268e7fe7ccc78612bf3e37bf1e45a6c43fb0b119445ea1c413c000bde013f320b7211974f2f49bcbec1d0dbf - languageName: node - linkType: hard - -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e - languageName: node - linkType: hard - -"minipass-fetch@npm:^5.0.0": - version: 5.0.2 - resolution: "minipass-fetch@npm:5.0.2" - dependencies: - iconv-lite: "npm:^0.7.2" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^2.0.0" - minizlib: "npm:^3.0.1" - dependenciesMeta: - iconv-lite: - optional: true - checksum: 10c0/ce4ab9f21cfabaead2097d95dd33f485af8072fbc6b19611bce694965393453a1639d641c2bcf1c48f2ea7d41ea7fab8278373f1d0bee4e63b0a5b2cdd0ef649 - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 - languageName: node - linkType: hard - -"minipass-sized@npm:^2.0.0": - version: 2.0.0 - resolution: "minipass-sized@npm:2.0.0" - dependencies: - minipass: "npm:^7.1.2" - checksum: 10c0/f9201696a6f6d68610d04c9c83e3d2e5cb9c026aae1c8cbf7e17f386105cb79c1bb088dbc21bf0b1eb4f3fb5df384fd1e7aa3bf1f33868c416ae8c8a92679db8 - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c - languageName: node - linkType: hard - -"minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2, minipass@npm:^7.1.3": - version: 7.1.3 - resolution: "minipass@npm:7.1.3" - checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb - languageName: node - linkType: hard - -"minizlib@npm:^3.0.1, minizlib@npm:^3.1.0": - version: 3.1.0 - resolution: "minizlib@npm:3.1.0" - dependencies: - minipass: "npm:^7.1.2" - checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec - languageName: node - linkType: hard - -"mississippi@npm:^2.0.0": - version: 2.0.0 - resolution: "mississippi@npm:2.0.0" - dependencies: - concat-stream: "npm:^1.5.0" - duplexify: "npm:^3.4.2" - end-of-stream: "npm:^1.1.0" - flush-write-stream: "npm:^1.0.0" - from2: "npm:^2.1.0" - parallel-transform: "npm:^1.1.0" - pump: "npm:^2.0.1" - pumpify: "npm:^1.3.3" - stream-each: "npm:^1.1.0" - through2: "npm:^2.0.0" - checksum: 10c0/f84beaa40491c2466c4a3d15025ceb1ecc822a8e5ef4f6e5622aeb832b32e4eda056c3982337ae2c1e4b3b77fb431af4d3874923c26dee0c026601547589b2db - languageName: node - linkType: hard - -"mkdirp@npm:^0.5.1, mkdirp@npm:~0.5.0, mkdirp@npm:~0.5.1": - version: 0.5.6 - resolution: "mkdirp@npm:0.5.6" - dependencies: - minimist: "npm:^1.2.6" - bin: - mkdirp: bin/cmd.js - checksum: 10c0/e2e2be789218807b58abced04e7b49851d9e46e88a2f9539242cc8a92c9b5c3a0b9bab360bd3014e02a140fc4fbc58e31176c408b493f8a2a6f4986bd7527b01 - languageName: node - linkType: hard - -"move-concurrently@npm:^1.0.1": - version: 1.0.1 - resolution: "move-concurrently@npm:1.0.1" - dependencies: - aproba: "npm:^1.1.1" - copy-concurrently: "npm:^1.0.0" - fs-write-stream-atomic: "npm:^1.0.8" - mkdirp: "npm:^0.5.1" - rimraf: "npm:^2.5.4" - run-queue: "npm:^1.0.3" - checksum: 10c0/0fe81acf3bbbc322013c2f4ee4a48cf8d180a7d925fb9284c0f1f444e862d7eb0421ee074b68d35357a12f0d5e94a322049dc9da480672331b5b8895743eb66a - languageName: node - linkType: hard - -"ms@npm:2.0.0": - version: 2.0.0 - resolution: "ms@npm:2.0.0" - checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d - languageName: node - linkType: hard - -"ms@npm:^2.1.1, ms@npm:^2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 - languageName: node - linkType: hard - -"needle@npm:^3.1.0": - version: 3.1.0 - resolution: "needle@npm:3.1.0" - dependencies: - debug: "npm:^3.2.6" - iconv-lite: "npm:^0.6.3" - sax: "npm:^1.2.4" - bin: - needle: bin/needle - checksum: 10c0/b55e169878b7480a8d09bcfcd5614e7b96aa2f04af7e0f86e446c022eaac35dd7aed694aa4a9e751741e574e1f648d3ff388b16c2528787fee49ed5bf02853e0 - languageName: node - linkType: hard - -"negotiator@npm:^1.0.0": - version: 1.0.0 - resolution: "negotiator@npm:1.0.0" - checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b - languageName: node - linkType: hard - -"next-tick@npm:^1.1.0": - version: 1.1.0 - resolution: "next-tick@npm:1.1.0" - checksum: 10c0/3ba80dd805fcb336b4f52e010992f3e6175869c8d88bf4ff0a81d5d66e6049f89993463b28211613e58a6b7fe93ff5ccbba0da18d4fa574b96289e8f0b577f28 - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 12.2.0 - resolution: "node-gyp@npm:12.2.0" - dependencies: - env-paths: "npm:^2.2.0" - exponential-backoff: "npm:^3.1.1" - graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^15.0.0" - nopt: "npm:^9.0.0" - proc-log: "npm:^6.0.0" - semver: "npm:^7.3.5" - tar: "npm:^7.5.4" - tinyglobby: "npm:^0.2.12" - which: "npm:^6.0.0" - bin: - node-gyp: bin/node-gyp.js - checksum: 10c0/3ed046746a5a7d90950cd8b0547332b06598443f31fe213ef4332a7174c7b7d259e1704835feda79b87d3f02e59d7791842aac60642ede4396ab25fdf0f8f759 - languageName: node - linkType: hard - -"node-libs-browser@npm:^2.0.0": - version: 2.2.1 - resolution: "node-libs-browser@npm:2.2.1" - dependencies: - assert: "npm:^1.1.1" - browserify-zlib: "npm:^0.2.0" - buffer: "npm:^4.3.0" - console-browserify: "npm:^1.1.0" - constants-browserify: "npm:^1.0.0" - crypto-browserify: "npm:^3.11.0" - domain-browser: "npm:^1.1.1" - events: "npm:^3.0.0" - https-browserify: "npm:^1.0.0" - os-browserify: "npm:^0.3.0" - path-browserify: "npm:0.0.1" - process: "npm:^0.11.10" - punycode: "npm:^1.2.4" - querystring-es3: "npm:^0.2.0" - readable-stream: "npm:^2.3.3" - stream-browserify: "npm:^2.0.1" - stream-http: "npm:^2.7.2" - string_decoder: "npm:^1.0.0" - timers-browserify: "npm:^2.0.4" - tty-browserify: "npm:0.0.0" - url: "npm:^0.11.0" - util: "npm:^0.11.0" - vm-browserify: "npm:^1.0.1" - checksum: 10c0/0e05321a6396408903ed642231d2bca7dd96492d074c7af161ba06a63c95378bd3de50b4105eccbbc02d93ba3da69f0ff5e624bc2a8c92ca462ceb6a403e7986 - languageName: node - linkType: hard - -"nopt@npm:^9.0.0": - version: 9.0.0 - resolution: "nopt@npm:9.0.0" - dependencies: - abbrev: "npm:^4.0.0" - bin: - nopt: bin/nopt.js - checksum: 10c0/1822eb6f9b020ef6f7a7516d7b64a8036e09666ea55ac40416c36e4b2b343122c3cff0e2f085675f53de1d2db99a2a89a60ccea1d120bcd6a5347bf6ceb4a7fd - languageName: node - linkType: hard - -"normalize-package-data@npm:^2.3.2": - version: 2.5.0 - resolution: "normalize-package-data@npm:2.5.0" - dependencies: - hosted-git-info: "npm:^2.1.4" - resolve: "npm:^1.10.0" - semver: "npm:2 || 3 || 4 || 5" - validate-npm-package-license: "npm:^3.0.1" - checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 - languageName: node - linkType: hard - -"normalize-range@npm:^0.1.2": - version: 0.1.2 - resolution: "normalize-range@npm:0.1.2" - checksum: 10c0/bf39b73a63e0a42ad1a48c2bd1bda5a07ede64a7e2567307a407674e595bcff0fa0d57e8e5f1e7fa5e91000797c7615e13613227aaaa4d6d6e87f5bd5cc95de6 - languageName: node - linkType: hard - -"normalize-url@npm:^1.4.0": - version: 1.9.1 - resolution: "normalize-url@npm:1.9.1" - dependencies: - object-assign: "npm:^4.0.1" - prepend-http: "npm:^1.0.0" - query-string: "npm:^4.1.0" - sort-keys: "npm:^1.0.0" - checksum: 10c0/5ecd525f743c3fb5370d2bab8e78446f3e3bd7c0c97a5fd3f0bc0c5f396fbd117d13c9118766128d25ed575755cb539dc33a38419f18ca9d8577c8d1cd7a8daf - languageName: node - linkType: hard - -"npm-run-path@npm:^2.0.0": - version: 2.0.2 - resolution: "npm-run-path@npm:2.0.2" - dependencies: - path-key: "npm:^2.0.0" - checksum: 10c0/95549a477886f48346568c97b08c4fda9cdbf7ce8a4fbc2213f36896d0d19249e32d68d7451bdcbca8041b5fba04a6b2c4a618beaf19849505c05b700740f1de - languageName: node - linkType: hard - -"num2fraction@npm:^1.2.2": - version: 1.2.2 - resolution: "num2fraction@npm:1.2.2" - checksum: 10c0/3bf17b44af00508a2b0370146629710645c3e3ff3c052893680efe3f4a6ff5c953ce9e54734013b02b35744a49352d54fbc5d8b455fac979047ef17dd8ec74bd - languageName: node - linkType: hard - -"number-is-nan@npm:^1.0.0": - version: 1.0.1 - resolution: "number-is-nan@npm:1.0.1" - checksum: 10c0/cb97149006acc5cd512c13c1838223abdf202e76ddfa059c5e8e7507aff2c3a78cd19057516885a2f6f5b576543dc4f7b6f3c997cc7df53ae26c260855466df5 - languageName: node - linkType: hard - -"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 - languageName: node - linkType: hard - -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: "npm:1" - checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 - languageName: node - linkType: hard - -"os-browserify@npm:^0.3.0": - version: 0.3.0 - resolution: "os-browserify@npm:0.3.0" - checksum: 10c0/6ff32cb1efe2bc6930ad0fd4c50e30c38010aee909eba8d65be60af55efd6cbb48f0287e3649b4e3f3a63dce5a667b23c187c4293a75e557f0d5489d735bcf52 - languageName: node - linkType: hard - -"os-homedir@npm:^1.0.0": - version: 1.0.2 - resolution: "os-homedir@npm:1.0.2" - checksum: 10c0/6be4aa67317ee247b8d46142e243fb4ef1d2d65d3067f54bfc5079257a2f4d4d76b2da78cba7af3cb3f56dbb2e4202e0c47f26171d11ca1ed4008d842c90363f - languageName: node - linkType: hard - -"os-locale@npm:^2.0.0": - version: 2.1.0 - resolution: "os-locale@npm:2.1.0" - dependencies: - execa: "npm:^0.7.0" - lcid: "npm:^1.0.0" - mem: "npm:^1.1.0" - checksum: 10c0/6f1acc060552a59f477ab541e9149a712f93a4d7b5262d070698dbe98cf047f35c7685d759a86dc56c12b76fdfbab1bf7216a74232263efbe7365de2a5d70834 - languageName: node - linkType: hard - -"os-tmpdir@npm:^1.0.1": - version: 1.0.2 - resolution: "os-tmpdir@npm:1.0.2" - checksum: 10c0/f438450224f8e2687605a8dd318f0db694b6293c5d835ae509a69e97c8de38b6994645337e5577f5001115470414638978cc49da1cdcc25106dad8738dc69990 - languageName: node - linkType: hard - -"p-finally@npm:^1.0.0": - version: 1.0.0 - resolution: "p-finally@npm:1.0.0" - checksum: 10c0/6b8552339a71fe7bd424d01d8451eea92d379a711fc62f6b2fe64cad8a472c7259a236c9a22b4733abca0b5666ad503cb497792a0478c5af31ded793d00937e7 - languageName: node - linkType: hard - -"p-limit@npm:^1.1.0": - version: 1.3.0 - resolution: "p-limit@npm:1.3.0" - dependencies: - p-try: "npm:^1.0.0" - checksum: 10c0/5c1b1d53d180b2c7501efb04b7c817448e10efe1ba46f4783f8951994d5027e4cd88f36ad79af50546682594c4ebd11702ac4b9364c47f8074890e2acad0edee - languageName: node - linkType: hard - -"p-locate@npm:^2.0.0": - version: 2.0.0 - resolution: "p-locate@npm:2.0.0" - dependencies: - p-limit: "npm:^1.1.0" - checksum: 10c0/82da4be88fb02fd29175e66021610c881938d3cc97c813c71c1a605fac05617d57fd5d3b337494a6106c0edb2a37c860241430851411f1b265108cead34aee67 - languageName: node - linkType: hard - -"p-map@npm:^7.0.2": - version: 7.0.4 - resolution: "p-map@npm:7.0.4" - checksum: 10c0/a5030935d3cb2919d7e89454d1ce82141e6f9955413658b8c9403cfe379283770ed3048146b44cde168aa9e8c716505f196d5689db0ae3ce9a71521a2fef3abd - languageName: node - linkType: hard - -"p-try@npm:^1.0.0": - version: 1.0.0 - resolution: "p-try@npm:1.0.0" - checksum: 10c0/757ba31de5819502b80c447826fac8be5f16d3cb4fbf9bc8bc4971dba0682e84ac33e4b24176ca7058c69e29f64f34d8d9e9b08e873b7b7bb0aa89d620fa224a - languageName: node - linkType: hard - -"pako@npm:~1.0.5": - version: 1.0.11 - resolution: "pako@npm:1.0.11" - checksum: 10c0/86dd99d8b34c3930345b8bbeb5e1cd8a05f608eeb40967b293f72fe469d0e9c88b783a8777e4cc7dc7c91ce54c5e93d88ff4b4f060e6ff18408fd21030d9ffbe - languageName: node - linkType: hard - -"parallel-transform@npm:^1.1.0": - version: 1.2.0 - resolution: "parallel-transform@npm:1.2.0" - dependencies: - cyclist: "npm:^1.0.1" - inherits: "npm:^2.0.3" - readable-stream: "npm:^2.1.5" - checksum: 10c0/ab0e58569e73681ca4b9c9228189bdb6cbea535295fae344cf0d8342fd33a950961914f3c414f81894c1498fb9ad1c079b4625d2b7ceae9e6ab812f22e3bea3f - languageName: node - linkType: hard - -"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.5": - version: 5.1.6 - resolution: "parse-asn1@npm:5.1.6" - dependencies: - asn1.js: "npm:^5.2.0" - browserify-aes: "npm:^1.0.0" - evp_bytestokey: "npm:^1.0.0" - pbkdf2: "npm:^3.0.3" - safe-buffer: "npm:^5.1.1" - checksum: 10c0/4ed1d9b9e120c5484d29d67bb90171aac0b73422bc016d6294160aea983275c28a27ab85d862059a36a86a97dd31b7ddd97486802ca9fac67115fe3409e9dcbd - languageName: node - linkType: hard - -"parse-json@npm:^2.2.0": - version: 2.2.0 - resolution: "parse-json@npm:2.2.0" - dependencies: - error-ex: "npm:^1.2.0" - checksum: 10c0/7a90132aa76016f518a3d5d746a21b3f1ad0f97a68436ed71b6f995b67c7151141f5464eea0c16c59aec9b7756519a0e3007a8f98cf3714632d509ec07736df6 - languageName: node - linkType: hard - -"parse-node-version@npm:^1.0.1": - version: 1.0.1 - resolution: "parse-node-version@npm:1.0.1" - checksum: 10c0/999cd3d7da1425c2e182dce82b226c6dc842562d3ed79ec47f5c719c32a7f6c1a5352495b894fc25df164be7f2ede4224758255da9902ddef81f2b77ba46bb2c - languageName: node - linkType: hard - -"path-browserify@npm:0.0.1": - version: 0.0.1 - resolution: "path-browserify@npm:0.0.1" - checksum: 10c0/3d59710cddeea06509d91935196185900f3d9d29376dff68ff0e146fbd41d0fb304e983d0158f30cabe4dd2ffcc6a7d3d977631994ee984c88e66aed50a1ccd3 - languageName: node - linkType: hard - -"path-exists@npm:^2.0.0": - version: 2.1.0 - resolution: "path-exists@npm:2.1.0" - dependencies: - pinkie-promise: "npm:^2.0.0" - checksum: 10c0/87352f1601c085d5a6eb202f60e5c016c1b790bd0bc09398af446ed3f5c4510b4531ff99cf8acac2d91868886e792927b4292f768b35a83dce12588fb7cbb46e - languageName: node - linkType: hard - -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 10c0/17d6a5664bc0a11d48e2b2127d28a0e58822c6740bde30403f08013da599182289c56518bec89407e3f31d3c2b6b296a4220bc3f867f0911fee6952208b04167 - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0, path-is-absolute@npm:^1.0.1": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 - languageName: node - linkType: hard - -"path-key@npm:^2.0.0": - version: 2.0.1 - resolution: "path-key@npm:2.0.1" - checksum: 10c0/dd2044f029a8e58ac31d2bf34c34b93c3095c1481942960e84dd2faa95bbb71b9b762a106aead0646695330936414b31ca0bd862bf488a937ad17c8c5d73b32b - languageName: node - linkType: hard - -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 - languageName: node - linkType: hard - -"path-scurry@npm:^2.0.2": - version: 2.0.2 - resolution: "path-scurry@npm:2.0.2" - dependencies: - lru-cache: "npm:^11.0.0" - minipass: "npm:^7.1.2" - checksum: 10c0/b35ad37cf6557a87fd057121ce2be7695380c9138d93e87ae928609da259ea0a170fac6f3ef1eb3ece8a068e8b7f2f3adf5bb2374cf4d4a57fe484954fcc9482 - languageName: node - linkType: hard - -"path-type@npm:^2.0.0": - version: 2.0.0 - resolution: "path-type@npm:2.0.0" - dependencies: - pify: "npm:^2.0.0" - checksum: 10c0/e475cead839e65a2f8fdde634b24a4116b49daea3917470552e19d49c63e59ef17963bec2f57df2c72a85fcd1f86c8850d9742e68dba9c9c8d9bcac38bab03d6 - languageName: node - linkType: hard - -"pbkdf2@npm:^3.0.3": - version: 3.1.2 - resolution: "pbkdf2@npm:3.1.2" - dependencies: - create-hash: "npm:^1.1.2" - create-hmac: "npm:^1.1.4" - ripemd160: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - sha.js: "npm:^2.4.8" - checksum: 10c0/5a30374e87d33fa080a92734d778cf172542cc7e41b96198c4c88763997b62d7850de3fbda5c3111ddf79805ee7c1da7046881c90ac4920b5e324204518b05fd - languageName: node - linkType: hard - -"php-date-formatter@npm:^1.3.4": - version: 1.3.6 - resolution: "php-date-formatter@npm:1.3.6" - checksum: 10c0/758a752df7aa6b8febbf41f3b049b841adfcc6beae5d2aae7a4e86fdf63b8cbfbcb32e78fd27287992b3dd52ad2f1f41504e1ed8c8a337eab1ab67a871d2b10a - languageName: node - linkType: hard - -"picomatch@npm:^4.0.3": - version: 4.0.3 - resolution: "picomatch@npm:4.0.3" - checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 - languageName: node - linkType: hard - -"pify@npm:^2.0.0": - version: 2.3.0 - resolution: "pify@npm:2.3.0" - checksum: 10c0/551ff8ab830b1052633f59cb8adc9ae8407a436e06b4a9718bcb27dc5844b83d535c3a8512b388b6062af65a98c49bdc0dd523d8b2617b188f7c8fee457158dc - languageName: node - linkType: hard - -"pify@npm:^3.0.0": - version: 3.0.0 - resolution: "pify@npm:3.0.0" - checksum: 10c0/fead19ed9d801f1b1fcd0638a1ac53eabbb0945bf615f2f8806a8b646565a04a1b0e7ef115c951d225f042cca388fdc1cd3add46d10d1ed6951c20bd2998af10 - languageName: node - linkType: hard - -"pify@npm:^4.0.1": - version: 4.0.1 - resolution: "pify@npm:4.0.1" - checksum: 10c0/6f9d404b0d47a965437403c9b90eca8bb2536407f03de165940e62e72c8c8b75adda5516c6b9b23675a5877cc0bcac6bdfb0ef0e39414cd2476d5495da40e7cf - languageName: node - linkType: hard - -"pinkie-promise@npm:^2.0.0": - version: 2.0.1 - resolution: "pinkie-promise@npm:2.0.1" - dependencies: - pinkie: "npm:^2.0.0" - checksum: 10c0/11b5e5ce2b090c573f8fad7b517cbca1bb9a247587306f05ae71aef6f9b2cd2b923c304aa9663c2409cfde27b367286179f1379bc4ec18a3fbf2bb0d473b160a - languageName: node - linkType: hard - -"pinkie@npm:^2.0.0": - version: 2.0.4 - resolution: "pinkie@npm:2.0.4" - checksum: 10c0/25228b08b5597da42dc384221aa0ce56ee0fbf32965db12ba838e2a9ca0193c2f0609c45551ee077ccd2060bf109137fdb185b00c6d7e0ed7e35006d20fdcbc6 - languageName: node - linkType: hard - -"pkg-dir@npm:^1.0.0": - version: 1.0.0 - resolution: "pkg-dir@npm:1.0.0" - dependencies: - find-up: "npm:^1.0.0" - checksum: 10c0/aa4c0322b5804fee90081ecc79f89b00922016ff56415a8e6bbafb19833e1bd8001a8999571599fb3212719d4e74e1fdb48338f6ff5b57d857a32cc939701e1a - languageName: node - linkType: hard - -"pkg-dir@npm:^2.0.0": - version: 2.0.0 - resolution: "pkg-dir@npm:2.0.0" - dependencies: - find-up: "npm:^2.1.0" - checksum: 10c0/7cdc46c4921bf2c5f9a438851d16243ddde9906928116647ec7784982dd9038ea61c964fbca6f489201845742188180ecd1001b4f69781de1d1dc7d100b14089 - languageName: node - linkType: hard - -"postcss-calc@npm:^5.2.0": - version: 5.3.1 - resolution: "postcss-calc@npm:5.3.1" - dependencies: - postcss: "npm:^5.0.2" - postcss-message-helpers: "npm:^2.0.0" - reduce-css-calc: "npm:^1.2.6" - checksum: 10c0/96444e979f0e7ef2c6e15d545a05c4ebc05eaa00d1743c9181c1008fb0cc06c926242e50b600ef627d9bd418c3fd24adb6732c482eeed0de8e60b64c1c105176 - languageName: node - linkType: hard - -"postcss-colormin@npm:^2.1.8": - version: 2.2.2 - resolution: "postcss-colormin@npm:2.2.2" - dependencies: - colormin: "npm:^1.0.5" - postcss: "npm:^5.0.13" - postcss-value-parser: "npm:^3.2.3" - checksum: 10c0/defcfa7e3c8daa0c116747acd01346867374505347e802115b2e7b476b6f74df4e67820bcd98743a0c02cd92159005d41db42e428700f873bb54647e54417e95 - languageName: node - linkType: hard - -"postcss-convert-values@npm:^2.3.4": - version: 2.6.1 - resolution: "postcss-convert-values@npm:2.6.1" - dependencies: - postcss: "npm:^5.0.11" - postcss-value-parser: "npm:^3.1.2" - checksum: 10c0/3efbc1c5feaa6c2eb56da61ad2c9e784c50aad1524d9c6a5a5992da43a276ead2b2d2986c8f8647fad484eefe3e22855993b2fe1984b392c45fd82aa92e7bfb9 - languageName: node - linkType: hard - -"postcss-discard-comments@npm:^2.0.4": - version: 2.0.4 - resolution: "postcss-discard-comments@npm:2.0.4" - dependencies: - postcss: "npm:^5.0.14" - checksum: 10c0/436039351e2e6fba1358077728f51c5923cf943584394fc38b441444fe572980f08c5c7d1733a2e48fa17096cb98e8180e73b45ed2aea7baabc162943ed403dc - languageName: node - linkType: hard - -"postcss-discard-duplicates@npm:^2.0.1": - version: 2.1.0 - resolution: "postcss-discard-duplicates@npm:2.1.0" - dependencies: - postcss: "npm:^5.0.4" - checksum: 10c0/0da451c605fa8b26981f2c8a059f9231eade6616026e01834dd5b305ad6ffbaae28916d3de5fe91b6d9810e0bff69e70ffe44cae3a908e12493bc4295cbf4a6f - languageName: node - linkType: hard - -"postcss-discard-empty@npm:^2.0.1": - version: 2.1.0 - resolution: "postcss-discard-empty@npm:2.1.0" - dependencies: - postcss: "npm:^5.0.14" - checksum: 10c0/e2008b574f80cc3621c3e318e59e36895077865a48800f1c25eb688128f8d43f0402c8effc21143533fd114200e532dcfbaca9813f0d07f9e71e32b6a859afbd - languageName: node - linkType: hard - -"postcss-discard-overridden@npm:^0.1.1": - version: 0.1.1 - resolution: "postcss-discard-overridden@npm:0.1.1" - dependencies: - postcss: "npm:^5.0.16" - checksum: 10c0/e1fd38e98045966be5f64252cbd553a597bc7678f64101025b850abe66851f35219320095321e4b0e9632843b6fc64e8bfe9b390064d9725a60a623a4a88b28d - languageName: node - linkType: hard - -"postcss-discard-unused@npm:^2.2.1": - version: 2.2.3 - resolution: "postcss-discard-unused@npm:2.2.3" - dependencies: - postcss: "npm:^5.0.14" - uniqs: "npm:^2.0.0" - checksum: 10c0/0058b5f15363a5a6a0d01e28aaea98506639e52e42b49878ffc80d75ab9c4c9a8136c99ca2b5c9bf4d734469620ff5c84ab4f811a7bf9bc2e7dfd5f76e6d68fb - languageName: node - linkType: hard - -"postcss-filter-plugins@npm:^2.0.0": - version: 2.0.3 - resolution: "postcss-filter-plugins@npm:2.0.3" - dependencies: - postcss: "npm:^5.0.4" - checksum: 10c0/a6d92215995486878dddab275ef65e55fd4432f779cc27ed435df49a22232743dad3285b9db8a5b32e4a618279d3f7415a501a9a4556411ee9d408bac447c5a0 - languageName: node - linkType: hard - -"postcss-merge-idents@npm:^2.1.5": - version: 2.1.7 - resolution: "postcss-merge-idents@npm:2.1.7" - dependencies: - has: "npm:^1.0.1" - postcss: "npm:^5.0.10" - postcss-value-parser: "npm:^3.1.1" - checksum: 10c0/5ef35d2ab59ceb32ca38d597753f8468dafb0782308930df820c96f3b23e4b4e36318ad29d76f88559c6a69d9c8d6283f1900617c0b6e4504bb5ab7523c120f8 - languageName: node - linkType: hard - -"postcss-merge-longhand@npm:^2.0.1": - version: 2.0.2 - resolution: "postcss-merge-longhand@npm:2.0.2" - dependencies: - postcss: "npm:^5.0.4" - checksum: 10c0/84145e5fee9e3064f1b22bde14fe5448449e519e3866a4c59cab42866309e3912638cc7e3d900c16090577a5f94899a2b46ed3a77c721592038671ce86e5395c - languageName: node - linkType: hard - -"postcss-merge-rules@npm:^2.0.3": - version: 2.1.2 - resolution: "postcss-merge-rules@npm:2.1.2" - dependencies: - browserslist: "npm:^1.5.2" - caniuse-api: "npm:^1.5.2" - postcss: "npm:^5.0.4" - postcss-selector-parser: "npm:^2.2.2" - vendors: "npm:^1.0.0" - checksum: 10c0/aa825593d06079de4776f8ec71a05276c145aab734b66fbdea2c42bb545c2ec9fe075912ecb28d18d9c3b506784e8cf7db0951f9af287bc090f3ed7e6e72c332 - languageName: node - linkType: hard - -"postcss-message-helpers@npm:^2.0.0": - version: 2.0.0 - resolution: "postcss-message-helpers@npm:2.0.0" - checksum: 10c0/5696c59befc408b208853a57994224f717c3a81a5b7129205c3087ad2af8159e209f29b66bfed7d79a1afc709cad76c3fbba06616ca71aeec77d7d029440dc72 - languageName: node - linkType: hard - -"postcss-minify-font-values@npm:^1.0.2": - version: 1.0.5 - resolution: "postcss-minify-font-values@npm:1.0.5" - dependencies: - object-assign: "npm:^4.0.1" - postcss: "npm:^5.0.4" - postcss-value-parser: "npm:^3.0.2" - checksum: 10c0/375fc0b1943b1d1e3c61bc33c19a70853ac2cebfdb0dcac23e5324edb218cf989bd7a8877cf846eafbb2d2e7cec4b7bc70922ac9300f9304c2422d807ccd4a85 - languageName: node - linkType: hard - -"postcss-minify-gradients@npm:^1.0.1": - version: 1.0.5 - resolution: "postcss-minify-gradients@npm:1.0.5" - dependencies: - postcss: "npm:^5.0.12" - postcss-value-parser: "npm:^3.3.0" - checksum: 10c0/ce5ed6151349ee4546b860cf9f7af38d8bfb942c32b45025b82c332603e2c49f6ee76ac9bda0cf8279cd2492baa4925b3298776deea7324f5efbd6a85782f0bc - languageName: node - linkType: hard - -"postcss-minify-params@npm:^1.0.4": - version: 1.2.2 - resolution: "postcss-minify-params@npm:1.2.2" - dependencies: - alphanum-sort: "npm:^1.0.1" - postcss: "npm:^5.0.2" - postcss-value-parser: "npm:^3.0.2" - uniqs: "npm:^2.0.0" - checksum: 10c0/e48823f55e60e8dc2c44fb7810a323146bd5f9aa3384a203ee56c08b77a84d5227446a005b84371e8560dd0d6cefed667acc8cf020367c6934c7233fd890f7c8 - languageName: node - linkType: hard - -"postcss-minify-selectors@npm:^2.0.4": - version: 2.1.1 - resolution: "postcss-minify-selectors@npm:2.1.1" - dependencies: - alphanum-sort: "npm:^1.0.2" - has: "npm:^1.0.1" - postcss: "npm:^5.0.14" - postcss-selector-parser: "npm:^2.0.0" - checksum: 10c0/3fd37f12d4d4518a4c7e3e4c9a6ab8cf4757faff6d388700e5d148b9b7b6f1d1f28a6be0ffda5f0077a4e4d509fec65cef3e1343ff72d02e1945a1fba2543ac1 - languageName: node - linkType: hard - -"postcss-modules-extract-imports@npm:^1.2.0": - version: 1.2.1 - resolution: "postcss-modules-extract-imports@npm:1.2.1" - dependencies: - postcss: "npm:^6.0.1" - checksum: 10c0/5746702936c1e1b78a7b31c4e20092197aa89c4e59c156249aea861c84cd0781c11c8c4648b95bcfdce010c48c8edd83b94eb9103f7c72ef8eb96c4b15716ed3 - languageName: node - linkType: hard - -"postcss-modules-local-by-default@npm:^1.2.0": - version: 1.2.0 - resolution: "postcss-modules-local-by-default@npm:1.2.0" - dependencies: - css-selector-tokenizer: "npm:^0.7.0" - postcss: "npm:^6.0.1" - checksum: 10c0/9139846ccefbb089cff17abda76e199c4d464d899816265f0b3939f5cf588b8ba59f9119b87eccaf3bfde3049bddd6ac5989f46e6d8fa9ba936cc6ccb27b89bd - languageName: node - linkType: hard - -"postcss-modules-scope@npm:^1.1.0": - version: 1.1.0 - resolution: "postcss-modules-scope@npm:1.1.0" - dependencies: - css-selector-tokenizer: "npm:^0.7.0" - postcss: "npm:^6.0.1" - checksum: 10c0/ef0328204912f2a3b98322ac5f3d377c234c391a2afd29f51ec83961ad0e0c4dc01192968649ce47c75c85a6c922dd8c608b137c1cce548fe5d92d6fb4454bb2 - languageName: node - linkType: hard - -"postcss-modules-values@npm:^1.3.0": - version: 1.3.0 - resolution: "postcss-modules-values@npm:1.3.0" - dependencies: - icss-replace-symbols: "npm:^1.1.0" - postcss: "npm:^6.0.1" - checksum: 10c0/11bb1af2478291b72f6cc106ba48dc566079021976b2da8c7989db6dca643db6fe81653aba43d4cfb0467754853d77d1eb0e3593a621affe62a1cc2d72541c70 - languageName: node - linkType: hard - -"postcss-normalize-charset@npm:^1.1.0": - version: 1.1.1 - resolution: "postcss-normalize-charset@npm:1.1.1" - dependencies: - postcss: "npm:^5.0.5" - checksum: 10c0/69e67c67ad2a71b2dee440769a3651c84dee7bfcb713749ebbef544454b0151ef0c84833228513d6f53afd63c721b38cd640c54eca9602e3768139158e0f316a - languageName: node - linkType: hard - -"postcss-normalize-url@npm:^3.0.7": - version: 3.0.8 - resolution: "postcss-normalize-url@npm:3.0.8" - dependencies: - is-absolute-url: "npm:^2.0.0" - normalize-url: "npm:^1.4.0" - postcss: "npm:^5.0.14" - postcss-value-parser: "npm:^3.2.3" - checksum: 10c0/c53225ca485dd10d156e33e5ee5c3a830082f3f68a337b9e48f5a9d5083f6bebdf13008103d056b2025622c56421284bd391d9a86949ca468541cd0e2df682a6 - languageName: node - linkType: hard - -"postcss-ordered-values@npm:^2.1.0": - version: 2.2.3 - resolution: "postcss-ordered-values@npm:2.2.3" - dependencies: - postcss: "npm:^5.0.4" - postcss-value-parser: "npm:^3.0.1" - checksum: 10c0/4d55a1c7f108f01181c22db1cb886ba0d47f71472a0e531f66b6d90094e74754a35a85cae7c142b4f6277066d2d4c586814dbd909ac7bb9d4c9d1180ac34d10b - languageName: node - linkType: hard - -"postcss-reduce-idents@npm:^2.2.2": - version: 2.4.0 - resolution: "postcss-reduce-idents@npm:2.4.0" - dependencies: - postcss: "npm:^5.0.4" - postcss-value-parser: "npm:^3.0.2" - checksum: 10c0/a63b42193dd19298b28411bb6186ec6aa5cc176cbb2a4e4e67567cecf116feaa02407744eb734521a49445be497156afad70d0ab5dcd1d9af772e2aca1fd127c - languageName: node - linkType: hard - -"postcss-reduce-initial@npm:^1.0.0": - version: 1.0.1 - resolution: "postcss-reduce-initial@npm:1.0.1" - dependencies: - postcss: "npm:^5.0.4" - checksum: 10c0/f1c40830ceea191cc31353cc5085a1dab8e94f40ce009d0779b0589329546c8f11a10c0ba3d6514032cbee1439d76dc5e0b49bb841b1ca388827cc8be79b587a - languageName: node - linkType: hard - -"postcss-reduce-transforms@npm:^1.0.3": - version: 1.0.4 - resolution: "postcss-reduce-transforms@npm:1.0.4" - dependencies: - has: "npm:^1.0.1" - postcss: "npm:^5.0.8" - postcss-value-parser: "npm:^3.0.1" - checksum: 10c0/9c8cf2373dd84adb132fcd15ca48379276ef353ab8e51c18506d2e9688658579affff77bcbff19e460e875483b9a7d18fb40488f89f8d15b635f10503da9d875 - languageName: node - linkType: hard - -"postcss-selector-parser@npm:^2.0.0, postcss-selector-parser@npm:^2.2.2": - version: 2.2.3 - resolution: "postcss-selector-parser@npm:2.2.3" - dependencies: - flatten: "npm:^1.0.2" - indexes-of: "npm:^1.0.1" - uniq: "npm:^1.0.1" - checksum: 10c0/dc8aee6807096a93a6a1079bddb8d3e94ca385688889da087156ecfe48f3ad7db7581395fada92737d0d6e6a2cda96697fb2d94bbbf97484adb1acff261efe00 - languageName: node - linkType: hard - -"postcss-svgo@npm:^2.1.1": - version: 2.1.6 - resolution: "postcss-svgo@npm:2.1.6" - dependencies: - is-svg: "npm:^2.0.0" - postcss: "npm:^5.0.14" - postcss-value-parser: "npm:^3.2.3" - svgo: "npm:^0.7.0" - checksum: 10c0/a4e33316888c609b2db8e0dbaa7db49f4c0c880985df364d1a237fc1ef170815f21949433e4ea5684da2c2b3d8ef2f6c0e944d3757c6749b350dbf19d534b5f2 - languageName: node - linkType: hard - -"postcss-unique-selectors@npm:^2.0.2": - version: 2.0.2 - resolution: "postcss-unique-selectors@npm:2.0.2" - dependencies: - alphanum-sort: "npm:^1.0.1" - postcss: "npm:^5.0.4" - uniqs: "npm:^2.0.0" - checksum: 10c0/4d1fac25aec01952390df2746f1cb9392b1cfe29bd167608248408755bd8b510209f95213953bda61b3c1201fb580620acdffd4f29fb85c3986f2a04b9b6bb52 - languageName: node - linkType: hard - -"postcss-value-parser@npm:^3.0.1, postcss-value-parser@npm:^3.0.2, postcss-value-parser@npm:^3.1.1, postcss-value-parser@npm:^3.1.2, postcss-value-parser@npm:^3.2.3, postcss-value-parser@npm:^3.3.0": - version: 3.3.1 - resolution: "postcss-value-parser@npm:3.3.1" - checksum: 10c0/23eed98d8eeadb1f9ef1db4a2757da0f1d8e7c1dac2a38d6b35d971aab9eb3c6d8a967d0e9f435558834ffcd966afbbe875a56bcc5bcdd09e663008c106b3e47 - languageName: node - linkType: hard - -"postcss-zindex@npm:^2.0.1": - version: 2.2.0 - resolution: "postcss-zindex@npm:2.2.0" - dependencies: - has: "npm:^1.0.1" - postcss: "npm:^5.0.4" - uniqs: "npm:^2.0.0" - checksum: 10c0/3c99a8fcd7132ecd5f56df7d8bdbe9a9d78f6c92c784435d522e1909b4e5f624905734c528787b0257a2ae23ec45f5bf435f8e2dcd47733fad8d779b91f2ba09 - languageName: node - linkType: hard - -"postcss@npm:^5.0.10, postcss@npm:^5.0.11, postcss@npm:^5.0.12, postcss@npm:^5.0.13, postcss@npm:^5.0.14, postcss@npm:^5.0.16, postcss@npm:^5.0.2, postcss@npm:^5.0.4, postcss@npm:^5.0.5, postcss@npm:^5.0.6, postcss@npm:^5.0.8, postcss@npm:^5.2.16": - version: 5.2.18 - resolution: "postcss@npm:5.2.18" - dependencies: - chalk: "npm:^1.1.3" - js-base64: "npm:^2.1.9" - source-map: "npm:^0.5.6" - supports-color: "npm:^3.2.3" - checksum: 10c0/1f9f6673dd24d52f1ed33b800248e6ef752d6b6a092fe268021e398df0d7e0956f00fb961781647264d659240c3d67f5bfd3df9bf1b7af985aa996be619d30b1 - languageName: node - linkType: hard - -"postcss@npm:^6.0.1": - version: 6.0.23 - resolution: "postcss@npm:6.0.23" - dependencies: - chalk: "npm:^2.4.1" - source-map: "npm:^0.6.1" - supports-color: "npm:^5.4.0" - checksum: 10c0/45d45184ffbb9d510e7585d9441af9a1a771a56b7553b1d598544e54acdfd31df439a95d5f00a6dc57b85b76d0c8925fec18614b1cc795887c845c3965e32e63 - languageName: node - linkType: hard - -"prepend-http@npm:^1.0.0": - version: 1.0.4 - resolution: "prepend-http@npm:1.0.4" - checksum: 10c0/c6c173ca439e58163ba7bea7cbba52a1ed11e3e3da1c048da296f37d4b7654f78f7304e03f76d5923f4b83af7e2d55533e0f79064209c75b743ccddee13904f8 - languageName: node - linkType: hard - -"private@npm:^0.1.8": - version: 0.1.8 - resolution: "private@npm:0.1.8" - checksum: 10c0/829a23723e5fd3105c72b2dadeeb65743a430f7e6967a8a6f3e49392a1b3ea52975a255376d8c513b0c988bdf162f1a5edf9d9bac27d1ab11f8dba8cdb58880e - languageName: node - linkType: hard - -"proc-log@npm:^6.0.0": - version: 6.1.0 - resolution: "proc-log@npm:6.1.0" - checksum: 10c0/4f178d4062733ead9d71a9b1ab24ebcecdfe2250916a5b1555f04fe2eda972a0ec76fbaa8df1ad9c02707add6749219d118a4fc46dc56bdfe4dde4b47d80bb82 - languageName: node - linkType: hard - -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 - languageName: node - linkType: hard - -"process@npm:^0.11.10": - version: 0.11.10 - resolution: "process@npm:0.11.10" - checksum: 10c0/40c3ce4b7e6d4b8c3355479df77aeed46f81b279818ccdc500124e6a5ab882c0cc81ff7ea16384873a95a74c4570b01b120f287abbdd4c877931460eca6084b3 - languageName: node - linkType: hard - -"promise-inflight@npm:^1.0.1": - version: 1.0.1 - resolution: "promise-inflight@npm:1.0.1" - checksum: 10c0/d179d148d98fbff3d815752fa9a08a87d3190551d1420f17c4467f628214db12235ae068d98cd001f024453676d8985af8f28f002345646c4ece4600a79620bc - languageName: node - linkType: hard - -"prr@npm:~1.0.1": - version: 1.0.1 - resolution: "prr@npm:1.0.1" - checksum: 10c0/5b9272c602e4f4472a215e58daff88f802923b84bc39c8860376bb1c0e42aaf18c25d69ad974bd06ec6db6f544b783edecd5502cd3d184748d99080d68e4be5f - languageName: node - linkType: hard - -"pseudomap@npm:^1.0.2": - version: 1.0.2 - resolution: "pseudomap@npm:1.0.2" - checksum: 10c0/5a91ce114c64ed3a6a553aa7d2943868811377388bb31447f9d8028271bae9b05b340fe0b6961a64e45b9c72946aeb0a4ab635e8f7cb3715ffd0ff2beeb6a679 - languageName: node - linkType: hard - -"public-encrypt@npm:^4.0.0": - version: 4.0.3 - resolution: "public-encrypt@npm:4.0.3" - dependencies: - bn.js: "npm:^4.1.0" - browserify-rsa: "npm:^4.0.0" - create-hash: "npm:^1.1.0" - parse-asn1: "npm:^5.0.0" - randombytes: "npm:^2.0.1" - safe-buffer: "npm:^5.1.2" - checksum: 10c0/6c2cc19fbb554449e47f2175065d6b32f828f9b3badbee4c76585ac28ae8641aafb9bb107afc430c33c5edd6b05dbe318df4f7d6d7712b1093407b11c4280700 - languageName: node - linkType: hard - -"pump@npm:^2.0.0, pump@npm:^2.0.1": - version: 2.0.1 - resolution: "pump@npm:2.0.1" - dependencies: - end-of-stream: "npm:^1.1.0" - once: "npm:^1.3.1" - checksum: 10c0/f1fe8960f44d145f8617ea4c67de05392da4557052980314c8f85081aee26953bdcab64afad58a2b1df0e8ff7203e3710e848cbe81a01027978edc6e264db355 - languageName: node - linkType: hard - -"pumpify@npm:^1.3.3": - version: 1.5.1 - resolution: "pumpify@npm:1.5.1" - dependencies: - duplexify: "npm:^3.6.0" - inherits: "npm:^2.0.3" - pump: "npm:^2.0.0" - checksum: 10c0/0bcabf9e3dbf2d0cc1f9b84ac80d3c75386111caf8963bfd98817a1e2192000ac0ccc804ca6ccd5b2b8430fdb71347b20fb2f014fe3d41adbacb1b502a841c45 - languageName: node - linkType: hard - -"punycode@npm:1.3.2": - version: 1.3.2 - resolution: "punycode@npm:1.3.2" - checksum: 10c0/281fd20eaf4704f79d80cb0dc65065bf6452ee67989b3e8941aed6360a5a9a8a01d3e2ed71d0bde3cd74fb5a5dd9db4160bed5a8c20bed4b6764c24ce4c7d2d2 - languageName: node - linkType: hard - -"punycode@npm:^1.2.4": - version: 1.4.1 - resolution: "punycode@npm:1.4.1" - checksum: 10c0/354b743320518aef36f77013be6e15da4db24c2b4f62c5f1eb0529a6ed02fbaf1cb52925785f6ab85a962f2b590d9cd5ad730b70da72b5f180e2556b8bd3ca08 - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.1.1 - resolution: "punycode@npm:2.1.1" - checksum: 10c0/83815ca9b9177f055771f31980cbec7ffaef10257d50a95ab99b4a30f0404846e85fa6887ee1bbc0aaddb7bad6d96e2fa150a016051ff0f6b92be4ad613ddca8 - languageName: node - linkType: hard - -"q@npm:^1.1.2": - version: 1.5.1 - resolution: "q@npm:1.5.1" - checksum: 10c0/7855fbdba126cb7e92ef3a16b47ba998c0786ec7fface236e3eb0135b65df36429d91a86b1fff3ab0927b4ac4ee88a2c44527c7c3b8e2a37efbec9fe34803df4 - languageName: node - linkType: hard - -"qs@npm:2.3.3": - version: 2.3.3 - resolution: "qs@npm:2.3.3" - checksum: 10c0/4c02f03f77e50219799f52608dd72f57389ea364be499f5e8b02d505377cb93f6414239e00b3a7342b0d05a730ad85b3ffb5e7f0a5ba2f3d8ef7303283c01e17 - languageName: node - linkType: hard - -"query-string@npm:^4.1.0": - version: 4.3.4 - resolution: "query-string@npm:4.3.4" - dependencies: - object-assign: "npm:^4.1.0" - strict-uri-encode: "npm:^1.0.0" - checksum: 10c0/6181c343074c2049fbbcde63f87c1da5d3a49c6e34c8d94a61d692e886e0b8cd1ae4a4be00b598112bb9c4cb819e423ed503a5d246e4d24ecb0990d8bb21570b - languageName: node - linkType: hard - -"querystring-es3@npm:^0.2.0": - version: 0.2.1 - resolution: "querystring-es3@npm:0.2.1" - checksum: 10c0/476938c1adb45c141f024fccd2ffd919a3746e79ed444d00e670aad68532977b793889648980e7ca7ff5ffc7bfece623118d0fbadcaf217495eeb7059ae51580 - languageName: node - linkType: hard - -"querystring@npm:0.2.0": - version: 0.2.0 - resolution: "querystring@npm:0.2.0" - checksum: 10c0/2036c9424beaacd3978bac9e4ba514331cc73163bea7bf3ad7e2c7355e55501938ec195312c607753f9c6e70b1bf9dfcda38db6241bd299c034e27ac639d64ed - languageName: node - linkType: hard - -"randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5": - version: 2.1.0 - resolution: "randombytes@npm:2.1.0" - dependencies: - safe-buffer: "npm:^5.1.0" - checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 - languageName: node - linkType: hard - -"randomfill@npm:^1.0.3": - version: 1.0.4 - resolution: "randomfill@npm:1.0.4" - dependencies: - randombytes: "npm:^2.0.5" - safe-buffer: "npm:^5.1.0" - checksum: 10c0/11aeed35515872e8f8a2edec306734e6b74c39c46653607f03c68385ab8030e2adcc4215f76b5e4598e028c4750d820afd5c65202527d831d2a5f207fe2bc87c - languageName: node - linkType: hard - -"raven@npm:^2.6.4": - version: 2.6.4 - resolution: "raven@npm:2.6.4" - dependencies: - cookie: "npm:0.3.1" - md5: "npm:^2.2.1" - stack-trace: "npm:0.0.10" - timed-out: "npm:4.0.1" - uuid: "npm:3.3.2" - bin: - raven: ./bin/raven - checksum: 10c0/688dd6137c16f0d6cd67dadf1450b1cc0f74cbd3abac010c1d2aa84334a17799859f525a2a5478b803000f514dd74ef60bd97a96274c329ff7acf68dd6350927 - languageName: node - linkType: hard - -"read-pkg-up@npm:^2.0.0": - version: 2.0.0 - resolution: "read-pkg-up@npm:2.0.0" - dependencies: - find-up: "npm:^2.0.0" - read-pkg: "npm:^2.0.0" - checksum: 10c0/6fbb9f8c1a9ed3c8a5764387a77ac4456082f1fe98757d1ed300d8b0a4c70501f28cbb053ae7b3e0de6094930fb7258fbfe099957a53c999337aaf8bc53ff37f - languageName: node - linkType: hard - -"read-pkg@npm:^2.0.0": - version: 2.0.0 - resolution: "read-pkg@npm:2.0.0" - dependencies: - load-json-file: "npm:^2.0.0" - normalize-package-data: "npm:^2.3.2" - path-type: "npm:^2.0.0" - checksum: 10c0/c0d1b66c58e58fadaabe48c83c525fb1966304555e5089fab5ccce2c3dfe0fad726720b170a5fa23ff20452e22d1dbe817f5c63f03546bb85cbfb6b84da84c2b - languageName: node - linkType: hard - -"readable-stream@npm:1 || 2, readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.2, readable-stream@npm:^2.1.5, readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.3, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6": - version: 2.3.7 - resolution: "readable-stream@npm:2.3.7" - dependencies: - core-util-is: "npm:~1.0.0" - inherits: "npm:~2.0.3" - isarray: "npm:~1.0.0" - process-nextick-args: "npm:~2.0.0" - safe-buffer: "npm:~5.1.1" - string_decoder: "npm:~1.1.1" - util-deprecate: "npm:~1.0.1" - checksum: 10c0/1708755e6cf9daff6ff60fa5b4575636472289c5b95d38058a91f94732b8d024a940a0d4d955639195ce42c22cab16973ee8fea8deedd24b5fec3dd596465f86 - languageName: node - linkType: hard - -"readable-stream@npm:1.0.27-1": - version: 1.0.27-1 - resolution: "readable-stream@npm:1.0.27-1" - dependencies: - core-util-is: "npm:~1.0.0" - inherits: "npm:~2.0.1" - isarray: "npm:0.0.1" - string_decoder: "npm:~0.10.x" - checksum: 10c0/b887546e0a2c9e3204141be697d96f7966c4f25110925d9cd6714cf451d750b77ad873fd176ed03e40e4cb5da52f35a382ddd50e306e3f5fd37e238044897cd3 - languageName: node - linkType: hard - -"readable-stream@npm:>=1.0.33-1 <1.1.0-0": - version: 1.0.34 - resolution: "readable-stream@npm:1.0.34" - dependencies: - core-util-is: "npm:~1.0.0" - inherits: "npm:~2.0.1" - isarray: "npm:0.0.1" - string_decoder: "npm:~0.10.x" - checksum: 10c0/02272551396ed8930ddee1a088bdf0379f0f7cc47ac49ed8804e998076cb7daec9fbd2b1fd9c0490ec72e56e8bb3651abeb8080492b8e0a9c3f2158330908ed6 - languageName: node - linkType: hard - -"readable-stream@npm:^3.6.0": - version: 3.6.0 - resolution: "readable-stream@npm:3.6.0" - dependencies: - inherits: "npm:^2.0.3" - string_decoder: "npm:^1.1.1" - util-deprecate: "npm:^1.0.1" - checksum: 10c0/937bedd29ac8a68331666291922bea892fa2be1a33269e582de9f844a2002f146cf831e39cd49fe6a378d3f0c27358f259ed0e20d20f0bdc6a3f8fc21fce42dc - languageName: node - linkType: hard - -"reduce-component@npm:1.0.1": - version: 1.0.1 - resolution: "reduce-component@npm:1.0.1" - checksum: 10c0/a06392549d3783c626daff88e49ca29d02390b27028a37a75116c3f36b544ad1772d32332b0f374990545287edf4403159de990d0678fb799b254ebbe113fa71 - languageName: node - linkType: hard - -"reduce-css-calc@npm:^1.2.6": - version: 1.3.0 - resolution: "reduce-css-calc@npm:1.3.0" - dependencies: - balanced-match: "npm:^0.4.2" - math-expression-evaluator: "npm:^1.2.14" - reduce-function-call: "npm:^1.0.1" - checksum: 10c0/c0b192bbdc7617ee7e3bcd09332f7f810c2b52f1da8521c4eda03879ead00bcca65bcae78d5bc8cd925610f776532a3457e8b2fd8f4bb936bdb40f057590f20d - languageName: node - linkType: hard - -"reduce-function-call@npm:^1.0.1": - version: 1.0.3 - resolution: "reduce-function-call@npm:1.0.3" - dependencies: - balanced-match: "npm:^1.0.0" - checksum: 10c0/7e844708d8c3d2946d3df5c537ee1e23c3c60c98ac0dbc724828f36d8d309c391a14995f47ce4f5ba84eea2df5c73d58e4ba100ba331af496920932421a322ed - languageName: node - linkType: hard - -"regenerator-runtime@npm:^0.11.0": - version: 0.11.1 - resolution: "regenerator-runtime@npm:0.11.1" - checksum: 10c0/69cfa839efcf2d627fe358bf302ab8b24e5f182cb69f13e66f0612d3640d7838aad1e55662135e3ef2c1cc4322315b757626094fab13a48f9a64ab4bdeb8795b - languageName: node - linkType: hard - -"repeating@npm:^2.0.0": - version: 2.0.1 - resolution: "repeating@npm:2.0.1" - dependencies: - is-finite: "npm:^1.0.0" - checksum: 10c0/7f5cd293ec47d9c074ef0852800d5ff5c49028ce65242a7528d84f32bd2fe200b142930562af58c96d869c5a3046e87253030058e45231acaa129c1a7087d2e7 - languageName: node - linkType: hard - -"require-directory@npm:^2.1.1": - version: 2.1.1 - resolution: "require-directory@npm:2.1.1" - checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 - languageName: node - linkType: hard - -"require-main-filename@npm:^1.0.1": - version: 1.0.1 - resolution: "require-main-filename@npm:1.0.1" - checksum: 10c0/1ab87efb72a0e223a667154e92f29ca753fd42eb87f22db142b91c86d134e29ecf18af929111ccd255fd340b57d84a9d39489498d8dfd5136b300ded30a5f0b6 - languageName: node - linkType: hard - -"resolve@npm:^1.10.0": - version: 1.22.1 - resolution: "resolve@npm:1.22.1" - dependencies: - is-core-module: "npm:^2.9.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/6d58b1cb40f3fc80b9e45dd799d84cdc3829a993e4b9fa3b59d331e1dfacd0870e1851f4d0eb549d68c796e0b7087b43d1aec162653ccccff9e18191221a6e7d - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin": - version: 1.22.1 - resolution: "resolve@patch:resolve@npm%3A1.22.1#optional!builtin::version=1.22.1&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.9.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/0d8ccceba5537769c42aa75e4aa75ae854aac866a11d7e9ffdb1663f0158ee646a0d48fc2818ed5e7fb364d64220a1fb9092a160e11e00cbdd5fbab39a13092c - languageName: node - linkType: hard - -"rimraf@npm:^2.5.4, rimraf@npm:^2.6.2": - version: 2.7.1 - resolution: "rimraf@npm:2.7.1" - dependencies: - glob: "npm:^7.1.3" - bin: - rimraf: ./bin.js - checksum: 10c0/4eef73d406c6940927479a3a9dee551e14a54faf54b31ef861250ac815172bade86cc6f7d64a4dc5e98b65e4b18a2e1c9ff3b68d296be0c748413f092bb0dd40 - languageName: node - linkType: hard - -"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": - version: 2.0.2 - resolution: "ripemd160@npm:2.0.2" - dependencies: - hash-base: "npm:^3.0.0" - inherits: "npm:^2.0.1" - checksum: 10c0/f6f0df78817e78287c766687aed4d5accbebc308a8e7e673fb085b9977473c1f139f0c5335d353f172a915bb288098430755d2ad3c4f30612f4dd0c901cd2c3a - languageName: node - linkType: hard - -"run-queue@npm:^1.0.0, run-queue@npm:^1.0.3": - version: 1.0.3 - resolution: "run-queue@npm:1.0.3" - dependencies: - aproba: "npm:^1.1.1" - checksum: 10c0/4e8964279d8f160f9ffaabe82eaad11a1d4c0db596a0f2b5257ae9d2b900c7e1ffcece3e5719199436f50718e1e7f45bb4bf7a82e331a4e734d67c2588a90cbb - languageName: node - linkType: hard - -"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 - languageName: node - linkType: hard - -"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.1.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 - languageName: node - linkType: hard - -"sax@npm:^1.2.4, sax@npm:~1.2.1": - version: 1.2.4 - resolution: "sax@npm:1.2.4" - checksum: 10c0/6e9b05ff443ee5e5096ce92d31c0740a20d33002fad714ebcb8fc7a664d9ee159103ebe8f7aef0a1f7c5ecacdd01f177f510dff95611c589399baf76437d3fe3 - languageName: node - linkType: hard - -"schema-utils@npm:^0.4.5": - version: 0.4.7 - resolution: "schema-utils@npm:0.4.7" - dependencies: - ajv: "npm:^6.1.0" - ajv-keywords: "npm:^3.1.0" - checksum: 10c0/0de445cee6bf9a54b7b18b284b5f5ebe5b481f57e71854872c4215bd8eda73811a5f4964718c26f24b50f46a5eafbaf8a391459a7f10b78c242a798a3e0e24c8 - languageName: node - linkType: hard - -"schema-utils@npm:^1.0.0": - version: 1.0.0 - resolution: "schema-utils@npm:1.0.0" - dependencies: - ajv: "npm:^6.1.0" - ajv-errors: "npm:^1.0.0" - ajv-keywords: "npm:^3.1.0" - checksum: 10c0/670e22d7f0ff0b6f4514a4d6fb27c359101b44b7dbfd9563af201af72eb4a9ff06144020cab5f85b16e88821fd09b97cbdae6c893721c6528c8cb704124e6a2f - languageName: node - linkType: hard - -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.6.0": - version: 5.7.1 - resolution: "semver@npm:5.7.1" - bin: - semver: ./bin/semver - checksum: 10c0/d4884f2aeca28bff35d0bd40ff0a9b2dfc4b36a883bf0ea5dc15d10d9a01bdc9041035b05f825d4b5ac8a56e490703dbf0d986d054de82cc5e9bad3f02ca6e00 - languageName: node - linkType: hard - -"semver@npm:^7.3.5": - version: 7.7.4 - resolution: "semver@npm:7.7.4" - bin: - semver: bin/semver.js - checksum: 10c0/5215ad0234e2845d4ea5bb9d836d42b03499546ddafb12075566899fc617f68794bb6f146076b6881d755de17d6c6cc73372555879ec7dce2c2feee947866ad2 - languageName: node - linkType: hard - -"serialize-javascript@npm:^1.4.0": - version: 1.9.1 - resolution: "serialize-javascript@npm:1.9.1" - checksum: 10c0/01c1aabb28a50133ac7c86038ec14be26b13e0d8d43ac6ad4bad57789bc8dc33b33fef2424330ab9d138da40d9a3c2520f0d66e8c3474eeeab01669d3a38cae1 - languageName: node - linkType: hard - -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 - languageName: node - linkType: hard - -"setimmediate@npm:^1.0.4": - version: 1.0.5 - resolution: "setimmediate@npm:1.0.5" - checksum: 10c0/5bae81bfdbfbd0ce992893286d49c9693c82b1bcc00dcaaf3a09c8f428fdeacf4190c013598b81875dfac2b08a572422db7df779a99332d0fce186d15a3e4d49 - languageName: node - linkType: hard - -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": - version: 2.4.11 - resolution: "sha.js@npm:2.4.11" - dependencies: - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - bin: - sha.js: ./bin.js - checksum: 10c0/b7a371bca8821c9cc98a0aeff67444a03d48d745cb103f17228b96793f455f0eb0a691941b89ea1e60f6359207e36081d9be193252b0f128e0daf9cfea2815a5 - languageName: node - linkType: hard - -"shebang-command@npm:^1.2.0": - version: 1.2.0 - resolution: "shebang-command@npm:1.2.0" - dependencies: - shebang-regex: "npm:^1.0.0" - checksum: 10c0/7b20dbf04112c456b7fc258622dafd566553184ac9b6938dd30b943b065b21dabd3776460df534cc02480db5e1b6aec44700d985153a3da46e7db7f9bd21326d - languageName: node - linkType: hard - -"shebang-regex@npm:^1.0.0": - version: 1.0.0 - resolution: "shebang-regex@npm:1.0.0" - checksum: 10c0/9abc45dee35f554ae9453098a13fdc2f1730e525a5eb33c51f096cc31f6f10a4b38074c1ebf354ae7bffa7229506083844008dfc3bb7818228568c0b2dc1fff2 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.0": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 - languageName: node - linkType: hard - -"simple-statistics@npm:7.7.3": - version: 7.7.3 - resolution: "simple-statistics@npm:7.7.3" - checksum: 10c0/a65fe89dbeb6233735f2aea0a9c41d9bb33b57779c3a47b0ea2daab62c6c2dd03ce867cde73083fb373bf6faaf874d10c1c7615eb5426237aa6d8c4e54fd6a47 - languageName: node - linkType: hard - -"slash@npm:^1.0.0": - version: 1.0.0 - resolution: "slash@npm:1.0.0" - checksum: 10c0/3944659885d905480f98810542fd314f3e1006eaad25ec78227a7835a469d9ed66fc3dd90abc7377dd2e71f4b5473e8f766bd08198fdd25152a80792e9ed464c - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.3": - version: 8.0.5 - resolution: "socks-proxy-agent@npm:8.0.5" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:^4.3.4" - socks: "npm:^2.8.3" - checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 - languageName: node - linkType: hard - -"socks@npm:^2.8.3": - version: 2.8.7 - resolution: "socks@npm:2.8.7" - dependencies: - ip-address: "npm:^10.0.1" - smart-buffer: "npm:^4.2.0" - checksum: 10c0/2805a43a1c4bcf9ebf6e018268d87b32b32b06fbbc1f9282573583acc155860dc361500f89c73bfbb157caa1b4ac78059eac0ef15d1811eb0ca75e0bdadbc9d2 - languageName: node - linkType: hard - -"sort-keys@npm:^1.0.0": - version: 1.1.2 - resolution: "sort-keys@npm:1.1.2" - dependencies: - is-plain-obj: "npm:^1.0.0" - checksum: 10c0/5dd383b0299a40277051f7498c3999520138e2eb50d422962f658738341c9e82349fad4a3024d5ba1a3122688fbaf958f2a472d4c53bade55515097c2ce15420 - languageName: node - linkType: hard - -"source-list-map@npm:^2.0.0": - version: 2.0.1 - resolution: "source-list-map@npm:2.0.1" - checksum: 10c0/2e5e421b185dcd857f46c3c70e2e711a65d717b78c5f795e2e248c9d67757882ea989b80ebc08cf164eeeda5f4be8aa95d3b990225070b2daaaf3257c5958149 - languageName: node - linkType: hard - -"source-map-support@npm:^0.4.15": - version: 0.4.18 - resolution: "source-map-support@npm:0.4.18" - dependencies: - source-map: "npm:^0.5.6" - checksum: 10c0/cd9f0309c1632b1e01a7715a009e0b036d565f3af8930fa8cda2a06aeec05ad1d86180e743b7e1f02cc3c97abe8b6d8de7c3878c2d8e01e86e17f876f7ecf98e - languageName: node - linkType: hard - -"source-map@npm:^0.5.3, source-map@npm:^0.5.6, source-map@npm:^0.5.7": - version: 0.5.7 - resolution: "source-map@npm:0.5.7" - checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 - languageName: node - linkType: hard - -"source-map@npm:^0.6.1, source-map@npm:~0.6.0, source-map@npm:~0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 - languageName: node - linkType: hard - -"spdx-correct@npm:^3.0.0": - version: 3.1.1 - resolution: "spdx-correct@npm:3.1.1" - dependencies: - spdx-expression-parse: "npm:^3.0.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/25909eecc4024963a8e398399dbdd59ddb925bd7dbecd9c9cf6df0d75c29b68cd30b82123564acc51810eb02cfc4b634a2e16e88aa982433306012e318849249 - languageName: node - linkType: hard - -"spdx-exceptions@npm:^2.1.0": - version: 2.3.0 - resolution: "spdx-exceptions@npm:2.3.0" - checksum: 10c0/83089e77d2a91cb6805a5c910a2bedb9e50799da091f532c2ba4150efdef6e53f121523d3e2dc2573a340dc0189e648b03157097f65465b3a0c06da1f18d7e8a - languageName: node - linkType: hard - -"spdx-expression-parse@npm:^3.0.0": - version: 3.0.1 - resolution: "spdx-expression-parse@npm:3.0.1" - dependencies: - spdx-exceptions: "npm:^2.1.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 - languageName: node - linkType: hard - -"spdx-license-ids@npm:^3.0.0": - version: 3.0.11 - resolution: "spdx-license-ids@npm:3.0.11" - checksum: 10c0/6c53cfdb3417e80fd612341319f1296507f797e0387e144047f547c378d9d38d6032ec342de42ef7883256f6690b2fca9889979d0dd015a61dc49b323f9b379b - languageName: node - linkType: hard - -"spin.js@npm:^2.0.1": - version: 2.3.2 - resolution: "spin.js@npm:2.3.2" - checksum: 10c0/bf3ff85e8dc1491ce6ea8c0b83b559bb5d315fcb55104dd9a103b42d3bad03a7d3a1e72c6d7b32b7cc28d6f0b4fd93ed4321a41184debfa20fb71898c748e599 - languageName: node - linkType: hard - -"sprintf-js@npm:~1.0.2": - version: 1.0.3 - resolution: "sprintf-js@npm:1.0.3" - checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb - languageName: node - linkType: hard - -"ssri@npm:^13.0.0": - version: 13.0.1 - resolution: "ssri@npm:13.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/cf6408a18676c57ff2ed06b8a20dc64bb3e748e5c7e095332e6aecaa2b8422b1e94a739a8453bf65156a8a47afe23757ba4ab52d3ea3b62322dc40875763e17a - languageName: node - linkType: hard - -"ssri@npm:^5.2.4": - version: 5.3.0 - resolution: "ssri@npm:5.3.0" - dependencies: - safe-buffer: "npm:^5.1.1" - checksum: 10c0/f80372ec982cacb3d8e4b53c2a82a7f7502d915a57aef99a29e6cd293302d5944185a569df5fce694a857abb1e602585fcee90182cd2e853bae3d1c20a84d8cb - languageName: node - linkType: hard - -"stack-trace@npm:0.0.10": - version: 0.0.10 - resolution: "stack-trace@npm:0.0.10" - checksum: 10c0/9ff3dabfad4049b635a85456f927a075c9d0c210e3ea336412d18220b2a86cbb9b13ec46d6c37b70a302a4ea4d49e30e5d4944dd60ae784073f1cde778ac8f4b - languageName: node - linkType: hard - -"stream-browserify@npm:^2.0.1": - version: 2.0.2 - resolution: "stream-browserify@npm:2.0.2" - dependencies: - inherits: "npm:~2.0.1" - readable-stream: "npm:^2.0.2" - checksum: 10c0/485562bd5d962d633ae178449029c6fa2611052e356bdb5668f768544aa4daa94c4f9a97de718f3f30ad98f3cb98a5f396252bb3855aff153c138f79c0e8f6ac - languageName: node - linkType: hard - -"stream-each@npm:^1.1.0": - version: 1.2.3 - resolution: "stream-each@npm:1.2.3" - dependencies: - end-of-stream: "npm:^1.1.0" - stream-shift: "npm:^1.0.0" - checksum: 10c0/7ed229d3b7c24373058b5742b00066da8d3122d1487c8219a025ed53a8978545c77654a529a8e9c62ba83ae80c424cbb0204776b49abf72270d2e8154831dd5f - languageName: node - linkType: hard - -"stream-http@npm:^2.7.2": - version: 2.8.3 - resolution: "stream-http@npm:2.8.3" - dependencies: - builtin-status-codes: "npm:^3.0.0" - inherits: "npm:^2.0.1" - readable-stream: "npm:^2.3.6" - to-arraybuffer: "npm:^1.0.0" - xtend: "npm:^4.0.0" - checksum: 10c0/fbe7d327a29216bbabe88d3819bb8f7a502f11eeacf3212579e5af1f76fa7283f6ffa66134ab7d80928070051f571d1029e85f65ce3369fffd4c4df3669446c4 - languageName: node - linkType: hard - -"stream-shift@npm:^1.0.0": - version: 1.0.1 - resolution: "stream-shift@npm:1.0.1" - checksum: 10c0/b63a0d178cde34b920ad93e2c0c9395b840f408d36803b07c61416edac80ef9e480a51910e0ceea0d679cec90921bcd2cccab020d3a9fa6c73a98b0fbec132fd - languageName: node - linkType: hard - -"strict-uri-encode@npm:^1.0.0": - version: 1.1.0 - resolution: "strict-uri-encode@npm:1.1.0" - checksum: 10c0/eb8a4109ba2588239787389313ba58ec49e043d4c64a1d44716defe5821a68ae49abe0cdefed9946ca9fc2a4af7ecf321da92422b0a67258ec0a3638b053ae62 - languageName: node - linkType: hard - -"string-width@npm:^1.0.1": - version: 1.0.2 - resolution: "string-width@npm:1.0.2" - dependencies: - code-point-at: "npm:^1.0.0" - is-fullwidth-code-point: "npm:^1.0.0" - strip-ansi: "npm:^3.0.0" - checksum: 10c0/c558438baed23a9ab9370bb6a939acbdb2b2ffc517838d651aad0f5b2b674fb85d460d9b1d0b6a4c210dffd09e3235222d89a5bd4c0c1587f78b2bb7bc00c65e - languageName: node - linkType: hard - -"string-width@npm:^2.0.0": - version: 2.1.1 - resolution: "string-width@npm:2.1.1" - dependencies: - is-fullwidth-code-point: "npm:^2.0.0" - strip-ansi: "npm:^4.0.0" - checksum: 10c0/e5f2b169fcf8a4257a399f95d069522f056e92ec97dbdcb9b0cdf14d688b7ca0b1b1439a1c7b9773cd79446cbafd582727279d6bfdd9f8edd306ea5e90e5b610 - languageName: node - linkType: hard - -"string_decoder@npm:^1.0.0, string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: "npm:~5.2.0" - checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d - languageName: node - linkType: hard - -"string_decoder@npm:~0.10.x": - version: 0.10.31 - resolution: "string_decoder@npm:0.10.31" - checksum: 10c0/1c628d78f974aa7539c496029f48e7019acc32487fc695464f9d6bdfec98edd7d933a06b3216bc2016918f6e75074c611d84430a53cb0e43071597d6c1ac5e25 - languageName: node - linkType: hard - -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" - dependencies: - safe-buffer: "npm:~5.1.0" - checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e - languageName: node - linkType: hard - -"strip-ansi@npm:^2.0.1": - version: 2.0.1 - resolution: "strip-ansi@npm:2.0.1" - dependencies: - ansi-regex: "npm:^1.0.0" - bin: - strip-ansi: cli.js - checksum: 10c0/5517a3787f5fdb4fb621fbd13ae2688211329654a6e1415b4ba0af517adb1bc4e3a593abc40347ca0501cb68a978e25f46fb253ac369b44d25bb6f736cc48986 - languageName: node - linkType: hard - -"strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1": - version: 3.0.1 - resolution: "strip-ansi@npm:3.0.1" - dependencies: - ansi-regex: "npm:^2.0.0" - checksum: 10c0/f6e7fbe8e700105dccf7102eae20e4f03477537c74b286fd22cfc970f139002ed6f0d9c10d0e21aa9ed9245e0fa3c9275930e8795c5b947da136e4ecb644a70f - languageName: node - linkType: hard - -"strip-ansi@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-ansi@npm:4.0.0" - dependencies: - ansi-regex: "npm:^3.0.0" - checksum: 10c0/d75d9681e0637ea316ddbd7d4d3be010b1895a17e885155e0ed6a39755ae0fd7ef46e14b22162e66a62db122d3a98ab7917794e255532ab461bb0a04feb03e7d - languageName: node - linkType: hard - -"strip-bom@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-bom@npm:3.0.0" - checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 - languageName: node - linkType: hard - -"strip-eof@npm:^1.0.0": - version: 1.0.0 - resolution: "strip-eof@npm:1.0.0" - checksum: 10c0/f336beed8622f7c1dd02f2cbd8422da9208fae81daf184f73656332899978919d5c0ca84dc6cfc49ad1fc4dd7badcde5412a063cf4e0d7f8ed95a13a63f68f45 - languageName: node - linkType: hard - -"style-loader@npm:^0.23.1": - version: 0.23.1 - resolution: "style-loader@npm:0.23.1" - dependencies: - loader-utils: "npm:^1.1.0" - schema-utils: "npm:^1.0.0" - checksum: 10c0/9752920e4284e53067282f8cca68402604db152b60251525106414ceb7dedbfa5571ad544c95062006c1ff8801aa337e231e848dd3f1a8f73ec3fa680f530895 - languageName: node - linkType: hard - -"superagent@npm:^1.8.3": - version: 1.8.5 - resolution: "superagent@npm:1.8.5" - dependencies: - component-emitter: "npm:~1.2.0" - cookiejar: "npm:2.0.6" - debug: "npm:2" - extend: "npm:3.0.0" - form-data: "npm:1.0.0-rc3" - formidable: "npm:~1.0.14" - methods: "npm:~1.1.1" - mime: "npm:1.3.4" - qs: "npm:2.3.3" - readable-stream: "npm:1.0.27-1" - reduce-component: "npm:1.0.1" - checksum: 10c0/636198862a8bad386adc9fbe5f129a2617893fb79dbc007b6c7e92be9a114a7b3aed32c08adf00d286fa8726e6b5d51b8d46345a037a0066d7764b0c41bde4f9 - languageName: node - linkType: hard - -"supports-color@npm:^2.0.0": - version: 2.0.0 - resolution: "supports-color@npm:2.0.0" - checksum: 10c0/570e0b63be36cccdd25186350a6cb2eaad332a95ff162fa06d9499982315f2fe4217e69dd98e862fbcd9c81eaff300a825a1fe7bf5cc752e5b84dfed042b0dda - languageName: node - linkType: hard - -"supports-color@npm:^3.2.3": - version: 3.2.3 - resolution: "supports-color@npm:3.2.3" - dependencies: - has-flag: "npm:^1.0.0" - checksum: 10c0/d39a57dbd75c3b5740654f8ec16aaf7203b8d12b8a51314507bed590c9081120805f105b4ce741db13105e6f842ac09700e4bd665b9ffc46eb0b34ba54720bd3 - languageName: node - linkType: hard - -"supports-color@npm:^4.2.1": - version: 4.5.0 - resolution: "supports-color@npm:4.5.0" - dependencies: - has-flag: "npm:^2.0.0" - checksum: 10c0/2dc369eeac73954e87037dea1ebae0238b2abc0a39d7e35aa60eb8a84cc8d1dcade8b62e010597f5859f94c937e992abe6a6195460855fcc5e51f8cfc7fcc72a - languageName: node - linkType: hard - -"supports-color@npm:^5.3.0, supports-color@npm:^5.4.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 - languageName: node - linkType: hard - -"svgo@npm:^0.7.0": - version: 0.7.2 - resolution: "svgo@npm:0.7.2" - dependencies: - coa: "npm:~1.0.1" - colors: "npm:~1.1.2" - csso: "npm:~2.3.1" - js-yaml: "npm:~3.7.0" - mkdirp: "npm:~0.5.1" - sax: "npm:~1.2.1" - whet.extend: "npm:~0.9.9" - bin: - svgo: ./bin/svgo - checksum: 10c0/cc3314ec0227b7fd4dfcbc622b69e45ac79462a2add2c5198b863f107e4afe459e01812e668fae868b3fb02326ffbb4cd25ca7d1f2580656b14beae10eb2596c - languageName: node - linkType: hard - -"tapable@npm:^0.2.7": - version: 0.2.9 - resolution: "tapable@npm:0.2.9" - checksum: 10c0/93d0e5994621a9496112fe241784d59325684b509eb74d1abd9032802639b53ba9619db0f5db6ccdab994a5279bc4ed07b638a8a25143ba6b10603e409f314fb - languageName: node - linkType: hard - -"tar@npm:^7.5.4": - version: 7.5.12 - resolution: "tar@npm:7.5.12" - dependencies: - "@isaacs/fs-minipass": "npm:^4.0.0" - chownr: "npm:^3.0.0" - minipass: "npm:^7.1.2" - minizlib: "npm:^3.1.0" - yallist: "npm:^5.0.0" - checksum: 10c0/3825c5974f5fde792981f47ee9ffea021ee7f4b552b7ab95eeb98e5dfadfd5a5d5861f01fb772e2e5637a41980d3c019fd6cdad1be48b462b886abd7fe0fa17c - languageName: node - linkType: hard - -"through2@npm:0.6.3": - version: 0.6.3 - resolution: "through2@npm:0.6.3" - dependencies: - readable-stream: "npm:>=1.0.33-1 <1.1.0-0" - xtend: "npm:>=4.0.0 <4.1.0-0" - checksum: 10c0/5c3cd5427280d42378582fcb9c31eec15ffdcba482101c565e73715f4216eaa360d7ff339c7b29ff3a39a77a8a3f90010b390329446b10e61c5b3c59b064af75 - languageName: node - linkType: hard - -"through2@npm:^2.0.0": - version: 2.0.5 - resolution: "through2@npm:2.0.5" - dependencies: - readable-stream: "npm:~2.3.6" - xtend: "npm:~4.0.1" - checksum: 10c0/cbfe5b57943fa12b4f8c043658c2a00476216d79c014895cef1ac7a1d9a8b31f6b438d0e53eecbb81054b93128324a82ecd59ec1a4f91f01f7ac113dcb14eade - languageName: node - linkType: hard - -"timed-out@npm:4.0.1": - version: 4.0.1 - resolution: "timed-out@npm:4.0.1" - checksum: 10c0/86f03ffce5b80c5a066e02e59e411d3fbbfcf242b19290ba76817b4180abd1b85558489586b6022b798fb1cf26fc644c0ce0efb9c271d67ec83fada4b9542a56 - languageName: node - linkType: hard - -"timers-browserify@npm:^2.0.4": - version: 2.0.12 - resolution: "timers-browserify@npm:2.0.12" - dependencies: - setimmediate: "npm:^1.0.4" - checksum: 10c0/98e84db1a685bc8827c117a8bc62aac811ad56a995d07938fc7ed8cdc5bf3777bfe2d4e5da868847194e771aac3749a20f6cdd22091300fe889a76fe214a4641 - languageName: node - linkType: hard - -"tinyglobby@npm:^0.2.12": - version: 0.2.15 - resolution: "tinyglobby@npm:0.2.15" - dependencies: - fdir: "npm:^6.5.0" - picomatch: "npm:^4.0.3" - checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 - languageName: node - linkType: hard - -"to-arraybuffer@npm:^1.0.0": - version: 1.0.1 - resolution: "to-arraybuffer@npm:1.0.1" - checksum: 10c0/2460bd95524f4845a751e4f8bf9937f9f3dcd1651f104e1512868782f858f8302c1cf25bbc30794bc1b3ff65c4e135158377302f2abaff43a2d8e3c38dfe098c - languageName: node - linkType: hard - -"to-fast-properties@npm:^1.0.3": - version: 1.0.3 - resolution: "to-fast-properties@npm:1.0.3" - checksum: 10c0/78974a4f4528700d18e4c2bbf0b1fb1b19862dcc20a18dc5ed659843dea2dff4f933d167a11d3819865c1191042003aea65f7f035791af9e65d070f2e05af787 - languageName: node - linkType: hard - -"trim-right@npm:^1.0.1": - version: 1.0.1 - resolution: "trim-right@npm:1.0.1" - checksum: 10c0/71989ec179c6b42a56e03db68e60190baabf39d32d4e1252fa1501c4e478398ae29d7191beffe015b9d9dc76f04f4b3a946bdb9949ad6b0c0b0c5db65f3eb672 - languageName: node - linkType: hard - -"tslib@npm:^2.3.0": - version: 2.4.0 - resolution: "tslib@npm:2.4.0" - checksum: 10c0/eb19bda3ae545b03caea6a244b34593468e23d53b26bf8649fbc20fce43e9b21a71127fd6d2b9662c0fe48ee6ff668ead48fd00d3b88b2b716b1c12edae25b5d - languageName: node - linkType: hard - -"tty-browserify@npm:0.0.0": - version: 0.0.0 - resolution: "tty-browserify@npm:0.0.0" - checksum: 10c0/c0c68206565f1372e924d5cdeeff1a0d9cc729833f1da98c03d78be8f939e5f61a107bd0ab77d1ef6a47d62bb0e48b1081fbea273acf404959e22fd3891439c5 - languageName: node - linkType: hard - -"type@npm:^1.0.1": - version: 1.2.0 - resolution: "type@npm:1.2.0" - checksum: 10c0/444660849aaebef8cbb9bc43b28ec2068952064cfce6a646f88db97aaa2e2d6570c5629cd79238b71ba23aa3f75146a0b96e24e198210ee0089715a6f8889bf7 - languageName: node - linkType: hard - -"type@npm:^2.5.0": - version: 2.6.0 - resolution: "type@npm:2.6.0" - checksum: 10c0/d08063a1c3415140d0b6fd17ede55f373cdd6c5503776693ad5ead574a06404823374d62d6233e43bc30ec22f596b790cbb8661429bed75a75dab986b506ac60 - languageName: node - linkType: hard - -"typedarray@npm:^0.0.6": - version: 0.0.6 - resolution: "typedarray@npm:0.0.6" - checksum: 10c0/6005cb31df50eef8b1f3c780eb71a17925f3038a100d82f9406ac2ad1de5eb59f8e6decbdc145b3a1f8e5836e17b0c0002fb698b9fe2516b8f9f9ff602d36412 - languageName: node - linkType: hard - -"uglify-es@npm:^3.3.4": - version: 3.3.9 - resolution: "uglify-es@npm:3.3.9" - dependencies: - commander: "npm:~2.13.0" - source-map: "npm:~0.6.1" - bin: - uglifyjs: bin/uglifyjs - checksum: 10c0/b591de4ea2c7153f446f80f2559bbabcb4ff53a17dbfd27b9bb980b31f5fb7e563bdae6e9abc07d97ecb484ac4ceba4c7a207e6854cb2aaca72e80e6090c989e - languageName: node - linkType: hard - -"uglifyjs-webpack-plugin@npm:1.3.0": - version: 1.3.0 - resolution: "uglifyjs-webpack-plugin@npm:1.3.0" - dependencies: - cacache: "npm:^10.0.4" - find-cache-dir: "npm:^1.0.0" - schema-utils: "npm:^0.4.5" - serialize-javascript: "npm:^1.4.0" - source-map: "npm:^0.6.1" - uglify-es: "npm:^3.3.4" - webpack-sources: "npm:^1.1.0" - worker-farm: "npm:^1.5.2" - peerDependencies: - webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 - checksum: 10c0/d10ae2ac25f64afddff328fbaa58640450c099c53e44d66829681a5415ef72aa2563d1e5ed43e0e9c409db869575fd914293faaa39288e21da518084878de413 - languageName: node - linkType: hard - -"uniq@npm:^1.0.1": - version: 1.0.1 - resolution: "uniq@npm:1.0.1" - checksum: 10c0/369dca4a07fdd8de9e48378b9d4b6861722ca71d5f496e91687916bd4b48b8cf3d6db1677be1b40eea63bc6d4728efb4b4e0bd7a89c5fd2d23e7a2cff8009c7a - languageName: node - linkType: hard - -"uniqs@npm:^2.0.0": - version: 2.0.0 - resolution: "uniqs@npm:2.0.0" - checksum: 10c0/f244b158f6b3d30ddea2092c581fe9eb746d6db889a859fd0001e4b7566767bfcc53cdf11e6286f097bb130ebad71025709f41f2e4dd38e5c2f03ec28052baab - languageName: node - linkType: hard - -"unique-filename@npm:^1.1.0": - version: 1.1.1 - resolution: "unique-filename@npm:1.1.1" - dependencies: - unique-slug: "npm:^2.0.0" - checksum: 10c0/d005bdfaae6894da8407c4de2b52f38b3c58ec86e79fc2ee19939da3085374413b073478ec54e721dc8e32b102cf9e50d0481b8331abdc62202e774b789ea874 - languageName: node - linkType: hard - -"unique-slug@npm:^2.0.0": - version: 2.0.2 - resolution: "unique-slug@npm:2.0.2" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/9eabc51680cf0b8b197811a48857e41f1364b25362300c1ff636c0eca5ec543a92a38786f59cf0697e62c6f814b11ecbe64e8093db71246468a1f03b80c83970 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: "npm:^2.1.0" - checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c - languageName: node - linkType: hard - -"urijs@npm:^1.19.7": - version: 1.19.11 - resolution: "urijs@npm:1.19.11" - checksum: 10c0/96e15eea5b41a99361d506e4d8fcc64dc43f334bd5fd34e08261467b6954b97a6b45929a8d6c79e2dc76aadfd6ca950e0f4bd7f3c0757a08978429634d07eda1 - languageName: node - linkType: hard - -"url@npm:^0.11.0": - version: 0.11.0 - resolution: "url@npm:0.11.0" - dependencies: - punycode: "npm:1.3.2" - querystring: "npm:0.2.0" - checksum: 10c0/bbe05f9f570ec5c06421c50ca63f287e61279092eed0891db69a9619323703ccd3987e6eed234c468794cf25680c599680d5c1f58d26090f1956c8e9ed8346a2 - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 - languageName: node - linkType: hard - -"util@npm:0.10.3": - version: 0.10.3 - resolution: "util@npm:0.10.3" - dependencies: - inherits: "npm:2.0.1" - checksum: 10c0/88bb58fec3b1f5f43dea27795f61f24b3b505bbba6f3ad6e91b32db0cd0928b2acb54ebe21603a75743c6e21a52f954cd2ffb6cddafed5a01169dd1287db3ff3 - languageName: node - linkType: hard - -"util@npm:^0.11.0": - version: 0.11.1 - resolution: "util@npm:0.11.1" - dependencies: - inherits: "npm:2.0.3" - checksum: 10c0/8e9d1a85e661c8a8d9883d821aedbff3f8d9c3accd85357020905386ada5653b20389fc3591901e2a0bde64f8dc86b28c3f990114aa5a38eaaf30b455fa3cdf6 - languageName: node - linkType: hard - -"uuid@npm:3.3.2": - version: 3.3.2 - resolution: "uuid@npm:3.3.2" - bin: - uuid: ./bin/uuid - checksum: 10c0/847bd7b389f44d05cf5341134d52803116b616c7344f12c74040effd75280b58273ea3a2bee6ba6e5405688c5edbb0696f4adcbc89e1206dc1d8650bdaece7a6 - languageName: node - linkType: hard - -"validate-npm-package-license@npm:^3.0.1": - version: 3.0.4 - resolution: "validate-npm-package-license@npm:3.0.4" - dependencies: - spdx-correct: "npm:^3.0.0" - spdx-expression-parse: "npm:^3.0.0" - checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f - languageName: node - linkType: hard - -"vendors@npm:^1.0.0": - version: 1.0.4 - resolution: "vendors@npm:1.0.4" - checksum: 10c0/a9b097f3607013a23bf447cbaff85b79b694cc23b20e81a6aea1ea9e1c59854c93f7c87abcc71b57999e050606e499d9ce18df67968823644b20f6e03d56022a - languageName: node - linkType: hard - -"vm-browserify@npm:^1.0.1": - version: 1.1.2 - resolution: "vm-browserify@npm:1.1.2" - checksum: 10c0/0cc1af6e0d880deb58bc974921320c187f9e0a94f25570fca6b1bd64e798ce454ab87dfd797551b1b0cc1849307421aae0193cedf5f06bdb5680476780ee344b - languageName: node - linkType: hard - -"watchpack@npm:^2.3.1": - version: 2.4.0 - resolution: "watchpack@npm:2.4.0" - dependencies: - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.1.2" - checksum: 10c0/c5e35f9fb9338d31d2141d9835643c0f49b5f9c521440bb648181059e5940d93dd8ed856aa8a33fbcdd4e121dad63c7e8c15c063cf485429cd9d427be197fe62 - languageName: node - linkType: hard - -"webpack-bundle-tracker@npm:0.0.9": - version: 0.0.9 - resolution: "webpack-bundle-tracker@npm:0.0.9" - dependencies: - mkdirp: "npm:^0.5.1" - strip-ansi: "npm:^2.0.1" - checksum: 10c0/76da10a1a26deec3e3d10ac4143e9fec9434147a08572561bf00d45ba38807296ff5eb894d5595e2c4124067bcb048f9fa3622932f7f9b5c8111d2526bddb9fe - languageName: node - linkType: hard - -"webpack-sources@npm:^1.0.1, webpack-sources@npm:^1.1.0": - version: 1.4.3 - resolution: "webpack-sources@npm:1.4.3" - dependencies: - source-list-map: "npm:^2.0.0" - source-map: "npm:~0.6.1" - checksum: 10c0/78dafb3e1e297d3f4eb6204311e8c64d28cd028f82887ba33aaf03fffc82482d8e1fdf6de25a60f4dde621d3565f4c3b1bfb350f09add8f4e54e00279ff3db5e - languageName: node - linkType: hard - -"webpack@npm:3.12.0": - version: 3.12.0 - resolution: "webpack@npm:3.12.0" - dependencies: - acorn: "npm:^5.0.0" - acorn-dynamic-import: "npm:^2.0.0" - ajv: "npm:^6.1.0" - ajv-keywords: "npm:^3.1.0" - async: "npm:^2.1.2" - enhanced-resolve: "npm:^3.4.0" - escope: "npm:^3.6.0" - interpret: "npm:^1.0.0" - json-loader: "npm:^0.5.4" - json5: "npm:^0.5.1" - loader-runner: "npm:^2.3.0" - loader-utils: "npm:^1.1.0" - memory-fs: "npm:~0.4.1" - mkdirp: "npm:~0.5.0" - node-libs-browser: "npm:^2.0.0" - source-map: "npm:^0.5.3" - supports-color: "npm:^4.2.1" - tapable: "npm:^0.2.7" - uglifyjs-webpack-plugin: "npm:^0.4.6" - watchpack: "npm:^1.4.0" - webpack-sources: "npm:^1.0.1" - yargs: "npm:^8.0.2" - bin: - webpack: ./bin/webpack.js - checksum: 10c0/64051e33b94d641ea6ed85e6d33d0964ff27ce28f4dd9a989dee39ce98b67fadd057fecd2bfdf49c8fe8909c0c74e415f01381e7a105f926968b1a6eb92f5220 - languageName: node - linkType: hard - -"whet.extend@npm:~0.9.9": - version: 0.9.9 - resolution: "whet.extend@npm:0.9.9" - checksum: 10c0/75c48bfe0cdd36b7c510286d591b34a1a6810ba914b0c8f23788c2a17f4592706debaf1f1f667c7f46f1a657c4f1d5f2889ce234b570827acbb29bf28799ce7f - languageName: node - linkType: hard - -"which-module@npm:^2.0.0": - version: 2.0.0 - resolution: "which-module@npm:2.0.0" - checksum: 10c0/946ffdbcd6f0cf517638f8f2319c6d51e528c3b41bc2c0f5dc3dc46047347abd7326aea5cdf5def0a8b32bdca313ac87a32ce5a76b943fe1ca876c4557e6b716 - languageName: node - linkType: hard - -"which@npm:^1.2.9": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: "npm:^2.0.0" - bin: - which: ./bin/which - checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 - languageName: node - linkType: hard - -"which@npm:^6.0.0": - version: 6.0.1 - resolution: "which@npm:6.0.1" - dependencies: - isexe: "npm:^4.0.0" - bin: - node-which: bin/which.js - checksum: 10c0/7e710e54ea36d2d6183bee2f9caa27a3b47b9baf8dee55a199b736fcf85eab3b9df7556fca3d02b50af7f3dfba5ea3a45644189836df06267df457e354da66d5 - languageName: node - linkType: hard - -"worker-farm@npm:^1.5.2": - version: 1.7.0 - resolution: "worker-farm@npm:1.7.0" - dependencies: - errno: "npm:~0.1.7" - checksum: 10c0/069a032f9198a07273a7608dc0c23d7288c1c25256b66008e1ae95838cda6fa2c7aefb3b7ba760f975c8d18120ca54eb193afb66d7237b2a05e5da12c1c961f7 - languageName: node - linkType: hard - -"wrap-ansi@npm:^2.0.0": - version: 2.1.0 - resolution: "wrap-ansi@npm:2.1.0" - dependencies: - string-width: "npm:^1.0.1" - strip-ansi: "npm:^3.0.1" - checksum: 10c0/1a47367eef192fc9ecaf00238bad5de8987c3368082b619ab36c5e2d6d7b0a2aef95a2ca65840be598c56ced5090a3ba487956c7aee0cac7c45017502fa980fb - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 - languageName: node - linkType: hard - -"xtend@npm:>=4.0.0 <4.1.0-0, xtend@npm:^4.0.0, xtend@npm:~4.0.1": - version: 4.0.2 - resolution: "xtend@npm:4.0.2" - checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e - languageName: node - linkType: hard - -"y18n@npm:^3.2.1": - version: 3.2.2 - resolution: "y18n@npm:3.2.2" - checksum: 10c0/08dc1880f6f766057ed25cd61ef0c7dab3db93639db9a7487a84f75dac7a349dface8dff8d1d8b7bdf50969fcd69ab858ab26b06968b4e4b12ee60d195233c46 - languageName: node - linkType: hard - -"y18n@npm:^4.0.0": - version: 4.0.3 - resolution: "y18n@npm:4.0.3" - checksum: 10c0/308a2efd7cc296ab2c0f3b9284fd4827be01cfeb647b3ba18230e3a416eb1bc887ac050de9f8c4fd9e7856b2e8246e05d190b53c96c5ad8d8cb56dffb6f81024 - languageName: node - linkType: hard - -"yallist@npm:^2.1.2": - version: 2.1.2 - resolution: "yallist@npm:2.1.2" - checksum: 10c0/0b9e25aa00adf19e01d2bcd4b208aee2b0db643d9927131797b7af5ff69480fc80f1c3db738cbf3946f0bddf39d8f2d0a5709c644fd42d4aa3a4e6e786c087b5 - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a - languageName: node - linkType: hard - -"yallist@npm:^5.0.0": - version: 5.0.0 - resolution: "yallist@npm:5.0.0" - checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 - languageName: node - linkType: hard - -"yargs-parser@npm:^7.0.0": - version: 7.0.0 - resolution: "yargs-parser@npm:7.0.0" - dependencies: - camelcase: "npm:^4.1.0" - checksum: 10c0/6fde2df522dd071cf76308fe4e37fd2fb8eae3eb1fb6c6759c2d448264c8451162649eb8558ac8d83aff79278cabfddc17ecba3e1a0d0fe2e406cf4e1bc95b0d - languageName: node - linkType: hard - -"yargs@npm:^8.0.2": - version: 8.0.2 - resolution: "yargs@npm:8.0.2" - dependencies: - camelcase: "npm:^4.1.0" - cliui: "npm:^3.2.0" - decamelize: "npm:^1.1.1" - get-caller-file: "npm:^1.0.1" - os-locale: "npm:^2.0.0" - read-pkg-up: "npm:^2.0.0" - require-directory: "npm:^2.1.1" - require-main-filename: "npm:^1.0.1" - set-blocking: "npm:^2.0.0" - string-width: "npm:^2.0.0" - which-module: "npm:^2.0.0" - y18n: "npm:^3.2.1" - yargs-parser: "npm:^7.0.0" - checksum: 10c0/70e4ed99e3f1e8a034d0b600773db9fb44e03ec88cfa7125fc65a965428051ad59e77c074afa1afcbe3ec34436d3a6e7ba18b3ec62b4e5f59f30606df791b125 - languageName: node - linkType: hard +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +JSON2@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/JSON2/-/JSON2-0.1.0.tgz#8d7493040a63d5835af75f47decb83ab6c8c0790" + integrity sha512-MRguCg79vy8Kx15/CXzoO5pEPi0tQq7T70mL/t1Hv3G+hVfJVO2BZqX3sl2kbWW08GAmzQYSRfWRtQhmK/eaYA== + +acorn-dynamic-import@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" + integrity sha512-GKp5tQ8h0KMPWIYGRHHXI1s5tUpZixZ3IHF2jAu42wSCf6In/G873s6/y4DdKdhWvzhu1T6mE1JgvnhAKqyYYQ== + dependencies: + acorn "^4.0.3" + +acorn@^4.0.3: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + integrity sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug== + +acorn@^5.0.0: + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.1.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.14.0.tgz#fd067713e228210636ebb08c60bd3765d6dbe73a" + integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ== + +ansi-regex@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-1.1.1.tgz#41c847194646375e6a1a5d10c3ca054ef9fc980d" + integrity sha512-q5i8bFLg2wDfsuR56c1NzlJFPzVD+9mxhDrhqOGigEFa87OZHlF+9dWeGWzVTP/0ECiA/JUGzfzRr2t3eYORRw== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +asn1.js@^4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +assert@^1.1.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.1.tgz#038ab248e4ff078e7bc2485ba6e6388466c78f76" + integrity sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A== + dependencies: + object.assign "^4.1.4" + util "^0.10.4" + +async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + +async@^2.1.2: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + +autoprefixer@^6.3.1: + version "6.7.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" + integrity sha512-WKExI/eSGgGAkWAO+wMVdFObZV7hQen54UpD1kCCTN3tvlL3W1jL4+lPP/M7MwoP7Q4RHzKtO3JQ4HxYEcd+xQ== + dependencies: + browserslist "^1.7.6" + caniuse-db "^1.0.30000634" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^5.2.16" + postcss-value-parser "^3.2.3" + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g== + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.0.0, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ== + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-loader@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca" + integrity sha512-hHvbCsXtwKIznu5Qmqfe/IwZ4O5frqe+j04fN/5u/9Rg48dpWIKyYqAN68N1wwqGSMToo4FhU9/MrH+QZlFdkQ== + dependencies: + find-cache-dir "^0.1.1" + loader-utils "^0.2.16" + mkdirp "^0.5.1" + object-assign "^4.0.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w== + dependencies: + babel-runtime "^6.22.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A== + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg== + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA== + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g== + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +balanced-match@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + integrity sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +bluebird@^3.5.1: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.3.tgz#2cc2c679188eb35b006f2d0d4710bed8437a769e" + integrity sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g== + +bn.js@^5.2.1, bn.js@^5.2.2: + version "5.2.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.3.tgz#16a9e409616b23fef3ccbedb8d42f13bff80295e" + integrity sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w== + +bootstrap-colorpicker@^2.5.2: + version "2.5.3" + resolved "https://registry.yarnpkg.com/bootstrap-colorpicker/-/bootstrap-colorpicker-2.5.3.tgz#b50aff8590fbaa6b5aa63a5624e4213f1659a49d" + integrity sha512-xdllX8LSMvKULs3b8JrgRXTvyvjkSMHHHVuHjjN5FNMqr6kRe5NPiMHFmeAFjlgDF73MspikudLuEwR28LbzLw== + dependencies: + jquery ">=1.10" + +bootstrap-tagsinput@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/bootstrap-tagsinput/-/bootstrap-tagsinput-0.7.1.tgz#ffe3b06bbe2a106945ef2814568005a94f211937" + integrity sha512-xSks67GWgXLnmO5gqp788vhh7WoXd9mHj5uKE5zg8rvw3sNYYSCjrSlrPRlPdpYKwmuxeuf2jsNjBSWEucyB1w== + +bower@^1.3.12: + version "1.8.14" + resolved "https://registry.yarnpkg.com/bower/-/bower-1.8.14.tgz#985722a3c1fcd35c93d4136ecbeafbeaaea74e86" + integrity sha512-8Rq058FD91q9Nwthyhw0la9fzpBz0iwZTrt51LWl+w+PnJgZk9J+5wp3nibsJcIUPglMYXr4NRBaR+TUj0OkBQ== + +brace-expansion@^1.1.7: + version "1.1.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browserify-aes@^1.0.4, browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.1.tgz#06e530907fe2949dc21fc3c2e2302e10b1437238" + integrity sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ== + dependencies: + bn.js "^5.2.1" + randombytes "^2.1.0" + safe-buffer "^5.2.1" + +browserify-sign@^4.2.3: + version "4.2.5" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.5.tgz#3979269fa8af55ba18aac35deef11b45515cd27d" + integrity sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw== + dependencies: + bn.js "^5.2.2" + browserify-rsa "^4.1.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.6.1" + inherits "^2.0.4" + parse-asn1 "^5.1.9" + readable-stream "^2.3.8" + safe-buffer "^5.2.1" + +browserify-versionify@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/browserify-versionify/-/browserify-versionify-1.0.3.tgz#927eaaf85f16fe8d8d59eb1c6da76b488c01406c" + integrity sha512-QJ6s79FZWcKlYptoyd1K5/m+hYuVN8aW8k5b5Z7U9GhL8lR9YrAtADftcSeBJOeltjqfr2JlmtU3FfS+GU/cXQ== + dependencies: + find-root "^0.1.1" + through2 "0.6.3" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: + version "1.7.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" + integrity sha512-qHJblDE2bXVRYzuDetv/wAeHOJyO97+9wxC1cdCtyzgNuSozOyRCiiLaCR1f71AN66lQdVVBipWm63V+a7bPOw== + dependencies: + caniuse-db "^1.0.30000639" + electron-to-chromium "^1.2.7" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + +cacache@^10.0.4: + version "10.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA== + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" + +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== + +caniuse-api@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" + integrity sha512-SBTl70K0PkDUIebbkXrxWqZlHNs0wRgRD6QZ8guctShjbh63gEPfF+Wj0Yw+75f5Y8tSzqAI/NcisYv/cCah2Q== + dependencies: + browserslist "^1.3.6" + caniuse-db "^1.0.30000529" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: + version "1.0.30001781" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001781.tgz#7bc16b681ec25e23bd8b2e02067b9cede707c778" + integrity sha512-gNw4Hl6IfkgyGMNzgGRWrnalOUASAYFiCFywQemHI9OU16PC6TRRhHEnR7taYC2/Mad/nDLkzXAEtejGuNsUfg== + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +charenc@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== + +chownr@^1.0.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.7.tgz#bd094bfef42634ccfd9e13b9fc73274997111e39" + integrity sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + to-buffer "^1.2.2" + +clap@^1.0.9: + version "1.2.3" + resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" + integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA== + dependencies: + chalk "^1.1.3" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +coa@~1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" + integrity sha512-KAGck/eNAmCL0dcT3BiuYwLbExK6lduR8DxM3C1TyDzaXhZHyZ8ooX5I5+na2e3dPFuibfxrGdorr0/Lr7RYCQ== + dependencies: + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + +color-convert@^1.3.0, color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" + integrity sha512-sz29j1bmSDfoAxKIEU6zwoIZXN6BrFbAMIhfYCNyiZXBDuU/aiHlN84lp/xDzL2ubyFhLDobHIlU1X70XRrMDA== + dependencies: + color-name "^1.0.0" + +color@^0.11.0: + version "0.11.4" + resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" + integrity sha512-Ajpjd8asqZ6EdxQeqGzU5WBhhTfJ/0cA4Wlbre7e5vXfmDSmda7Ov6jeKoru+b0vHcb1CqvuroTHp5zIWzhVMA== + dependencies: + clone "^1.0.2" + color-convert "^1.3.0" + color-string "^0.3.0" + +colormin@^1.0.5: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" + integrity sha512-XSEQUUQUR/lXqGyddiNH3XYFUPYlYr1vXy9rTFMsSOw+J7Q6EQkdlQIrTlYn4TccpsOaUE1PYQNjBn20gwCdgQ== + dependencies: + color "^0.11.0" + css-color-names "0.0.4" + has "^1.0.1" + +colors@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + integrity sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w== + +combined-stream@^1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +component-emitter@^1.1.3: + version "1.3.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" + integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== + +component-emitter@~1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== + +convert-source-map@^1.5.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw== + +cookiejar@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.0.6.tgz#0abf356ad00d1c5a219d88d44518046dd026acfe" + integrity sha512-X9IsySmsr1heROBZCpyEYhqJyU7CXNJoVxIlQ5bBb7DskYUx0mQ+g2f7yPYajceZeGJWHQbIfGB6j0hywV/ARQ== + +copy-anything@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-3.0.5.tgz#2d92dce8c498f790fa7ad16b01a1ae5a45b020a0" + integrity sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w== + dependencies: + is-what "^4.1.8" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +create-ecdh@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +crypt@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== + +crypto-browserify@^3.11.0: + version "3.12.1" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.1.tgz#bb8921bec9acc81633379aa8f52d69b0b69e0dac" + integrity sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ== + dependencies: + browserify-cipher "^1.0.1" + browserify-sign "^4.2.3" + create-ecdh "^4.0.4" + create-hash "^1.2.0" + create-hmac "^1.1.7" + diffie-hellman "^5.0.3" + hash-base "~3.0.4" + inherits "^2.0.4" + pbkdf2 "^3.1.2" + public-encrypt "^4.0.3" + randombytes "^2.1.0" + randomfill "^1.0.4" + +css-color-names@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q== + +css-loader@^0.28.11, css-loader@~0.26.1: + version "0.28.11" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" + integrity sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg== + dependencies: + babel-code-frame "^6.26.0" + css-selector-tokenizer "^0.7.0" + cssnano "^3.10.0" + icss-utils "^2.1.0" + loader-utils "^1.0.2" + lodash.camelcase "^4.3.0" + object-assign "^4.1.1" + postcss "^5.0.6" + postcss-modules-extract-imports "^1.2.0" + postcss-modules-local-by-default "^1.2.0" + postcss-modules-scope "^1.1.0" + postcss-modules-values "^1.3.0" + postcss-value-parser "^3.3.0" + source-list-map "^2.0.0" + +css-selector-tokenizer@^0.7.0: + version "0.7.3" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" + integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg== + dependencies: + cssesc "^3.0.0" + fastparse "^1.1.2" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" + integrity sha512-0o0IMQE0Ezo4b41Yrm8U6Rp9/Ag81vNXY1gZMnT1XhO4DpjEf2utKERqWJbOoz3g1Wdc1d3QSta/cIuJ1wSTEg== + dependencies: + autoprefixer "^6.3.1" + decamelize "^1.1.2" + defined "^1.0.0" + has "^1.0.1" + object-assign "^4.0.1" + postcss "^5.0.14" + postcss-calc "^5.2.0" + postcss-colormin "^2.1.8" + postcss-convert-values "^2.3.4" + postcss-discard-comments "^2.0.4" + postcss-discard-duplicates "^2.0.1" + postcss-discard-empty "^2.0.1" + postcss-discard-overridden "^0.1.1" + postcss-discard-unused "^2.2.1" + postcss-filter-plugins "^2.0.0" + postcss-merge-idents "^2.1.5" + postcss-merge-longhand "^2.0.1" + postcss-merge-rules "^2.0.3" + postcss-minify-font-values "^1.0.2" + postcss-minify-gradients "^1.0.1" + postcss-minify-params "^1.0.4" + postcss-minify-selectors "^2.0.4" + postcss-normalize-charset "^1.1.0" + postcss-normalize-url "^3.0.7" + postcss-ordered-values "^2.1.0" + postcss-reduce-idents "^2.2.2" + postcss-reduce-initial "^1.0.0" + postcss-reduce-transforms "^1.0.3" + postcss-svgo "^2.1.1" + postcss-unique-selectors "^2.0.2" + postcss-value-parser "^3.2.3" + postcss-zindex "^2.0.1" + +csso@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" + integrity sha512-FmCI/hmqDeHHLaIQckMhMZneS84yzUZdrWDAvJVVxOwcKE1P1LF9FGmzr1ktIQSxOw6fl3PaQsmfg+GN+VvR3w== + dependencies: + clap "^1.0.9" + source-map "^0.5.3" + +cyclist@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.2.tgz#673b5f233bf34d8e602b949429f8171d9121bea3" + integrity sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA== + +d@1, d@^1.0.1, d@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de" + integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== + dependencies: + es5-ext "^0.10.64" + type "^2.7.2" + +debug@2, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +defined@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A== + dependencies: + repeating "^2.0.0" + +diffie-hellman@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domready@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/domready/-/domready-0.3.0.tgz#b3740facbd09163018152d12aec239383e102175" + integrity sha512-0w07yqKSi2caAo0qESL8Ou+ZkDfOrzxyJzSvJEdKmjOzPobPo7d4QFxpLjrq8zmigWP2mh2i/5F53NKSkPIqbA== + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +electron-to-chromium@^1.2.7: + version "1.5.321" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz#57a80554e2e7fd65e3689d320f52a64723472d5d" + integrity sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ== + +elliptic@^6.5.3, elliptic@^6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" + integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== + dependencies: + once "^1.4.0" + +enhanced-resolve@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" + integrity sha512-ZaAux1rigq1e2nQrztHn4h2ugvpzZxs64qneNah+8Mh/K0CRqJFJc+UoXnUsq+1yX+DmQFPPdVqboKAJ89e0Iw== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + object-assign "^4.0.1" + tapable "^0.2.7" + +errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414" + integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== + dependencies: + is-arrayish "^0.2.1" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14: + version "0.10.64" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714" + integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + esniff "^2.0.1" + next-tick "^1.1.0" + +es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + integrity sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A== + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-set@~0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.6.tgz#5669e3b2aa01d61a50ba79964f733673574983b8" + integrity sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw== + dependencies: + d "^1.0.1" + es5-ext "^0.10.62" + es6-iterator "~2.0.3" + es6-symbol "^3.1.3" + event-emitter "^0.3.5" + type "^2.7.2" + +es6-symbol@^3.1.1, es6-symbol@^3.1.3, es6-symbol@~3.1.1: + version "3.1.4" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c" + integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg== + dependencies: + d "^1.0.2" + ext "^1.7.0" + +es6-weak-map@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + integrity sha512-75IUQsusDdalQEW/G/2esa87J7raqdJF+Ca0/Xm5C3Q58Nr4yVYjZGp/P1+2xiEVgXRrA39dpRb8LcshajbqDQ== + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esniff@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308" + integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== + dependencies: + d "^1.0.1" + es5-ext "^0.10.62" + event-emitter "^0.3.5" + type "^2.7.2" + +esprima@^2.6.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== + +esrecurse@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +event-emitter@^0.3.5, event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== + dependencies: + d "1" + es5-ext "~0.10.14" + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw== + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +ext@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + +extend@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + integrity sha512-5mYyg57hpD+sFaJmgNL9BidQ5C7dmJE3U5vzlRWbuqG+8dytvYEoxvKs6Tj5cm3LpMsFvRt20qz1ckezmsOUgQ== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastparse@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity sha512-Z9XSBoNE7xQiV6MSgPuCfyMokH2K7JdpRkOYE1+mu3d4BFJtx3GW+f6Bo4q8IX6rlf5MYbLBKW0pjl2cWdkm2A== + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + integrity sha512-46TFiBOzX7xq/PcSWfFwkyjpemdRnMe31UQF+os0y+1W3k95f6R4SEt02Hj4p3X0Mir9gfrkmOtshFidS0VPUg== + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + +find-root@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-0.1.2.tgz#98d2267cff1916ccaf2743b3a0eea81d79d7dcd1" + integrity sha512-GyDxVgA61TZcrgDJPqOqGBpi80Uf2yIstubgizi7AjC9yPdRrqBR+Y0MvK4kXnYlaoz3d+SGxDHMYVkwI/yd2w== + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +font-awesome-webpack@0.0.5-beta.2: + version "0.0.5-beta.2" + resolved "https://registry.yarnpkg.com/font-awesome-webpack/-/font-awesome-webpack-0.0.5-beta.2.tgz#9ea5f22f0615d08e76d8db341563649a726286d6" + integrity sha512-er4SI8BEy7gwq360+H0/s00IqekBuyOYgr5on3wG7/Kj9SQa8D3LJ87aj8zXTTyp+qswHtbWl5gye/ZhYJdrYQ== + dependencies: + css-loader "~0.26.1" + less-loader "~2.2.3" + style-loader "~0.13.1" + +font-awesome@^4.5.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" + integrity sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg== + +for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + +form-data@1.0.0-rc3: + version "1.0.0-rc3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.0-rc3.tgz#d35bc62e7fbc2937ae78f948aaa0d38d90607577" + integrity sha512-Z5JWXWsFDI8x73Rt/Dc7SK/EvKBzudhqIVBtEhcAhtoevCTqO3YJmctGBLzT0Ggg39xFcefkXt00t1TYLz6D0w== + dependencies: + async "^1.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.3" + +formidable@~1.0.14: + version "1.0.17" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.17.tgz#ef5491490f9433b705faa77249c99029ae348559" + integrity sha512-95MFT5qipMvUiesmuvGP1BI4hh5XWCzyTapiNJ/k8JBQda7rPy7UCWYItz2uZEdTgGNy1eInjzlL9Wx1O9fedg== + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA== + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.2, glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@^4.1.11, graceful-fs@^4.1.2: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +has@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== + +hash-base@^3.0.0, hash-base@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.2.tgz#79d72def7611c3f6e3c3b5730652638001b10a74" + integrity sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg== + dependencies: + inherits "^2.0.4" + readable-stream "^2.3.8" + safe-buffer "^5.2.1" + to-buffer "^1.2.1" + +hash-base@~3.0.4: + version "3.0.5" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.5.tgz#52480e285395cf7fba17dc4c9e47acdc7f248a8a" + integrity sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== + +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg== + +icss-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + integrity sha512-bsVoyn/1V4R1kYYjLcWLedozAM4FClZUdjE9nIr8uWY7xs78y9DATgwz2wGU7M+7z55KenmmTkN2DVJ7bqzjAA== + dependencies: + postcss "^6.0.1" + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-buffer@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.16.1: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-svg@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" + integrity sha512-Ya1giYJUkcL/94quj0+XGcmts6cETPBW1MiFz1ReJrnDJ680F52qpAEGAEGU0nq96FRGIGPx6Yo1CyPXcOoyGw== + dependencies: + html-comment-regex "^1.1.0" + +is-typed-array@^1.1.14: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-what@^4.1.8: + version "4.1.16" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.16.tgz#1ad860a19da8b4895ad5495da3182ce2acdd7a6f" + integrity sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jquery-datetimepicker@^2.5.21: + version "2.5.21" + resolved "https://registry.yarnpkg.com/jquery-datetimepicker/-/jquery-datetimepicker-2.5.21.tgz#00c388a78df2732fedfdb5c6529b6e84d53e0235" + integrity sha512-wDTpZ4f1PWd1XGaIIE0n6jLynlm+akBJ7/NjaB1bk2UJSS593CHJPZ3+FNEXoyvNVUeBlBC0oX6WTfCyfUhX/w== + dependencies: + jquery ">= 1.7.2" + jquery-mousewheel ">= 3.1.13" + php-date-formatter "^1.3.4" + +"jquery-mousewheel@>= 3.1.13": + version "3.2.2" + resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.2.2.tgz#48c833f6260ee0c46d438a999e7d0060ec9eed0b" + integrity sha512-JP71xTAg08ZY3hcs9ZbYUZ5i+dkSsz4yRl/zpWkAmtzc+kMs5EfPkpkINSidiLYMaR0MTo3DfFGF9WIezMsFQQ== + dependencies: + jquery ">=1.2.6" + +"jquery@>= 1.7.2", jquery@>=1.10, jquery@>=1.2.6: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-4.0.0.tgz#95c33ac29005ff72ec444c5ba1cf457e61404fbb" + integrity sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg== + +js-base64@^2.1.9: + version "2.6.4" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" + integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== + +js-yaml@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + integrity sha512-eIlkGty7HGmntbV6P/ZlAsoncFLGsNoM27lkTzS+oneY/EiNhj+geqD9ezg/ip+SW6Var0BJU2JtV0vEUZpWVQ== + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA== + +json-loader@^0.5.1, json-loader@^0.5.4: + version "0.5.7" + resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" + integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json3@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^0.5.0, json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw== + +json5@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +keen-js@^3.0.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/keen-js/-/keen-js-3.5.0.tgz#9274be9bb9ee1a92867872acb3627f5aa8147b79" + integrity sha512-lB/JZ/KfF+EL8xoUEJgGUv7adBQiQ4Q8PLI22Lzl00GqX47UmjyWnY8GETfUML5gjNxl0uqGHx2kXu0jzHHFKQ== + dependencies: + JSON2 "^0.1.0" + browserify-versionify "1.0.3" + component-emitter "^1.1.3" + domready "0.3.0" + json3 "^3.3.2" + spin.js "^2.0.1" + superagent "^1.8.3" + +klona@^2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + +knockout@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/knockout/-/knockout-3.5.1.tgz#62c81e81843bea2008fd23c575edd9ca978e75cf" + integrity sha512-wRJ9I4az0QcsH7A4v4l0enUpkS++MBx0BnL/68KaLzJg7x1qmbjSlwEoCNol7KTYZ+pmtI7Eh2J0Nu6/2Z5J/Q== + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== + dependencies: + invert-kv "^1.0.0" + +less-loader@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-10.2.0.tgz#97286d8797dc3dc05b1d16b0ecec5f968bdd4e32" + integrity sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg== + dependencies: + klona "^2.0.4" + +less-loader@~2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-2.2.3.tgz#b6d8f8139c8493df09d992a93a00734b08f84528" + integrity sha512-U7lgRusyqTj1TUB6OBlmow6GigLk0n5ADuTSGblCp0nkXOk+lFq/lHTDXCHkm3WydZha2FVNZivEjCEZNFJCiw== + dependencies: + loader-utils "^0.2.5" + +less@^4.1.2: + version "4.6.4" + resolved "https://registry.yarnpkg.com/less/-/less-4.6.4.tgz#3ff8068e6c8a59f1ece8a6b9227bda28c1ed68a2" + integrity sha512-OJmO5+HxZLLw0RLzkqaNHzcgEAQG7C0y3aMbwtCzIUFZsLMNNq/1IdAdHEycQ58CwUO3jPTHmoN+tE5I7FQxNg== + dependencies: + copy-anything "^3.0.5" + parse-node-version "^1.0.1" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^3.1.0" + source-map "~0.6.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ== + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@^0.2.16, loader-utils@^0.2.5: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + integrity sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug== + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.14, lodash@^4.17.4: + version "4.17.23" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a" + integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^4.0.1, lru-cache@^4.1.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +math-expression-evaluator@^1.2.14: + version "1.4.0" + resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.4.0.tgz#3d66031117fbb7b9715ea6c9c68c2cd2eebd37e2" + integrity sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +md5@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" + integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== + dependencies: + charenc "0.0.2" + crypt "0.0.2" + is-buffer "~1.1.6" + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ== + dependencies: + mimic-fn "^1.0.0" + +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +methods@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.3: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + integrity sha512-sAaYXszED5ALBt665F0wMQCUXpGuZsGdopoqcHPdL39ZYdi7uHoZlhrfZfhv8WzivhBzr/oXwaj+yiK5wY8MXQ== + +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ== + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +needle@^3.1.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-3.5.0.tgz#aa2023642cb41b11a11babb733fd8fa952919112" + integrity sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w== + dependencies: + iconv-lite "^0.6.3" + sax "^1.2.4" + +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +node-libs-browser@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^1.4.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ== + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parse-asn1@^5.0.0, parse-asn1@^5.1.9: + version "5.1.9" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.9.tgz#8dd24c3ea8da77dffbc708d94eaf232fd6156e95" + integrity sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg== + dependencies: + asn1.js "^4.10.1" + browserify-aes "^1.2.0" + evp_bytestokey "^1.0.3" + pbkdf2 "^3.1.5" + safe-buffer "^5.2.1" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== + dependencies: + error-ex "^1.2.0" + +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ== + dependencies: + pify "^2.0.0" + +pbkdf2@^3.1.2, pbkdf2@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.5.tgz#444a59d7a259a95536c56e80c89de31cc01ed366" + integrity sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ== + dependencies: + create-hash "^1.2.0" + create-hmac "^1.1.7" + ripemd160 "^2.0.3" + safe-buffer "^5.2.1" + sha.js "^2.4.12" + to-buffer "^1.2.1" + +php-date-formatter@^1.3.4: + version "1.3.7" + resolved "https://registry.yarnpkg.com/php-date-formatter/-/php-date-formatter-1.3.7.tgz#915cb587674c5b3ab69884b22a59aedb9c89902d" + integrity sha512-pmHAp3AGz5Ih+TuEJQkmilkB8qWkKYQpnOn93VHzloQQvPFaDqd9vkMOJbLMw2avU6R4/7uPIlfI3A4isvhM3A== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha512-c6pv3OE78mcZ92ckebVDqg0aWSoKhOTbwCV6qbCWMk546mAL9pZln0+QsN/yQ7fkucd4+yJPLrCBXNt8Ruk+Eg== + dependencies: + find-up "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw== + dependencies: + find-up "^2.1.0" + +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + +postcss-calc@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" + integrity sha512-iBcptYFq+QUh9gzP7ta2btw50o40s4uLI4UDVgd5yRAZtUDWc5APdl5yQDd2h/TyiZNbJrv0HiYhT102CMgN7Q== + dependencies: + postcss "^5.0.2" + postcss-message-helpers "^2.0.0" + reduce-css-calc "^1.2.6" + +postcss-colormin@^2.1.8: + version "2.2.2" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" + integrity sha512-XXitQe+jNNPf+vxvQXIQ1+pvdQKWKgkx8zlJNltcMEmLma1ypDRDQwlLt+6cP26fBreihNhZxohh1rcgCH2W5w== + dependencies: + colormin "^1.0.5" + postcss "^5.0.13" + postcss-value-parser "^3.2.3" + +postcss-convert-values@^2.3.4: + version "2.6.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" + integrity sha512-SE7mf25D3ORUEXpu3WUqQqy0nCbMuM5BEny+ULE/FXdS/0UMA58OdzwvzuHJRpIFlk1uojt16JhaEogtP6W2oA== + dependencies: + postcss "^5.0.11" + postcss-value-parser "^3.1.2" + +postcss-discard-comments@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" + integrity sha512-yGbyBDo5FxsImE90LD8C87vgnNlweQkODMkUZlDVM/CBgLr9C5RasLGJxxh9GjVOBeG8NcCMatoqI1pXg8JNXg== + dependencies: + postcss "^5.0.14" + +postcss-discard-duplicates@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" + integrity sha512-+lk5W1uqO8qIUTET+UETgj9GWykLC3LOldr7EehmymV0Wu36kyoHimC4cILrAAYpHQ+fr4ypKcWcVNaGzm0reA== + dependencies: + postcss "^5.0.4" + +postcss-discard-empty@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" + integrity sha512-IBFoyrwk52dhF+5z/ZAbzq5Jy7Wq0aLUsOn69JNS+7YeuyHaNzJwBIYE0QlUH/p5d3L+OON72Fsexyb7OK/3og== + dependencies: + postcss "^5.0.14" + +postcss-discard-overridden@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" + integrity sha512-IyKoDL8QNObOiUc6eBw8kMxBHCfxUaERYTUe2QF8k7j/xiirayDzzkmlR6lMQjrAM1p1DDRTvWrS7Aa8lp6/uA== + dependencies: + postcss "^5.0.16" + +postcss-discard-unused@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" + integrity sha512-nCbFNfqYAbKCw9J6PSJubpN9asnrwVLkRDFc4KCwyUEdOtM5XDE/eTW3OpqHrYY1L4fZxgan7LLRAAYYBzwzrg== + dependencies: + postcss "^5.0.14" + uniqs "^2.0.0" + +postcss-filter-plugins@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" + integrity sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ== + dependencies: + postcss "^5.0.4" + +postcss-merge-idents@^2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + integrity sha512-9DHmfCZ7/hNHhIKnNkz4CU0ejtGen5BbTRJc13Z2uHfCedeCUsK2WEQoAJRBL+phs68iWK6Qf8Jze71anuysWA== + dependencies: + has "^1.0.1" + postcss "^5.0.10" + postcss-value-parser "^3.1.1" + +postcss-merge-longhand@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" + integrity sha512-ma7YvxjdLQdifnc1HFsW/AW6fVfubGyR+X4bE3FOSdBVMY9bZjKVdklHT+odknKBB7FSCfKIHC3yHK7RUAqRPg== + dependencies: + postcss "^5.0.4" + +postcss-merge-rules@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" + integrity sha512-Wgg2FS6W3AYBl+5L9poL6ZUISi5YzL+sDCJfM7zNw/Q1qsyVQXXZ2cbVui6mu2cYJpt1hOKCGj1xA4mq/obz/Q== + dependencies: + browserslist "^1.5.2" + caniuse-api "^1.5.2" + postcss "^5.0.4" + postcss-selector-parser "^2.2.2" + vendors "^1.0.0" + +postcss-message-helpers@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" + integrity sha512-tPLZzVAiIJp46TBbpXtrUAKqedXSyW5xDEo1sikrfEfnTs+49SBZR/xDdqCiJvSSbtr615xDsaMF3RrxS2jZlA== + +postcss-minify-font-values@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" + integrity sha512-vFSPzrJhNe6/8McOLU13XIsERohBJiIFFuC1PolgajOZdRWqRgKITP/A4Z/n4GQhEmtbxmO9NDw3QLaFfE1dFQ== + dependencies: + object-assign "^4.0.1" + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-minify-gradients@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" + integrity sha512-DZhT0OE+RbVqVyGsTIKx84rU/5cury1jmwPa19bViqYPQu499ZU831yMzzsyC8EhiZVd73+h5Z9xb/DdaBpw7Q== + dependencies: + postcss "^5.0.12" + postcss-value-parser "^3.3.0" + +postcss-minify-params@^1.0.4: + version "1.2.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" + integrity sha512-hhJdMVgP8vasrHbkKAk+ab28vEmPYgyuDzRl31V3BEB3QOR3L5TTIVEWLDNnZZ3+fiTi9d6Ker8GM8S1h8p2Ow== + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.2" + postcss-value-parser "^3.0.2" + uniqs "^2.0.0" + +postcss-minify-selectors@^2.0.4: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" + integrity sha512-e13vxPBSo3ZaPne43KVgM+UETkx3Bs4/Qvm6yXI9HQpQp4nyb7HZ0gKpkF+Wn2x+/dbQ+swNpCdZSbMOT7+TIA== + dependencies: + alphanum-sort "^1.0.2" + has "^1.0.1" + postcss "^5.0.14" + postcss-selector-parser "^2.0.0" + +postcss-modules-extract-imports@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a" + integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw== + dependencies: + postcss "^6.0.1" + +postcss-modules-local-by-default@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + integrity sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA== + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-scope@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + integrity sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw== + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-values@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + integrity sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA== + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + +postcss-normalize-charset@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" + integrity sha512-RKgjEks83l8w4yEhztOwNZ+nLSrJ+NvPNhpS+mVDzoaiRHZQVoG7NF2TP5qjwnaN9YswUhj6m1E0S0Z+WDCgEQ== + dependencies: + postcss "^5.0.5" + +postcss-normalize-url@^3.0.7: + version "3.0.8" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" + integrity sha512-WqtWG6GV2nELsQEFES0RzfL2ebVwmGl/M8VmMbshKto/UClBo+mznX8Zi4/hkThdqx7ijwv+O8HWPdpK7nH/Ig== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^1.4.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + +postcss-ordered-values@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" + integrity sha512-5RB1IUZhkxDCfa5fx/ogp/A82mtq+r7USqS+7zt0e428HJ7+BHCxyeY39ClmkkUtxdOd3mk8gD6d9bjH2BECMg== + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.1" + +postcss-reduce-idents@^2.2.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" + integrity sha512-0+Ow9e8JLtffjumJJFPqvN4qAvokVbdQPnijUDSOX8tfTwrILLP4ETvrZcXZxAtpFLh/U0c+q8oRMJLr1Kiu4w== + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-reduce-initial@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" + integrity sha512-jJFrV1vWOPCQsIVitawGesRgMgunbclERQ/IRGW7r93uHrVzNQQmHQ7znsOIjJPZ4yWMzs5A8NFhp3AkPHPbDA== + dependencies: + postcss "^5.0.4" + +postcss-reduce-transforms@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" + integrity sha512-lGgRqnSuAR5i5uUg1TA33r9UngfTadWxOyL2qx1KuPoCQzfmtaHjp9PuwX7yVyRxG3BWBzeFUaS5uV9eVgnEgQ== + dependencies: + has "^1.0.1" + postcss "^5.0.8" + postcss-value-parser "^3.0.1" + +postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" + integrity sha512-3pqyakeGhrO0BQ5+/tGTfvi5IAUAhHRayGK8WFSu06aEv2BmHoXw/Mhb+w7VY5HERIuC+QoUI7wgrCcq2hqCVA== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^2.1.1: + version "2.1.6" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" + integrity sha512-y5AdQdgBoF4rbpdbeWAJuxE953g/ylRfVNp6mvAi61VCN/Y25Tu9p5mh3CyI42WbTRIiwR9a1GdFtmDnNPeskQ== + dependencies: + is-svg "^2.0.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + svgo "^0.7.0" + +postcss-unique-selectors@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" + integrity sha512-WZX8r1M0+IyljoJOJleg3kYm10hxNYF9scqAT7v/xeSX1IdehutOM85SNO0gP9K+bgs86XERr7Ud5u3ch4+D8g== + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-zindex@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" + integrity sha512-uhRZ2hRgj0lorxm9cr62B01YzpUe63h0RXMXQ4gWW3oa2rpJh+FJAiEAytaFCPU/VgaBS+uW2SJ1XKyDNz1h4w== + dependencies: + has "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: + version "5.2.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" + integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.1: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg== + +private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + +public-encrypt@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0, pump@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== + +qs@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404" + integrity sha512-f5M0HQqZWkzU8GELTY8LyMrGkr3bPjKoFtTkwUEqJQbcljbeK8M7mliP9Ia2xoOI6oMerp+QPS7oYJtpGmWe/A== + +qs@^6.12.3: + version "6.15.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.0.tgz#db8fd5d1b1d2d6b5b33adaf87429805f1909e7b3" + integrity sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ== + dependencies: + side-channel "^1.1.0" + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q== + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +raven@^2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/raven/-/raven-2.6.4.tgz#458d4a380c8fbb59e0150c655625aaf60c167ea3" + integrity sha512-6PQdfC4+DQSFncowthLf+B6Hr0JpPsFBgTVYTAOq7tCmx/kR4SXbeawtPch20+3QfUcQDoJBLjWW1ybvZ4kXTw== + dependencies: + cookie "0.3.1" + md5 "^2.2.1" + stack-trace "0.0.10" + timed-out "4.0.1" + uuid "3.3.2" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w== + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA== + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@^2.3.8, readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@1.0.27-1: + version "1.0.27-1" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.27-1.tgz#6b67983c20357cefd07f0165001a16d710d91078" + integrity sha512-uQE31HGhpMrqZwtDjRliOs2aC3XBi+DdkhLs+Xa0dvVD5eDiZr3+k8rKVZcyTzxosgtMw7B/twQsK3P1KTZeVg== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +"readable-stream@>=1.0.33-1 <1.1.0-0": + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +reduce-component@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/reduce-component/-/reduce-component-1.0.1.tgz#e0c93542c574521bea13df0f9488ed82ab77c5da" + integrity sha512-y0wyCcdQul3hI3xHfIs0vg/jSbboQc/YTOAqaxjFG7At+XSexduuOqBVL9SmOLSwa/ldkbzVzdwuk9s2EKTAZg== + +reduce-css-calc@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + integrity sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA== + dependencies: + balanced-match "^0.4.2" + math-expression-evaluator "^1.2.14" + reduce-function-call "^1.0.1" + +reduce-function-call@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.3.tgz#60350f7fb252c0a67eb10fd4694d16909971300f" + integrity sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ== + dependencies: + balanced-match "^1.0.0" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== + dependencies: + is-finite "^1.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== + +resolve@^1.10.0: + version "1.22.11" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" + integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== + dependencies: + is-core-module "^2.16.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rimraf@^2.5.4, rimraf@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.3.tgz#9be54e4ba5e3559c8eee06a25cd7648bbccdf5a8" + integrity sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA== + dependencies: + hash-base "^3.1.2" + inherits "^2.0.4" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg== + dependencies: + aproba "^1.1.1" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.0.tgz#da59637629307b97e7c4cb28e080a7bc38560d5b" + integrity sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA== + +sax@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^0.4.5: + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +"semver@2 || 3 || 4 || 5", semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +serialize-javascript@^1.4.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" + integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +sha.js@^2.4.0, sha.js@^2.4.12, sha.js@^2.4.8: + version "2.4.12" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f" + integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + to-buffer "^1.2.0" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +signal-exit@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-statistics@7.7.3: + version "7.7.3" + resolved "https://registry.yarnpkg.com/simple-statistics/-/simple-statistics-7.7.3.tgz#8b7b51edae40e397a28dbe8ae762ddd156ae43b6" + integrity sha512-ym356HUIJYLYEJASkbrYGAinlivGbBZhhgRNpTxWXVncfCGh61iUsaoSM+b84RrtGI2ZJvulTCUEwscE1s4yzw== + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg== + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg== + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.23" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz#b069e687b1291a32f126893ed76a27a745ee2133" + integrity sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw== + +spin.js@^2.0.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/spin.js/-/spin.js-2.3.2.tgz#6caa56d520673450fd5cfbc6971e6d0772c37a1a" + integrity sha512-ryhCvKCRa6J5Fxa7Y+fnhE2a+e05JwfW5dxO82zPd0uDM9o+qp8p74BJUurjiqCqmDsWNvGOAxfqdD317XIedg== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +ssri@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== + dependencies: + safe-buffer "^5.1.1" + +stack-trace@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" + integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-2.0.1.tgz#df62c1aa94ed2f114e1d0f21fd1d50482b79a60e" + integrity sha512-2h8q2CP3EeOhDJ+jd932PRMpa3/pOJFGoF22J1U/DNbEK2gSW2DqeF46VjCXsSQXhC+k/l8/gaaRBQKL6hUPfQ== + dependencies: + ansi-regex "^1.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + +style-loader@^0.23.1, style-loader@~0.13.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + +superagent@^1.8.3: + version "1.8.5" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-1.8.5.tgz#1c0ddc3af30e80eb84ebc05cb2122da8fe940b55" + integrity sha512-4h4R6fISQXvgjIqZ8DjONYy3y2XPxgZO0LgHsBI6tDAEhzJLpWuK+thM60SmUiERJOEJzmxlIGx/GP6+azky/A== + dependencies: + component-emitter "~1.2.0" + cookiejar "2.0.6" + debug "2" + extend "3.0.0" + form-data "1.0.0-rc3" + formidable "~1.0.14" + methods "~1.1.1" + mime "1.3.4" + qs "2.3.3" + readable-stream "1.0.27-1" + reduce-component "1.0.1" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== + dependencies: + has-flag "^1.0.0" + +supports-color@^4.2.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + integrity sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw== + dependencies: + has-flag "^2.0.0" + +supports-color@^5.3.0, supports-color@^5.4.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svgo@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" + integrity sha512-jT/g9FFMoe9lu2IT6HtAxTA7RR2XOrmcrmCtGnyB/+GQnV6ZjNn+KOHZbZ35yL81+1F/aB6OeEsJztzBQ2EEwA== + dependencies: + coa "~1.0.1" + colors "~1.1.2" + csso "~2.3.1" + js-yaml "~3.7.0" + mkdirp "~0.5.1" + sax "~1.2.1" + whet.extend "~0.9.9" + +tapable@^0.2.7: + version "0.2.9" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8" + integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A== + +through2@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.3.tgz#795292fde9f254c2a368b38f9cc5d1bd4663afb6" + integrity sha512-6UXIsO0fTTYMgxeQ9pisMOIqF/uL6Ebva+4HxihtLLR2gscWEu+OTMwar/0TYZaeDSNS1msIJAXJRis+GojL8g== + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +timed-out@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== + +to-buffer@^1.2.0, to-buffer@^1.2.1, to-buffer@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.2.tgz#ffe59ef7522ada0a2d1cb5dfe03bb8abc3cdc133" + integrity sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw== + dependencies: + isarray "^2.0.5" + safe-buffer "^5.2.1" + typed-array-buffer "^1.0.3" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og== + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== + +type@^2.7.2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.3.tgz#436981652129285cc3ba94f392886c2637ea0486" + integrity sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ== + +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +uglify-es@^3.3.4: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +uglifyjs-webpack-plugin@1.3.0, uglifyjs-webpack-plugin@^0.4.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" + integrity sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw== + dependencies: + cacache "^10.0.4" + find-cache-dir "^1.0.0" + schema-utils "^0.4.5" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + uglify-es "^3.3.4" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ== + +unique-filename@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urijs@^1.19.7: + version "1.19.11" + resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc" + integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ== + +url@^0.11.0: + version "0.11.4" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.4.tgz#adca77b3562d56b72746e76b330b7f27b6721f3c" + integrity sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg== + dependencies: + punycode "^1.4.1" + qs "^6.12.3" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.10.4: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +uuid@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +watchpack@^1.4.0, watchpack@^2.3.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.1.tgz#dd38b601f669e0cbf567cb802e75cead82cde102" + integrity sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +webpack-bundle-tracker@0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/webpack-bundle-tracker/-/webpack-bundle-tracker-0.0.9.tgz#fd6ba1e65478f5cd3414e6f2ef3d4e1be0e3cd9d" + integrity sha512-Dnpn1zUrLjjKKsKbW4/F+FbR/tm254eEaiszVPAvF9Rnk+qVvmNMz5yH1QAW+cAHOg/bEfJwI8WghyOnh2e7zw== + dependencies: + mkdirp "^0.5.1" + strip-ansi "^2.0.1" + +webpack-sources@^1.0.1, webpack-sources@^1.1.0: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz#3f9e34360370602fcf639e97939db486f4ec0d74" + integrity sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ== + dependencies: + acorn "^5.0.0" + acorn-dynamic-import "^2.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + async "^2.1.2" + enhanced-resolve "^3.4.0" + escope "^3.6.0" + interpret "^1.0.0" + json-loader "^0.5.4" + json5 "^0.5.1" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + mkdirp "~0.5.0" + node-libs-browser "^2.0.0" + source-map "^0.5.3" + supports-color "^4.2.1" + tapable "^0.2.7" + uglifyjs-webpack-plugin "^0.4.6" + watchpack "^1.4.0" + webpack-sources "^1.0.1" + yargs "^8.0.2" + +whet.extend@~0.9.9: + version "0.9.9" + resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" + integrity sha512-mmIPAft2vTgEILgPeZFqE/wWh24SEsR/k+N9fJ3Jxrz44iDFy9aemCxdksfURSHYFCLmvs/d/7Iso5XjPpNfrA== + +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which-typed-array@^1.1.16: + version "1.1.20" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122" + integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +worker-farm@^1.5.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + integrity sha512-WhzC+xgstid9MbVUktco/bf+KJG+Uu6vMX0LN1sLJvwmbCQVxb4D8LzogobonKycNasCZLdOzTAk1SK7+K7swg== + dependencies: + camelcase "^4.1.0" + +yargs@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + integrity sha512-3RiZrpLpjrzIAKgGdPktBcMP/eG5bDFlkI+PHle1qwzyVXyDQL+pD/eZaMoOOO0Y7LLBfjpucObuUm/icvbpKQ== + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" diff --git a/yarn.lock b/yarn.lock index 25ca5aeb866..c3d2fececda 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,4579 +1,3307 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 8 - cacheKey: 10c0 - -"@centerforopenscience/list-of-licenses@npm:^1.1.0": - version: 1.1.0 - resolution: "@centerforopenscience/list-of-licenses@npm:1.1.0" - checksum: 10c0/49254d7a30edfb52b6a681afd25a22b92275a45a61698de8804126176113d6094fd7a25baeec686e88a81652a8bd9b8f0ce9345df4ba5c04ec831349e96f65be - languageName: node - linkType: hard - -"@centerforopenscience/osf-style@npm:1.9.0": - version: 1.9.0 - resolution: "@centerforopenscience/osf-style@npm:1.9.0" - checksum: 10c0/243cc3e560329fed8c6448f91db8937b14d7f58fa94ac9f8cd74ada1d01cf621b990223bb75bd355e0b291b256804699889db7a3dcc96db858331a17d4018ff6 - languageName: node - linkType: hard - -"@fortawesome/fontawesome-common-types@npm:7.0.1": - version: 7.0.1 - resolution: "@fortawesome/fontawesome-common-types@npm:7.0.1" - checksum: 10c0/1cebe9727950f8fcea581e115ed91f9b2bf287114077adde0cc1fb32d25c2c2ec282a8cff291b22ca558cbb1264af7fad04b85c5afcb899745584b2874df4151 - languageName: node - linkType: hard - -"@fortawesome/fontawesome-free@npm:^7.0.1": - version: 7.0.1 - resolution: "@fortawesome/fontawesome-free@npm:7.0.1" - checksum: 10c0/60170c84f56f5e190ea532f4205b53a8b902b34b46e59fcacf4a8d8a97ec566c5bfc246c5b80393cd7e1c24e1faa895c57456bcaffc0177962fc07922756a1d5 - languageName: node - linkType: hard - -"@fortawesome/fontawesome-svg-core@npm:^7.0.1": - version: 7.0.1 - resolution: "@fortawesome/fontawesome-svg-core@npm:7.0.1" - dependencies: - "@fortawesome/fontawesome-common-types": "npm:7.0.1" - checksum: 10c0/adf72373e45ec0b81e9a60e74a6aeadd70cd7da31ecf37736e6288ef956148699272155935d97d7bf02f37e2fefd8f9b8c34b626e59fcca54a5947be46ff06fe - languageName: node - linkType: hard - -"@fortawesome/free-brands-svg-icons@npm:^7.0.1": - version: 7.0.1 - resolution: "@fortawesome/free-brands-svg-icons@npm:7.0.1" - dependencies: - "@fortawesome/fontawesome-common-types": "npm:7.0.1" - checksum: 10c0/a05058f7ff8aaf86952a96877d270e52293c5da5804ae21cf127b28063dfedfa4a1bb260040f774ccd81c3e55a045d36e2137686ea93ad84c8310ffd6a2303ba - languageName: node - linkType: hard - -"@fortawesome/react-fontawesome@npm:^3.0.2": - version: 3.0.2 - resolution: "@fortawesome/react-fontawesome@npm:3.0.2" - peerDependencies: - "@fortawesome/fontawesome-svg-core": ~6 || ~7 - react: ^18.0.0 || ^19.0.0 - checksum: 10c0/0a6a99ab16af74189232b01986d882ce3b2265836297a949709517f0f9b3d7c11dcf67e130200f09aca9d0e015abff21248d105796d768660901273a8ee232db - languageName: node - linkType: hard - -"@gar/promise-retry@npm:^1.0.0": - version: 1.0.3 - resolution: "@gar/promise-retry@npm:1.0.3" - checksum: 10c0/885b02c8b0d75b2d215da25f3b639158c4fbe8fefe0d79163304534b9a6d0710db4b7699f7cd3cc1a730792bff04cbe19f4850a62d3e105a663eaeec88f38332 - languageName: node - linkType: hard - -"@isaacs/fs-minipass@npm:^4.0.0": - version: 4.0.1 - resolution: "@isaacs/fs-minipass@npm:4.0.1" - dependencies: - minipass: "npm:^7.0.4" - checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 - languageName: node - linkType: hard - -"@npmcli/agent@npm:^4.0.0": - version: 4.0.0 - resolution: "@npmcli/agent@npm:4.0.0" - dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^11.2.1" - socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/f7b5ce0f3dd42c3f8c6546e8433573d8049f67ef11ec22aa4704bc41483122f68bf97752e06302c455ead667af5cb753e6a09bff06632bc465c1cfd4c4b75a53 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^5.0.0": - version: 5.0.0 - resolution: "@npmcli/fs@npm:5.0.0" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/26e376d780f60ff16e874a0ac9bc3399186846baae0b6e1352286385ac134d900cc5dafaded77f38d77f86898fc923ae1cee9d7399f0275b1aa24878915d722b - languageName: node - linkType: hard - -"@npmcli/redact@npm:^4.0.0": - version: 4.0.0 - resolution: "@npmcli/redact@npm:4.0.0" - checksum: 10c0/a1e9ba9c70a6b40e175bda2c3dd8cfdaf096e6b7f7a132c855c083c8dfe545c3237cd56702e2e6627a580b1d63373599d49a1192c4078a85bf47bbde824df31c - languageName: node - linkType: hard - -"OSF@workspace:.": - version: 0.0.0-use.local - resolution: "OSF@workspace:." - dependencies: - "@centerforopenscience/list-of-licenses": "npm:^1.1.0" - "@centerforopenscience/osf-style": "npm:1.9.0" - "@fortawesome/fontawesome-free": "npm:^7.0.1" - "@fortawesome/fontawesome-svg-core": "npm:^7.0.1" - "@fortawesome/free-brands-svg-icons": "npm:^7.0.1" - "@fortawesome/react-fontawesome": "npm:^3.0.2" - URIjs: "npm:^1.14.1" - assets-webpack-plugin: "npm:^2.3.0" - bootbox: "npm:^5.5.2" - bootstrap: "npm:3.3.7" - bower: "npm:^1.8.8" - css-loader: "npm:^0.28.11" - diff: "npm:~5.0.0" - dropzone: "https://github.com/CenterForOpenScience/dropzone.git#aba21eb6b82cc823ac7a7a53d6e035791c082bae" - exports-loader: "npm:0.6.3" - file-loader: "npm:^0.11.2" - gsap: "npm:3.9.1" - highlight.js: "npm:~9.18.2" - imports-loader: "npm:^0.6.3" - js-cookie: "npm:3.0.1" - js-md5: "npm:^0.7.3" - jstimezonedetect: "npm:^1.0.6" - knockout: "npm:~3.4.2" - knockout.validation: "npm:^2.0.2" - less: "npm:^4.1.2" - linkifyjs: "npm:^3.0.5" - loaders.css: "npm:^0.1.2" - lodash.find: "npm:^4.3.0" - lodash.get: "npm:^4.2.1" - lodash.has: "npm:^4.5.2" - lodash.includes: "npm:^4.3.0" - lodash.set: "npm:^4.3.2" - mime-types: "npm:~2.1.34" - mithril: "npm:0.2.0" - moment: "npm:^2.14.1" - object-assign: "npm:^3.0.0" - pikaday: "npm:^1.3.2" - raw-loader: "npm:~0.5.0" - select2: "npm:3.5.1" - style-loader: "npm:^0.23.1" - treebeard: "https://github.com/CenterForOpenScience/treebeard.git#d2bb8f6f8104fcac040402727f431c26722b269e" - typeahead.js: "npm:^0.11.1" - url-loader: "npm:~0.6.2" - webpack: "npm:3.12.0" - zxcvbn: "npm:^4.2.0" - languageName: unknown - linkType: soft - -"URIjs@npm:^1.14.1": - version: 1.16.1 - resolution: "URIjs@npm:1.16.1" - checksum: 10c0/4709474a384394d4b28987b845989ca56297f07afed3ad58204ba309727530a3aa0106cc5a90b0d784cda390b0ca500575981951f1fa065e8e766a4ffec26f08 - languageName: node - linkType: hard - -"abbrev@npm:^4.0.0": - version: 4.0.0 - resolution: "abbrev@npm:4.0.0" - checksum: 10c0/b4cc16935235e80702fc90192e349e32f8ef0ed151ef506aa78c81a7c455ec18375c4125414b99f84b2e055199d66383e787675f0bcd87da7a4dbd59f9eac1d5 - languageName: node - linkType: hard - -"acorn-dynamic-import@npm:^2.0.0": - version: 2.0.2 - resolution: "acorn-dynamic-import@npm:2.0.2" - dependencies: - acorn: "npm:^4.0.3" - checksum: 10c0/5dcac220ae8ddc8f8439402691c6da21f4e44f3a91b5645884cd2a5f03c8e39a40006a189de9ccd50fdfcdeda6c52724db45cd2100e56e9e9656d7b19e2bfd22 - languageName: node - linkType: hard - -"acorn@npm:^4.0.3": - version: 4.0.13 - resolution: "acorn@npm:4.0.13" - bin: - acorn: ./bin/acorn - checksum: 10c0/ed73e42711474f80d7f2f94d68109e83a40d48c9596f0bcfd1a4c64e086636495259432421357524d04bfe317eed6de5b6202d2ab30f1b1c26bca12684979aa5 - languageName: node - linkType: hard - -"acorn@npm:^5.0.0": - version: 5.7.4 - resolution: "acorn@npm:5.7.4" - bin: - acorn: bin/acorn - checksum: 10c0/b29e61d48fa31ae69d38d74bb213b77b32de6317f125890a6cb76b44d173adccbcd3a07fc9a86acdfe8ab0a80f42b5ec6290df8b7944e0506504ac3b716232bd - languageName: node - linkType: hard - -"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": - version: 7.1.4 - resolution: "agent-base@npm:7.1.4" - checksum: 10c0/c2c9ab7599692d594b6a161559ada307b7a624fa4c7b03e3afdb5a5e31cd0e53269115b620fcab024c5ac6a6f37fa5eb2e004f076ad30f5f7e6b8b671f7b35fe - languageName: node - linkType: hard - -"ajv-errors@npm:^1.0.0": - version: 1.0.1 - resolution: "ajv-errors@npm:1.0.1" - peerDependencies: - ajv: ">=5.0.0" - checksum: 10c0/de2d6e8100c8707ea063ee4785d53adf599b457c0d4f72c3592244d67ad16448a6d35f7ce45f12bdd2819939447c876e8ef2f1c0800896d7f2aa25c3838acdf1 - languageName: node - linkType: hard - -"ajv-keywords@npm:^3.1.0": - version: 3.5.2 - resolution: "ajv-keywords@npm:3.5.2" - peerDependencies: - ajv: ^6.9.1 - checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 - languageName: node - linkType: hard - -"ajv@npm:^5.0.0": - version: 5.5.2 - resolution: "ajv@npm:5.5.2" - dependencies: - co: "npm:^4.6.0" - fast-deep-equal: "npm:^1.0.0" - fast-json-stable-stringify: "npm:^2.0.0" - json-schema-traverse: "npm:^0.3.0" - checksum: 10c0/9b8f762cd6b9da3935987b82418402247e76925e39814ca0d62088656117129db7e0cdc1d3e4aa6a3c4aa5ff67021551299ee4771735bcccb6cdd3f85061e565 - languageName: node - linkType: hard - -"ajv@npm:^6.1.0": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: "npm:^3.1.1" - fast-json-stable-stringify: "npm:^2.0.0" - json-schema-traverse: "npm:^0.4.1" - uri-js: "npm:^4.2.2" - checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 - languageName: node - linkType: hard - -"alphanum-sort@npm:^1.0.1, alphanum-sort@npm:^1.0.2": - version: 1.0.2 - resolution: "alphanum-sort@npm:1.0.2" - checksum: 10c0/2944e7ae4d36328a2df071017c01cd1d06ef6a5d87c8fbbeffd9075d42f4da48051bde79a5e3d863b98f37778c76e8eebd4353c1e7bbba2480382096953ec2b8 - languageName: node - linkType: hard - -"amdefine@npm:>=0.0.4": - version: 1.0.1 - resolution: "amdefine@npm:1.0.1" - checksum: 10c0/ba8aa5d4ff5248b2ed067111e72644b36b5b7ae88d9a5a2c4223dddb3bdc9102db67291e0b414f59f12c6479ac6a365886bac72c7965e627cbc732e0962dd1ab - languageName: node - linkType: hard - -"ansi-regex@npm:^2.0.0": - version: 2.1.1 - resolution: "ansi-regex@npm:2.1.1" - checksum: 10c0/78cebaf50bce2cb96341a7230adf28d804611da3ce6bf338efa7b72f06cc6ff648e29f80cd95e582617ba58d5fdbec38abfeed3500a98bce8381a9daec7c548b - languageName: node - linkType: hard - -"ansi-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "ansi-regex@npm:3.0.0" - checksum: 10c0/c6a2b226d009965decc65d330b953290039f0f2b31d200516a9a79b6010f5f8f9d6acbaa0917d925c578df0c0feaddcb56569aad05776f99e2918116d4233121 - languageName: node - linkType: hard - -"ansi-styles@npm:^2.2.1": - version: 2.2.1 - resolution: "ansi-styles@npm:2.2.1" - checksum: 10c0/7c68aed4f1857389e7a12f85537ea5b40d832656babbf511cc7ecd9efc52889b9c3e5653a71a6aade783c3c5e0aa223ad4ff8e83c27ac8a666514e6c79068cab - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.0" - checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b - languageName: node - linkType: hard - -"aproba@npm:^1.1.1": - version: 1.2.0 - resolution: "aproba@npm:1.2.0" - checksum: 10c0/2d34f008c9edfa991f42fe4b667d541d38a474a39ae0e24805350486d76744cd91ee45313283c1d39a055b14026dd0fc4d0cbfc13f210855d59d7e8b5a61dc51 - languageName: node - linkType: hard - -"argparse@npm:^1.0.7": - version: 1.0.10 - resolution: "argparse@npm:1.0.10" - dependencies: - sprintf-js: "npm:~1.0.2" - checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de - languageName: node - linkType: hard - -"asn1.js@npm:^5.2.0": - version: 5.4.1 - resolution: "asn1.js@npm:5.4.1" - dependencies: - bn.js: "npm:^4.0.0" - inherits: "npm:^2.0.1" - minimalistic-assert: "npm:^1.0.0" - safer-buffer: "npm:^2.1.0" - checksum: 10c0/b577232fa6069cc52bb128e564002c62b2b1fe47f7137bdcd709c0b8495aa79cee0f8cc458a831b2d8675900eea0d05781b006be5e1aa4f0ae3577a73ec20324 - languageName: node - linkType: hard - -"assert@npm:^1.1.1": - version: 1.5.0 - resolution: "assert@npm:1.5.0" - dependencies: - object-assign: "npm:^4.1.1" - util: "npm:0.10.3" - checksum: 10c0/188da37d63be479a3b14657c01080db90cdf7fa004e346af916cf8beebcaffb11359c596d0c9c3cd8174c9125a6225796ef1ce533487edc97f8ce3b18c1ab590 - languageName: node - linkType: hard - -"assets-webpack-plugin@npm:^2.3.0": - version: 2.3.0 - resolution: "assets-webpack-plugin@npm:2.3.0" - dependencies: - camelcase: "npm:^1.2.1" - escape-string-regexp: "npm:^1.0.3" - mkdirp: "npm:^0.5.1" - checksum: 10c0/7d5a1fb70f1c7ef0eb59c6d84bc4046a6b2b9913d66e153960dd63e8ca40f27024ecdf130d0dd87db9b7384b7ba060e66a1c7d45ef658a1f4bf7df81356bc3fb - languageName: node - linkType: hard - -"async@npm:^2.1.2": - version: 2.6.3 - resolution: "async@npm:2.6.3" - dependencies: - lodash: "npm:^4.17.14" - checksum: 10c0/06c917c74a55f9036ff79dedfc51dfc9c52c2dee2f80866b600495d2fd3037251dbcfde6592f23fc47398c44d844174004e0ee532f94c32a888bb89fd1cf0f25 - languageName: node - linkType: hard - -"autoprefixer@npm:^6.3.1": - version: 6.7.7 - resolution: "autoprefixer@npm:6.7.7" - dependencies: - browserslist: "npm:^1.7.6" - caniuse-db: "npm:^1.0.30000634" - normalize-range: "npm:^0.1.2" - num2fraction: "npm:^1.2.2" - postcss: "npm:^5.2.16" - postcss-value-parser: "npm:^3.2.3" - checksum: 10c0/bdcf8e53eacef1feb54940bbe33fcb67e12eb07d5572d5f0fbadb638b84be15ca91b3a343763962a2ce6ed12ba611e039c62e871d12e29b956b8f2b189c263ae - languageName: node - linkType: hard - -"babel-code-frame@npm:^6.26.0": - version: 6.26.0 - resolution: "babel-code-frame@npm:6.26.0" - dependencies: - chalk: "npm:^1.1.3" - esutils: "npm:^2.0.2" - js-tokens: "npm:^3.0.2" - checksum: 10c0/7fecc128e87578cf1b96e78d2b25e0b260e202bdbbfcefa2eac23b7f8b7b2f7bc9276a14599cde14403cc798cc2a38e428e2cab50b77658ab49228b09ae92473 - languageName: node - linkType: hard - -"balanced-match@npm:^0.4.2": - version: 0.4.2 - resolution: "balanced-match@npm:0.4.2" - checksum: 10c0/cd4e15add0f4ef14c4fe960d9f4a343052d7c0f7939e1b5e54c8f24417a501bde1f17e191b676daebd16ae316955c918f93b8ed0414bb03d038dd0159c9998e5 - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee - languageName: node - linkType: hard - -"balanced-match@npm:^4.0.2": - version: 4.0.4 - resolution: "balanced-match@npm:4.0.4" - checksum: 10c0/07e86102a3eb2ee2a6a1a89164f29d0dbaebd28f2ca3f5ca786f36b8b23d9e417eb3be45a4acf754f837be5ac0a2317de90d3fcb7f4f4dc95720a1f36b26a17b - languageName: node - linkType: hard - -"base64-js@npm:^1.0.2": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf - languageName: node - linkType: hard - -"big.js@npm:^3.1.3": - version: 3.2.0 - resolution: "big.js@npm:3.2.0" - checksum: 10c0/de0b8e275171060a37846b521e8ebfe077c650532306c2470474da6720feb04351cc8588ef26088756b224923782946ae67e817b90122cc85692bbda7ccd2d0d - languageName: node - linkType: hard - -"big.js@npm:^5.2.2": - version: 5.2.2 - resolution: "big.js@npm:5.2.2" - checksum: 10c0/230520f1ff920b2d2ce3e372d77a33faa4fa60d802fe01ca4ffbc321ee06023fe9a741ac02793ee778040a16b7e497f7d60c504d1c402b8fdab6f03bb785a25f - languageName: node - linkType: hard - -"bluebird@npm:^3.5.1": - version: 3.7.2 - resolution: "bluebird@npm:3.7.2" - checksum: 10c0/680de03adc54ff925eaa6c7bb9a47a0690e8b5de60f4792604aae8ed618c65e6b63a7893b57ca924beaf53eee69c5af4f8314148c08124c550fe1df1add897d2 - languageName: node - linkType: hard - -"bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.9": - version: 4.12.0 - resolution: "bn.js@npm:4.12.0" - checksum: 10c0/9736aaa317421b6b3ed038ff3d4491935a01419ac2d83ddcfebc5717385295fcfcf0c57311d90fe49926d0abbd7a9dbefdd8861e6129939177f7e67ebc645b21 - languageName: node - linkType: hard - -"bn.js@npm:^5.0.0, bn.js@npm:^5.1.1": - version: 5.2.0 - resolution: "bn.js@npm:5.2.0" - checksum: 10c0/67e17b1934d9c7a73aed9b89222dc8c1c8e3aff46cca6609b8c2ab04fa22c6b8db42c7774b039d09fa63136d8866b777ab88af0d64d8ea3839a94e69193a6b13 - languageName: node - linkType: hard - -"bootbox@npm:^5.5.2": - version: 5.5.2 - resolution: "bootbox@npm:5.5.2" - dependencies: - bootstrap: "npm:^4.4.0" - jquery: "npm:^3.5.1" - popper.js: "npm:^1.16.0" - checksum: 10c0/a282c1349cf11cfc36260ac8301613517ffb407ade77d4b402d1eeaddddb1677008dcfa984a98ab9b21502cf833b3be02105cb784a25545bf48645cfe06e70ac - languageName: node - linkType: hard - -"bootstrap@npm:3.3.7": - version: 3.3.7 - resolution: "bootstrap@npm:3.3.7" - checksum: 10c0/6e711d39551d32a3fa2b7d6b22d59769266b4b5fccc20c18f6e6c8289d901a67cd23d00760415eedcd77a122db1bf5c46f6e8e9df1cea2fe2ada04741599ddbd - languageName: node - linkType: hard - -"bootstrap@npm:^3.3.7": - version: 3.4.1 - resolution: "bootstrap@npm:3.4.1" - checksum: 10c0/3ac443985a432fd77f1d6df2972d8f0a06e93bb0e10893fa890e6503e6d2b36e601f4a9894429223afa867c2232ead1af5c55ded4c23a64dc706ca25e49dc2da - languageName: node - linkType: hard - -"bower@npm:^1.8.8": - version: 1.8.13 - resolution: "bower@npm:1.8.13" - bin: - bower: bin/bower - checksum: 10c0/17724eb65745b7c4de57be0116eb06b4931bbdfaa152b40b1f1ab522d358b2036cd9fb30fb0e26ad0885586528c8ff6b872a3953649d6ce8bfa8a538c5e4a486 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 - languageName: node - linkType: hard - -"brace-expansion@npm:^5.0.2": - version: 5.0.4 - resolution: "brace-expansion@npm:5.0.4" - dependencies: - balanced-match: "npm:^4.0.2" - checksum: 10c0/359cbcfa80b2eb914ca1f3440e92313fbfe7919ee6b274c35db55bec555aded69dac5ee78f102cec90c35f98c20fa43d10936d0cd9978158823c249257e1643a - languageName: node - linkType: hard - -"brorand@npm:^1.0.1, brorand@npm:^1.1.0": - version: 1.1.0 - resolution: "brorand@npm:1.1.0" - checksum: 10c0/6f366d7c4990f82c366e3878492ba9a372a73163c09871e80d82fb4ae0d23f9f8924cb8a662330308206e6b3b76ba1d528b4601c9ef73c2166b440b2ea3b7571 - languageName: node - linkType: hard - -"browserify-aes@npm:^1.0.0, browserify-aes@npm:^1.0.4": - version: 1.2.0 - resolution: "browserify-aes@npm:1.2.0" - dependencies: - buffer-xor: "npm:^1.0.3" - cipher-base: "npm:^1.0.0" - create-hash: "npm:^1.1.0" - evp_bytestokey: "npm:^1.0.3" - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/967f2ae60d610b7b252a4cbb55a7a3331c78293c94b4dd9c264d384ca93354c089b3af9c0dd023534efdc74ffbc82510f7ad4399cf82bc37bc07052eea485f18 - languageName: node - linkType: hard - -"browserify-cipher@npm:^1.0.0": - version: 1.0.1 - resolution: "browserify-cipher@npm:1.0.1" - dependencies: - browserify-aes: "npm:^1.0.4" - browserify-des: "npm:^1.0.0" - evp_bytestokey: "npm:^1.0.0" - checksum: 10c0/aa256dcb42bc53a67168bbc94ab85d243b0a3b56109dee3b51230b7d010d9b78985ffc1fb36e145c6e4db151f888076c1cfc207baf1525d3e375cbe8187fe27d - languageName: node - linkType: hard - -"browserify-des@npm:^1.0.0": - version: 1.0.2 - resolution: "browserify-des@npm:1.0.2" - dependencies: - cipher-base: "npm:^1.0.1" - des.js: "npm:^1.0.0" - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.1.2" - checksum: 10c0/943eb5d4045eff80a6cde5be4e5fbb1f2d5002126b5a4789c3c1aae3cdddb1eb92b00fb92277f512288e5c6af330730b1dbabcf7ce0923e749e151fcee5a074d - languageName: node - linkType: hard - -"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.0.1": - version: 4.1.0 - resolution: "browserify-rsa@npm:4.1.0" - dependencies: - bn.js: "npm:^5.0.0" - randombytes: "npm:^2.0.1" - checksum: 10c0/fb2b5a8279d8a567a28d8ee03fb62e448428a906bab5c3dc9e9c3253ace551b5ea271db15e566ac78f1b1d71b243559031446604168b9235c351a32cae99d02a - languageName: node - linkType: hard - -"browserify-sign@npm:^4.0.0": - version: 4.2.1 - resolution: "browserify-sign@npm:4.2.1" - dependencies: - bn.js: "npm:^5.1.1" - browserify-rsa: "npm:^4.0.1" - create-hash: "npm:^1.2.0" - create-hmac: "npm:^1.1.7" - elliptic: "npm:^6.5.3" - inherits: "npm:^2.0.4" - parse-asn1: "npm:^5.1.5" - readable-stream: "npm:^3.6.0" - safe-buffer: "npm:^5.2.0" - checksum: 10c0/8f00a370e3e97060977dc58e51251d3ca398ee73523994a44430321e8de2c7d85395362d59014b2b07efe4190f369baee2ff28eb8f405ff4660b776651cf052d - languageName: node - linkType: hard - -"browserify-zlib@npm:^0.2.0": - version: 0.2.0 - resolution: "browserify-zlib@npm:0.2.0" - dependencies: - pako: "npm:~1.0.5" - checksum: 10c0/9ab10b6dc732c6c5ec8ebcbe5cb7fe1467f97402c9b2140113f47b5f187b9438f93a8e065d8baf8b929323c18324fbf1105af479ee86d9d36cab7d7ef3424ad9 - languageName: node - linkType: hard - -"browserslist@npm:^1.3.6, browserslist@npm:^1.5.2, browserslist@npm:^1.7.6": - version: 1.7.7 - resolution: "browserslist@npm:1.7.7" - dependencies: - caniuse-db: "npm:^1.0.30000639" - electron-to-chromium: "npm:^1.2.7" - bin: - browserslist: ./cli.js - checksum: 10c0/1caae2f00800711b3c18a834b84ab3109b955836f23e00a7eb0227e54c22a101b95a9606c1347a04ec882524a724ba57691f856a7aba3fde6dd197b867b8cd41 - languageName: node - linkType: hard - -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 - languageName: node - linkType: hard - -"buffer-xor@npm:^1.0.3": - version: 1.0.3 - resolution: "buffer-xor@npm:1.0.3" - checksum: 10c0/fd269d0e0bf71ecac3146187cfc79edc9dbb054e2ee69b4d97dfb857c6d997c33de391696d04bdd669272751fa48e7872a22f3a6c7b07d6c0bc31dbe02a4075c - languageName: node - linkType: hard - -"buffer@npm:^4.3.0": - version: 4.9.2 - resolution: "buffer@npm:4.9.2" - dependencies: - base64-js: "npm:^1.0.2" - ieee754: "npm:^1.1.4" - isarray: "npm:^1.0.0" - checksum: 10c0/dc443d7e7caab23816b58aacdde710b72f525ad6eecd7d738fcaa29f6d6c12e8d9c13fed7219fd502be51ecf0615f5c077d4bdc6f9308dde2e53f8e5393c5b21 - languageName: node - linkType: hard - -"builtin-status-codes@npm:^3.0.0": - version: 3.0.0 - resolution: "builtin-status-codes@npm:3.0.0" - checksum: 10c0/c37bbba11a34c4431e56bd681b175512e99147defbe2358318d8152b3a01df7bf25e0305873947e5b350073d5ef41a364a22b37e48f1fb6d2fe6d5286a0f348c - languageName: node - linkType: hard - -"cacache@npm:^10.0.4": - version: 10.0.4 - resolution: "cacache@npm:10.0.4" - dependencies: - bluebird: "npm:^3.5.1" - chownr: "npm:^1.0.1" - glob: "npm:^7.1.2" - graceful-fs: "npm:^4.1.11" - lru-cache: "npm:^4.1.1" - mississippi: "npm:^2.0.0" - mkdirp: "npm:^0.5.1" - move-concurrently: "npm:^1.0.1" - promise-inflight: "npm:^1.0.1" - rimraf: "npm:^2.6.2" - ssri: "npm:^5.2.4" - unique-filename: "npm:^1.1.0" - y18n: "npm:^4.0.0" - checksum: 10c0/4c82d037ecc0ef87f58f96ecd3662bdb24aaedd18fa96d749363bc20dee3ac9f623e2c41e09bf894a3f62de1612a8cea8ddae22563a91ce2ef5cb69fe4cf54dd - languageName: node - linkType: hard - -"cacache@npm:^20.0.1": - version: 20.0.4 - resolution: "cacache@npm:20.0.4" - dependencies: - "@npmcli/fs": "npm:^5.0.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^13.0.0" - lru-cache: "npm:^11.1.0" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^7.0.2" - ssri: "npm:^13.0.0" - checksum: 10c0/539bf4020e44ba9ca5afc2ec435623ed7e0dd80c020097677e6b4a0545df5cc9d20b473212d01209c8b4aea43c0d095af0bb6da97bcb991642ea6fac0d7c462b - languageName: node - linkType: hard - -"camelcase@npm:^1.2.1": - version: 1.2.1 - resolution: "camelcase@npm:1.2.1" - checksum: 10c0/dec70dfd46be8e31c5f8a4616f441cc3902da9b807f843c2ad4f2a0c79a8907d91914184b40166e2111bfa76cb66de6107924c0529017204e810ef14390381fa - languageName: node - linkType: hard - -"camelcase@npm:^4.1.0": - version: 4.1.0 - resolution: "camelcase@npm:4.1.0" - checksum: 10c0/54c0b6a85b54fb4e96a9d834a9d0d8f760fd608ab6752a6789042b5e1c38d3dd60f878d2c590d005046445d32d77f6e05e568a91fe8db3e282da0a1560d83058 - languageName: node - linkType: hard - -"caniuse-api@npm:^1.5.2": - version: 1.6.1 - resolution: "caniuse-api@npm:1.6.1" - dependencies: - browserslist: "npm:^1.3.6" - caniuse-db: "npm:^1.0.30000529" - lodash.memoize: "npm:^4.1.2" - lodash.uniq: "npm:^4.5.0" - checksum: 10c0/0769ffb827dcc9d7f6fb1d9616d6ac9dcb0a271cfacd3b1026459f0c5052491ef5a458bdaca12c2204b65bf65aa0c43b880b9bfbe497a0469e319cb48f5da4fb - languageName: node - linkType: hard - -"caniuse-db@npm:^1.0.30000529, caniuse-db@npm:^1.0.30000634, caniuse-db@npm:^1.0.30000639": - version: 1.0.30001312 - resolution: "caniuse-db@npm:1.0.30001312" - checksum: 10c0/15ff3c027d64e26cd665f7f7c8b90b8f12de00929f063cc73f7a23f6afbc36ce7488209ad1537f9771ba0a87979f31ff28e5cc2ed6bc897e769e4c04a3a546c7 - languageName: node - linkType: hard - -"chalk@npm:^1.1.3": - version: 1.1.3 - resolution: "chalk@npm:1.1.3" - dependencies: - ansi-styles: "npm:^2.2.1" - escape-string-regexp: "npm:^1.0.2" - has-ansi: "npm:^2.0.0" - strip-ansi: "npm:^3.0.0" - supports-color: "npm:^2.0.0" - checksum: 10c0/28c3e399ec286bb3a7111fd4225ebedb0d7b813aef38a37bca7c498d032459c265ef43404201d5fbb8d888d29090899c95335b4c0cda13e8b126ff15c541cef8 - languageName: node - linkType: hard - -"chalk@npm:^2.4.1": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 - languageName: node - linkType: hard - -"chownr@npm:^1.0.1": - version: 1.1.4 - resolution: "chownr@npm:1.1.4" - checksum: 10c0/ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db - languageName: node - linkType: hard - -"chownr@npm:^3.0.0": - version: 3.0.0 - resolution: "chownr@npm:3.0.0" - checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 - languageName: node - linkType: hard - -"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": - version: 1.0.4 - resolution: "cipher-base@npm:1.0.4" - dependencies: - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/d8d005f8b64d8a77b3d3ce531301ae7b45902c9cab4ec8b66bdbd2bf2a1d9fceb9a2133c293eb3c060b2d964da0f14c47fb740366081338aa3795dd1faa8984b - languageName: node - linkType: hard - -"clap@npm:^1.0.9": - version: 1.2.3 - resolution: "clap@npm:1.2.3" - dependencies: - chalk: "npm:^1.1.3" - checksum: 10c0/55da8d6a8b60e4718652e7b4310773cb618fbc0386c7648e57a2639a5696f409cb7b5e079b058759232de80cfda32d01fb38934520bbf7c07cd49898fb74bae2 - languageName: node - linkType: hard - -"cliui@npm:^3.2.0": - version: 3.2.0 - resolution: "cliui@npm:3.2.0" - dependencies: - string-width: "npm:^1.0.1" - strip-ansi: "npm:^3.0.1" - wrap-ansi: "npm:^2.0.0" - checksum: 10c0/07b121fac7fd33ff8dbf3523f0d3dca0329d4e457e57dee54502aa5f27a33cbd9e66aa3e248f0260d8a1431b65b2bad8f510cd97fb8ab6a8e0506310a92e18d5 - languageName: node - linkType: hard - -"clone@npm:^1.0.2": - version: 1.0.4 - resolution: "clone@npm:1.0.4" - checksum: 10c0/2176952b3649293473999a95d7bebfc9dc96410f6cbd3d2595cf12fd401f63a4bf41a7adbfd3ab2ff09ed60cb9870c58c6acdd18b87767366fabfc163700f13b - languageName: node - linkType: hard - -"co@npm:^4.6.0": - version: 4.6.0 - resolution: "co@npm:4.6.0" - checksum: 10c0/c0e85ea0ca8bf0a50cbdca82efc5af0301240ca88ebe3644a6ffb8ffe911f34d40f8fbcf8f1d52c5ddd66706abd4d3bfcd64259f1e8e2371d4f47573b0dc8c28 - languageName: node - linkType: hard - -"coa@npm:~1.0.1": - version: 1.0.4 - resolution: "coa@npm:1.0.4" - dependencies: - q: "npm:^1.1.2" - checksum: 10c0/b15bb8d10f8a29b364fa6e4980aff1fee1da7ae4fe721ca9d806d04ddd95e394dcc9b6390028077b1911675e9cae26ea13c0d3fc332cdc3bb0a64e58547f7e60 - languageName: node - linkType: hard - -"code-point-at@npm:^1.0.0": - version: 1.1.0 - resolution: "code-point-at@npm:1.1.0" - checksum: 10c0/33f6b234084e46e6e369b6f0b07949392651b4dde70fc6a592a8d3dafa08d5bb32e3981a02f31f6fc323a26bc03a4c063a9d56834848695bda7611c2417ea2e6 - languageName: node - linkType: hard - -"color-convert@npm:^1.3.0, color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: "npm:1.1.3" - checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 - languageName: node - linkType: hard - -"color-name@npm:^1.0.0": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 - languageName: node - linkType: hard - -"color-string@npm:^0.3.0": - version: 0.3.0 - resolution: "color-string@npm:0.3.0" - dependencies: - color-name: "npm:^1.0.0" - checksum: 10c0/836bbbf58358c541cc5558ecb0376a4c857f08ed37519c2ab63f3d57ec205b52af929629f3d2d58b7d6f7fb7b6769697d83694454b667698be4eb46654f1f818 - languageName: node - linkType: hard - -"color@npm:^0.11.0": - version: 0.11.4 - resolution: "color@npm:0.11.4" - dependencies: - clone: "npm:^1.0.2" - color-convert: "npm:^1.3.0" - color-string: "npm:^0.3.0" - checksum: 10c0/93abcc7e2eb7c254d42b96a889aab887d2bf6fedf901fc13af88f8885377b84a0f0f11a033c3e9ef9e37dca65214466261acc781f00fdec1c8d221d20c4120ee - languageName: node - linkType: hard - -"colormin@npm:^1.0.5": - version: 1.1.2 - resolution: "colormin@npm:1.1.2" - dependencies: - color: "npm:^0.11.0" - css-color-names: "npm:0.0.4" - has: "npm:^1.0.1" - checksum: 10c0/3488aca21bb100864c28b8070d5f86387fd4966bff93f552bb10cdc506a8ed9d42c4e239975b224c70eb664f170f543c74d8bda62f28216268141e8dba12777a - languageName: node - linkType: hard - -"colors@npm:~1.1.2": - version: 1.1.2 - resolution: "colors@npm:1.1.2" - checksum: 10c0/21fa4c575e636d889187b4666988ff16a6464a845089ff7b5e0263883da8cfa9140029300ba67bc3e231f67a4eb610725f9e77cc1d74df47741b691a695aea11 - languageName: node - linkType: hard - -"commander@npm:~2.13.0": - version: 2.13.0 - resolution: "commander@npm:2.13.0" - checksum: 10c0/e3441096034439e506493ca1e5e9d5d5723ee0eadc3b2b92b3dd332b1d8fcbe72b70a1127f6790e6b3bedde3054316e9fe2cb36cef6ac051000b01559a16ba58 - languageName: node - linkType: hard - -"commondir@npm:^1.0.1": - version: 1.0.1 - resolution: "commondir@npm:1.0.1" - checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f - languageName: node - linkType: hard - -"concat-stream@npm:^1.5.0": - version: 1.6.2 - resolution: "concat-stream@npm:1.6.2" - dependencies: - buffer-from: "npm:^1.0.0" - inherits: "npm:^2.0.3" - readable-stream: "npm:^2.2.2" - typedarray: "npm:^0.0.6" - checksum: 10c0/2e9864e18282946dabbccb212c5c7cec0702745e3671679eb8291812ca7fd12023f7d8cb36493942a62f770ac96a7f90009dc5c82ad69893438371720fa92617 - languageName: node - linkType: hard - -"console-browserify@npm:^1.1.0": - version: 1.2.0 - resolution: "console-browserify@npm:1.2.0" - checksum: 10c0/89b99a53b7d6cee54e1e64fa6b1f7ac24b844b4019c5d39db298637e55c1f4ffa5c165457ad984864de1379df2c8e1886cbbdac85d9dbb6876a9f26c3106f226 - languageName: node - linkType: hard - -"constants-browserify@npm:^1.0.0": - version: 1.0.0 - resolution: "constants-browserify@npm:1.0.0" - checksum: 10c0/ab49b1d59a433ed77c964d90d19e08b2f77213fb823da4729c0baead55e3c597f8f97ebccfdfc47bd896d43854a117d114c849a6f659d9986420e97da0f83ac5 - languageName: node - linkType: hard - -"copy-anything@npm:^2.0.1": - version: 2.0.6 - resolution: "copy-anything@npm:2.0.6" - dependencies: - is-what: "npm:^3.14.1" - checksum: 10c0/2702998a8cc015f9917385b7f16b0d85f1f6e5e2fd34d99f14df584838f492f49aa0c390d973684c687e895c5c58d08b308a0400ac3e1e3d6fa1e5884a5402ad - languageName: node - linkType: hard - -"copy-concurrently@npm:^1.0.0": - version: 1.0.5 - resolution: "copy-concurrently@npm:1.0.5" - dependencies: - aproba: "npm:^1.1.1" - fs-write-stream-atomic: "npm:^1.0.8" - iferr: "npm:^0.1.5" - mkdirp: "npm:^0.5.1" - rimraf: "npm:^2.5.4" - run-queue: "npm:^1.0.0" - checksum: 10c0/c2ce213cb27ee3df584d16eb6c9bfe99cfb531585007533c3e4c752521b4fbf0b2f7f90807d79c496683330808ecd9fdbd9ab9ddfa0913150b7f5097423348ce - languageName: node - linkType: hard - -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 - languageName: node - linkType: hard - -"create-ecdh@npm:^4.0.0": - version: 4.0.4 - resolution: "create-ecdh@npm:4.0.4" - dependencies: - bn.js: "npm:^4.1.0" - elliptic: "npm:^6.5.3" - checksum: 10c0/77b11a51360fec9c3bce7a76288fc0deba4b9c838d5fb354b3e40c59194d23d66efe6355fd4b81df7580da0661e1334a235a2a5c040b7569ba97db428d466e7f - languageName: node - linkType: hard - -"create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": - version: 1.2.0 - resolution: "create-hash@npm:1.2.0" - dependencies: - cipher-base: "npm:^1.0.1" - inherits: "npm:^2.0.1" - md5.js: "npm:^1.3.4" - ripemd160: "npm:^2.0.1" - sha.js: "npm:^2.4.0" - checksum: 10c0/d402e60e65e70e5083cb57af96d89567954d0669e90550d7cec58b56d49c4b193d35c43cec8338bc72358198b8cbf2f0cac14775b651e99238e1cf411490f915 - languageName: node - linkType: hard - -"create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": - version: 1.1.7 - resolution: "create-hmac@npm:1.1.7" - dependencies: - cipher-base: "npm:^1.0.3" - create-hash: "npm:^1.1.0" - inherits: "npm:^2.0.1" - ripemd160: "npm:^2.0.0" - safe-buffer: "npm:^5.0.1" - sha.js: "npm:^2.4.8" - checksum: 10c0/24332bab51011652a9a0a6d160eed1e8caa091b802335324ae056b0dcb5acbc9fcf173cf10d128eba8548c3ce98dfa4eadaa01bd02f44a34414baee26b651835 - languageName: node - linkType: hard - -"cross-spawn@npm:^5.0.1": - version: 5.1.0 - resolution: "cross-spawn@npm:5.1.0" - dependencies: - lru-cache: "npm:^4.0.1" - shebang-command: "npm:^1.2.0" - which: "npm:^1.2.9" - checksum: 10c0/1918621fddb9f8c61e02118b2dbf81f611ccd1544ceaca0d026525341832b8511ce2504c60f935dbc06b35e5ef156fe8c1e72708c27dd486f034e9c0e1e07201 - languageName: node - linkType: hard - -"crypto-browserify@npm:^3.11.0": - version: 3.12.0 - resolution: "crypto-browserify@npm:3.12.0" - dependencies: - browserify-cipher: "npm:^1.0.0" - browserify-sign: "npm:^4.0.0" - create-ecdh: "npm:^4.0.0" - create-hash: "npm:^1.1.0" - create-hmac: "npm:^1.1.0" - diffie-hellman: "npm:^5.0.0" - inherits: "npm:^2.0.1" - pbkdf2: "npm:^3.0.3" - public-encrypt: "npm:^4.0.0" - randombytes: "npm:^2.0.0" - randomfill: "npm:^1.0.3" - checksum: 10c0/0c20198886576050a6aa5ba6ae42f2b82778bfba1753d80c5e7a090836890dc372bdc780986b2568b4fb8ed2a91c958e61db1f0b6b1cc96af4bd03ffc298ba92 - languageName: node - linkType: hard - -"css-color-names@npm:0.0.4": - version: 0.0.4 - resolution: "css-color-names@npm:0.0.4" - checksum: 10c0/88ef97c25bcfb217469cdff428049022438cc546eb208210f0edec03b75050723db3ba02cd0f4959c84cd0659be0b43af3323eff80d1ba5fb15c2accf09ccbe2 - languageName: node - linkType: hard - -"css-loader@npm:^0.28.11": - version: 0.28.11 - resolution: "css-loader@npm:0.28.11" - dependencies: - babel-code-frame: "npm:^6.26.0" - css-selector-tokenizer: "npm:^0.7.0" - cssnano: "npm:^3.10.0" - icss-utils: "npm:^2.1.0" - loader-utils: "npm:^1.0.2" - lodash.camelcase: "npm:^4.3.0" - object-assign: "npm:^4.1.1" - postcss: "npm:^5.0.6" - postcss-modules-extract-imports: "npm:^1.2.0" - postcss-modules-local-by-default: "npm:^1.2.0" - postcss-modules-scope: "npm:^1.1.0" - postcss-modules-values: "npm:^1.3.0" - postcss-value-parser: "npm:^3.3.0" - source-list-map: "npm:^2.0.0" - checksum: 10c0/36434d7fafde8a4de3995c444713a455df17f74cfe10f089481cb7918db6f206267301daf2ae0496544809ca35bb226df47aa4edeb9580704c96281a07091f8b - languageName: node - linkType: hard - -"css-selector-tokenizer@npm:^0.7.0": - version: 0.7.3 - resolution: "css-selector-tokenizer@npm:0.7.3" - dependencies: - cssesc: "npm:^3.0.0" - fastparse: "npm:^1.1.2" - checksum: 10c0/bc4d14204bf5716f70085526bf370cbdd1c643dcb2e7366ba96212649fa5a07885e3f5dc2bde53646bac557ded79a60c7118cf7cf5d4dda898353a9e08277649 - languageName: node - linkType: hard - -"cssesc@npm:^3.0.0": - version: 3.0.0 - resolution: "cssesc@npm:3.0.0" - bin: - cssesc: bin/cssesc - checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7 - languageName: node - linkType: hard - -"cssnano@npm:^3.10.0": - version: 3.10.0 - resolution: "cssnano@npm:3.10.0" - dependencies: - autoprefixer: "npm:^6.3.1" - decamelize: "npm:^1.1.2" - defined: "npm:^1.0.0" - has: "npm:^1.0.1" - object-assign: "npm:^4.0.1" - postcss: "npm:^5.0.14" - postcss-calc: "npm:^5.2.0" - postcss-colormin: "npm:^2.1.8" - postcss-convert-values: "npm:^2.3.4" - postcss-discard-comments: "npm:^2.0.4" - postcss-discard-duplicates: "npm:^2.0.1" - postcss-discard-empty: "npm:^2.0.1" - postcss-discard-overridden: "npm:^0.1.1" - postcss-discard-unused: "npm:^2.2.1" - postcss-filter-plugins: "npm:^2.0.0" - postcss-merge-idents: "npm:^2.1.5" - postcss-merge-longhand: "npm:^2.0.1" - postcss-merge-rules: "npm:^2.0.3" - postcss-minify-font-values: "npm:^1.0.2" - postcss-minify-gradients: "npm:^1.0.1" - postcss-minify-params: "npm:^1.0.4" - postcss-minify-selectors: "npm:^2.0.4" - postcss-normalize-charset: "npm:^1.1.0" - postcss-normalize-url: "npm:^3.0.7" - postcss-ordered-values: "npm:^2.1.0" - postcss-reduce-idents: "npm:^2.2.2" - postcss-reduce-initial: "npm:^1.0.0" - postcss-reduce-transforms: "npm:^1.0.3" - postcss-svgo: "npm:^2.1.1" - postcss-unique-selectors: "npm:^2.0.2" - postcss-value-parser: "npm:^3.2.3" - postcss-zindex: "npm:^2.0.1" - checksum: 10c0/1231f79be4761fa61478fb2a51d1aa95798eb426e33cde95341b5e9c71ec56c170fcc4c8d0618a8961033efb9da6230539eea933431c983ef065c014865e50f4 - languageName: node - linkType: hard - -"csso@npm:~2.3.1": - version: 2.3.2 - resolution: "csso@npm:2.3.2" - dependencies: - clap: "npm:^1.0.9" - source-map: "npm:^0.5.3" - bin: - csso: ./bin/csso - checksum: 10c0/e36a1cae8f371327cbf22d6770b8827291fa4f372bbaab938d5afc869e73f0a452ba4e87738bf03bfbb3bba27770efa04a6b4acaf5f36e94f88e8c481b9df7fa - languageName: node - linkType: hard - -"cyclist@npm:^1.0.1": - version: 1.0.1 - resolution: "cyclist@npm:1.0.1" - checksum: 10c0/3381d3b66a3b268e6e0abcc1fa8fbeeb9a98391d8455677509f9833813d7680cc737a10141f54c229e42f5b3133250f36f1aa04f56ef4ba9b29fa728c3c48c01 - languageName: node - linkType: hard - -"d@npm:1, d@npm:^1.0.1": - version: 1.0.1 - resolution: "d@npm:1.0.1" - dependencies: - es5-ext: "npm:^0.10.50" - type: "npm:^1.0.1" - checksum: 10c0/1fedcb3b956a461f64d86b94b347441beff5cef8910b6ac4ec509a2c67eeaa7093660a98b26601ac91f91260238add73bdf25867a9c0cb783774642bc4c1523f - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.3.4": - version: 4.4.3 - resolution: "debug@npm:4.4.3" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 - languageName: node - linkType: hard - -"debug@npm:^3.2.6": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: "npm:^2.1.1" - checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a - languageName: node - linkType: hard - -"decamelize@npm:^1.1.1, decamelize@npm:^1.1.2": - version: 1.2.0 - resolution: "decamelize@npm:1.2.0" - checksum: 10c0/85c39fe8fbf0482d4a1e224ef0119db5c1897f8503bcef8b826adff7a1b11414972f6fef2d7dec2ee0b4be3863cf64ac1439137ae9e6af23a3d8dcbe26a5b4b2 - languageName: node - linkType: hard - -"defined@npm:^1.0.0": - version: 1.0.0 - resolution: "defined@npm:1.0.0" - checksum: 10c0/2b9929414857729a97cfcc77987e65005e03b3fd92747e1d6a743b054c1387b62e669dc453b53e3a8105f1398df6aad54c07eed984871c93be8c7f4560a1828b - languageName: node - linkType: hard - -"des.js@npm:^1.0.0": - version: 1.0.1 - resolution: "des.js@npm:1.0.1" - dependencies: - inherits: "npm:^2.0.1" - minimalistic-assert: "npm:^1.0.0" - checksum: 10c0/69bf742d1c381e01d75151bdcaac71a18d251d7debfc9b6ae5ee4b4edaf39691ae203c5ec9173ba89aedb3ddc622cdff4fca065448c6c2afb1140d9fb826339d - languageName: node - linkType: hard - -"diff@npm:~5.0.0": - version: 5.0.0 - resolution: "diff@npm:5.0.0" - checksum: 10c0/08c5904779bbababcd31f1707657b1ad57f8a9b65e6f88d3fb501d09a965d5f8d73066898a7d3f35981f9e4101892c61d99175d421f3b759533213c253d91134 - languageName: node - linkType: hard - -"diffie-hellman@npm:^5.0.0": - version: 5.0.3 - resolution: "diffie-hellman@npm:5.0.3" - dependencies: - bn.js: "npm:^4.1.0" - miller-rabin: "npm:^4.0.0" - randombytes: "npm:^2.0.0" - checksum: 10c0/ce53ccafa9ca544b7fc29b08a626e23a9b6562efc2a98559a0c97b4718937cebaa9b5d7d0a05032cc9c1435e9b3c1532b9e9bf2e0ede868525922807ad6e1ecf - languageName: node - linkType: hard - -"domain-browser@npm:^1.1.1": - version: 1.2.0 - resolution: "domain-browser@npm:1.2.0" - checksum: 10c0/a955f482f4b4710fbd77c12a33e77548d63603c30c80f61a80519f27e3db1ba8530b914584cc9e9365d2038753d6b5bd1f4e6c81e432b007b0ec95b8b5e69b1b - languageName: node - linkType: hard +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@centerforopenscience/list-of-licenses@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@centerforopenscience/list-of-licenses/-/list-of-licenses-1.1.0.tgz#2a4379633409205047e723e21cd818560a29ab45" + integrity sha512-EGU7gpRXczqC4TAlfKBiLzRaopxxZkL86kwS8/qdZdmRjTpG872z+bRd5E4ZJivxHBLpVpts5nK/bz4MsbdhTA== + +"@centerforopenscience/osf-style@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@centerforopenscience/osf-style/-/osf-style-1.9.0.tgz#0ab5cb17e2c531aafcc19e226f36ff86b734116e" + integrity sha512-R9IBVbz4eb/NkoM5TZGH46T9m5jspwK0H605O0oSMggHZPcTrf5gAHw0axeC26nKmEpz2FSXjvm84ziPNvhsvA== + +"@fortawesome/fontawesome-common-types@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-7.2.0.tgz#ae54831ab5974bc1a64e8b07410f2da2b4abf87f" + integrity sha512-IpR0bER9FY25p+e7BmFH25MZKEwFHTfRAfhOyJubgiDnoJNsSvJ7nigLraHtp4VOG/cy8D7uiV0dLkHOne5Fhw== + +"@fortawesome/fontawesome-free@^7.0.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz#188c1053ce422ad1f934d7df242a973fcb89636d" + integrity sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg== + +"@fortawesome/fontawesome-svg-core@^7.0.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-7.2.0.tgz#813550a5e8946a798e170d3f7331a685f8f8a550" + integrity sha512-6639htZMjEkwskf3J+e6/iar+4cTNM9qhoWuRfj9F3eJD6r7iCzV1SWnQr2Mdv0QT0suuqU8BoJCZUyCtP9R4Q== + dependencies: + "@fortawesome/fontawesome-common-types" "7.2.0" + +"@fortawesome/free-brands-svg-icons@^7.0.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-7.2.0.tgz#36f4306e671ad0acd23c1db96bde72e47d93e596" + integrity sha512-VNG8xqOip1JuJcC3zsVsKRQ60oXG9+oYNDCosjoU/H9pgYmLTEwWw8pE0jhPz/JWdHeUuK6+NQ3qsM4gIbdbYQ== + dependencies: + "@fortawesome/fontawesome-common-types" "7.2.0" + +"@fortawesome/react-fontawesome@^3.0.2": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-3.3.0.tgz#020364bdd71d785ffbb0e61425f53325f78fc647" + integrity sha512-EHmHeTf8WgO29sdY3iX/7ekE3gNUdlc2RW6mm/FzELlHFKfTrA9S4MlyquRR+RRCRCn8+jXfLFpLGB2l7wCWyw== + +URIjs@^1.14.1: + version "1.16.1" + resolved "https://registry.yarnpkg.com/URIjs/-/URIjs-1.16.1.tgz#edebc678b8b74b26b05d2b481e12383f5ae04b8b" + integrity sha512-ycFsR7J7p7Q+iJA4oVQP9tEnBEA7N/JD5RiOkLAhEeAmR1djRvZBpKCsWhmDaEoBNJLMhaCVpfLcRgqfaG6COw== + +acorn-dynamic-import@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" + integrity sha512-GKp5tQ8h0KMPWIYGRHHXI1s5tUpZixZ3IHF2jAu42wSCf6In/G873s6/y4DdKdhWvzhu1T6mE1JgvnhAKqyYYQ== + dependencies: + acorn "^4.0.3" + +acorn@^4.0.3: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + integrity sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug== + +acorn@^5.0.0: + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^5.0.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw== + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.1.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.14.0.tgz#fd067713e228210636ebb08c60bd3765d6dbe73a" + integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ== + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +asn1.js@^4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +assert@^1.1.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.1.tgz#038ab248e4ff078e7bc2485ba6e6388466c78f76" + integrity sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A== + dependencies: + object.assign "^4.1.4" + util "^0.10.4" + +assets-webpack-plugin@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/assets-webpack-plugin/-/assets-webpack-plugin-2.3.0.tgz#3e5fb861a19f1a9748aa02f56b8a03d7476ad0db" + integrity sha512-PqKXArZTW7wTnRp7sttlYbhBgNsa07z6Epk6csXa5ArkbGhlOexsJ4xAJqtdXslsgcP+xy3/qx3xG0W9+FAG4g== + dependencies: + camelcase "^1.2.1" + escape-string-regexp "^1.0.3" + mkdirp "^0.5.1" + +async@^2.1.2: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + +autoprefixer@^6.3.1: + version "6.7.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" + integrity sha512-WKExI/eSGgGAkWAO+wMVdFObZV7hQen54UpD1kCCTN3tvlL3W1jL4+lPP/M7MwoP7Q4RHzKtO3JQ4HxYEcd+xQ== + dependencies: + browserslist "^1.7.6" + caniuse-db "^1.0.30000634" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^5.2.16" + postcss-value-parser "^3.2.3" + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g== + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +balanced-match@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + integrity sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +bluebird@^3.5.1: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.3.tgz#2cc2c679188eb35b006f2d0d4710bed8437a769e" + integrity sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g== + +bn.js@^5.2.1, bn.js@^5.2.2: + version "5.2.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.3.tgz#16a9e409616b23fef3ccbedb8d42f13bff80295e" + integrity sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w== + +bootbox@^5.5.2: + version "5.5.3" + resolved "https://registry.yarnpkg.com/bootbox/-/bootbox-5.5.3.tgz#6b32da9c401a22b089e1544797cc9a91f1c35b23" + integrity sha512-B4mnm1DYgNHzoNtD7I0L/fixqvya4EEQy5bFF/yNmGI2Eq3WwVVwdfWf3hoF8KS+EaV4f0uIMqtxB1EAZwZPhQ== + +bootstrap@3.3.7, bootstrap@~3.3.2: + version "3.3.7" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.3.7.tgz#5a389394549f23330875a3b150656574f8a9eb71" + integrity sha512-qcFaisBrcBhTFkz1IUnGDYnX6ZWfFzH8zOixUDtHW9Ip+r+7MfMFav2rzy7cIHc7rgIg7xjhWBoo1mS/U26j4g== + +bootstrap@^3.3.7: + version "3.4.1" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.4.1.tgz#c3a347d419e289ad11f4033e3c4132b87c081d72" + integrity sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA== + +bower@^1.8.8: + version "1.8.14" + resolved "https://registry.yarnpkg.com/bower/-/bower-1.8.14.tgz#985722a3c1fcd35c93d4136ecbeafbeaaea74e86" + integrity sha512-8Rq058FD91q9Nwthyhw0la9fzpBz0iwZTrt51LWl+w+PnJgZk9J+5wp3nibsJcIUPglMYXr4NRBaR+TUj0OkBQ== + +brace-expansion@^1.1.7: + version "1.1.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browserify-aes@^1.0.4, browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.1.tgz#06e530907fe2949dc21fc3c2e2302e10b1437238" + integrity sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ== + dependencies: + bn.js "^5.2.1" + randombytes "^2.1.0" + safe-buffer "^5.2.1" + +browserify-sign@^4.2.3: + version "4.2.5" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.5.tgz#3979269fa8af55ba18aac35deef11b45515cd27d" + integrity sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw== + dependencies: + bn.js "^5.2.2" + browserify-rsa "^4.1.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.6.1" + inherits "^2.0.4" + parse-asn1 "^5.1.9" + readable-stream "^2.3.8" + safe-buffer "^5.2.1" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: + version "1.7.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" + integrity sha512-qHJblDE2bXVRYzuDetv/wAeHOJyO97+9wxC1cdCtyzgNuSozOyRCiiLaCR1f71AN66lQdVVBipWm63V+a7bPOw== + dependencies: + caniuse-db "^1.0.30000639" + electron-to-chromium "^1.2.7" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + +cacache@^10.0.4: + version "10.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA== + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" + +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +camelcase@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + integrity sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g== + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== + +caniuse-api@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" + integrity sha512-SBTl70K0PkDUIebbkXrxWqZlHNs0wRgRD6QZ8guctShjbh63gEPfF+Wj0Yw+75f5Y8tSzqAI/NcisYv/cCah2Q== + dependencies: + browserslist "^1.3.6" + caniuse-db "^1.0.30000529" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: + version "1.0.30001781" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001781.tgz#7bc16b681ec25e23bd8b2e02067b9cede707c778" + integrity sha512-gNw4Hl6IfkgyGMNzgGRWrnalOUASAYFiCFywQemHI9OU16PC6TRRhHEnR7taYC2/Mad/nDLkzXAEtejGuNsUfg== + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chownr@^1.0.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.7.tgz#bd094bfef42634ccfd9e13b9fc73274997111e39" + integrity sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + to-buffer "^1.2.2" + +clap@^1.0.9: + version "1.2.3" + resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" + integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA== + dependencies: + chalk "^1.1.3" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +coa@~1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" + integrity sha512-KAGck/eNAmCL0dcT3BiuYwLbExK6lduR8DxM3C1TyDzaXhZHyZ8ooX5I5+na2e3dPFuibfxrGdorr0/Lr7RYCQ== + dependencies: + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + +color-convert@^1.3.0, color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" + integrity sha512-sz29j1bmSDfoAxKIEU6zwoIZXN6BrFbAMIhfYCNyiZXBDuU/aiHlN84lp/xDzL2ubyFhLDobHIlU1X70XRrMDA== + dependencies: + color-name "^1.0.0" + +color@^0.11.0: + version "0.11.4" + resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" + integrity sha512-Ajpjd8asqZ6EdxQeqGzU5WBhhTfJ/0cA4Wlbre7e5vXfmDSmda7Ov6jeKoru+b0vHcb1CqvuroTHp5zIWzhVMA== + dependencies: + clone "^1.0.2" + color-convert "^1.3.0" + color-string "^0.3.0" + +colormin@^1.0.5: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" + integrity sha512-XSEQUUQUR/lXqGyddiNH3XYFUPYlYr1vXy9rTFMsSOw+J7Q6EQkdlQIrTlYn4TccpsOaUE1PYQNjBn20gwCdgQ== + dependencies: + color "^0.11.0" + css-color-names "0.0.4" + has "^1.0.1" + +colors@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + integrity sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w== + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== + +copy-anything@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-3.0.5.tgz#2d92dce8c498f790fa7ad16b01a1ae5a45b020a0" + integrity sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w== + dependencies: + is-what "^4.1.8" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +create-ecdh@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.1" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.1.tgz#bb8921bec9acc81633379aa8f52d69b0b69e0dac" + integrity sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ== + dependencies: + browserify-cipher "^1.0.1" + browserify-sign "^4.2.3" + create-ecdh "^4.0.4" + create-hash "^1.2.0" + create-hmac "^1.1.7" + diffie-hellman "^5.0.3" + hash-base "~3.0.4" + inherits "^2.0.4" + pbkdf2 "^3.1.2" + public-encrypt "^4.0.3" + randombytes "^2.1.0" + randomfill "^1.0.4" + +css-color-names@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q== + +css-loader@^0.28.11: + version "0.28.11" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" + integrity sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg== + dependencies: + babel-code-frame "^6.26.0" + css-selector-tokenizer "^0.7.0" + cssnano "^3.10.0" + icss-utils "^2.1.0" + loader-utils "^1.0.2" + lodash.camelcase "^4.3.0" + object-assign "^4.1.1" + postcss "^5.0.6" + postcss-modules-extract-imports "^1.2.0" + postcss-modules-local-by-default "^1.2.0" + postcss-modules-scope "^1.1.0" + postcss-modules-values "^1.3.0" + postcss-value-parser "^3.3.0" + source-list-map "^2.0.0" + +css-selector-tokenizer@^0.7.0: + version "0.7.3" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" + integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg== + dependencies: + cssesc "^3.0.0" + fastparse "^1.1.2" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" + integrity sha512-0o0IMQE0Ezo4b41Yrm8U6Rp9/Ag81vNXY1gZMnT1XhO4DpjEf2utKERqWJbOoz3g1Wdc1d3QSta/cIuJ1wSTEg== + dependencies: + autoprefixer "^6.3.1" + decamelize "^1.1.2" + defined "^1.0.0" + has "^1.0.1" + object-assign "^4.0.1" + postcss "^5.0.14" + postcss-calc "^5.2.0" + postcss-colormin "^2.1.8" + postcss-convert-values "^2.3.4" + postcss-discard-comments "^2.0.4" + postcss-discard-duplicates "^2.0.1" + postcss-discard-empty "^2.0.1" + postcss-discard-overridden "^0.1.1" + postcss-discard-unused "^2.2.1" + postcss-filter-plugins "^2.0.0" + postcss-merge-idents "^2.1.5" + postcss-merge-longhand "^2.0.1" + postcss-merge-rules "^2.0.3" + postcss-minify-font-values "^1.0.2" + postcss-minify-gradients "^1.0.1" + postcss-minify-params "^1.0.4" + postcss-minify-selectors "^2.0.4" + postcss-normalize-charset "^1.1.0" + postcss-normalize-url "^3.0.7" + postcss-ordered-values "^2.1.0" + postcss-reduce-idents "^2.2.2" + postcss-reduce-initial "^1.0.0" + postcss-reduce-transforms "^1.0.3" + postcss-svgo "^2.1.1" + postcss-unique-selectors "^2.0.2" + postcss-value-parser "^3.2.3" + postcss-zindex "^2.0.1" + +csso@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" + integrity sha512-FmCI/hmqDeHHLaIQckMhMZneS84yzUZdrWDAvJVVxOwcKE1P1LF9FGmzr1ktIQSxOw6fl3PaQsmfg+GN+VvR3w== + dependencies: + clap "^1.0.9" + source-map "^0.5.3" + +cyclist@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.2.tgz#673b5f233bf34d8e602b949429f8171d9121bea3" + integrity sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA== + +d@1, d@^1.0.1, d@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de" + integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== + dependencies: + es5-ext "^0.10.64" + type "^2.7.2" + +decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +defined@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== + +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +diff@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diffie-hellman@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== "dropzone@https://github.com/CenterForOpenScience/dropzone.git#aba21eb6b82cc823ac7a7a53d6e035791c082bae": - version: 4.3.0 - resolution: "dropzone@https://github.com/CenterForOpenScience/dropzone.git#commit=aba21eb6b82cc823ac7a7a53d6e035791c082bae" - checksum: 10c0/3512cf3c01a4bacfccebb9e9e99c78af0a1e5adf5e89a31fd5316b9d1cd396562f86727a7cb65d1dc57626a9557db6c8f11d96b98d405a2cf1409f35ede85590 - languageName: node - linkType: hard - -"duplexify@npm:^3.4.2, duplexify@npm:^3.6.0": - version: 3.7.1 - resolution: "duplexify@npm:3.7.1" - dependencies: - end-of-stream: "npm:^1.0.0" - inherits: "npm:^2.0.1" - readable-stream: "npm:^2.0.0" - stream-shift: "npm:^1.0.0" - checksum: 10c0/59d1440c1b4e3a4db35ae96933392703ce83518db1828d06b9b6322920d6cbbf0b7159e88be120385fe459e77f1eb0c7622f26e9ec1f47c9ff05c2b35747dbd3 - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.2.7": - version: 1.4.71 - resolution: "electron-to-chromium@npm:1.4.71" - checksum: 10c0/849e48d95b26a458485c5581c051fcd61594b6cb5a461871019d986097f8abe1efc405db9add00f73fbfdbf92bb0025c8c64410b06fecce835430c3bb88f7fdb - languageName: node - linkType: hard - -"elliptic@npm:^6.5.3": - version: 6.5.4 - resolution: "elliptic@npm:6.5.4" - dependencies: - bn.js: "npm:^4.11.9" - brorand: "npm:^1.1.0" - hash.js: "npm:^1.0.0" - hmac-drbg: "npm:^1.0.1" - inherits: "npm:^2.0.4" - minimalistic-assert: "npm:^1.0.1" - minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 10c0/5f361270292c3b27cf0843e84526d11dec31652f03c2763c6c2b8178548175ff5eba95341dd62baff92b2265d1af076526915d8af6cc9cb7559c44a62f8ca6e2 - languageName: node - linkType: hard - -"emojis-list@npm:^2.0.0": - version: 2.1.0 - resolution: "emojis-list@npm:2.1.0" - checksum: 10c0/bbb941223bfb3e38054cb52ed1b3098a8dac0a90fdd2699eb8a3af3b2172cdc4af0932e05c3edd52e814997c8f45cf1d7f5e86e9ecdcd4e2390a0f27e6914db5 - languageName: node - linkType: hard - -"emojis-list@npm:^3.0.0": - version: 3.0.0 - resolution: "emojis-list@npm:3.0.0" - checksum: 10c0/7dc4394b7b910444910ad64b812392159a21e1a7ecc637c775a440227dcb4f80eff7fe61f4453a7d7603fa23d23d30cc93fe9e4b5ed985b88d6441cd4a35117b - languageName: node - linkType: hard - -"end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" - dependencies: - once: "npm:^1.4.0" - checksum: 10c0/870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 - languageName: node - linkType: hard - -"enhanced-resolve@npm:^3.4.0": - version: 3.4.1 - resolution: "enhanced-resolve@npm:3.4.1" - dependencies: - graceful-fs: "npm:^4.1.2" - memory-fs: "npm:^0.4.0" - object-assign: "npm:^4.0.1" - tapable: "npm:^0.2.7" - checksum: 10c0/91f2da7e8e5ab2376823843a0e0176f683cfdb5749efbb6e1f26580b285593bb5b69006a1ae5e068c21ab1eb90271eec8b8fd6aa3ac36cc6f1f6de4d37a06456 - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 - languageName: node - linkType: hard - -"errno@npm:^0.1.1, errno@npm:^0.1.3, errno@npm:~0.1.7": - version: 0.1.8 - resolution: "errno@npm:0.1.8" - dependencies: - prr: "npm:~1.0.1" - bin: - errno: cli.js - checksum: 10c0/83758951967ec57bf00b5f5b7dc797e6d65a6171e57ea57adcf1bd1a0b477fd9b5b35fae5be1ff18f4090ed156bce1db749fe7e317aac19d485a5d150f6a4936 - languageName: node - linkType: hard - -"error-ex@npm:^1.2.0": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" - dependencies: - is-arrayish: "npm:^0.2.1" - checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce - languageName: node - linkType: hard - -"es5-ext@npm:^0.10.35, es5-ext@npm:^0.10.46, es5-ext@npm:^0.10.50, es5-ext@npm:~0.10.14": - version: 0.10.53 - resolution: "es5-ext@npm:0.10.53" - dependencies: - es6-iterator: "npm:~2.0.3" - es6-symbol: "npm:~3.1.3" - next-tick: "npm:~1.0.0" - checksum: 10c0/02989b89e777264756696baf64b6daf54e0be631b09870dfab8473e81129303c2791a001bf1f06bb38bf008403a0daad02e8001cb419ad8e4430452400ecd771 - languageName: node - linkType: hard - -"es6-iterator@npm:^2.0.3, es6-iterator@npm:~2.0.1, es6-iterator@npm:~2.0.3": - version: 2.0.3 - resolution: "es6-iterator@npm:2.0.3" - dependencies: - d: "npm:1" - es5-ext: "npm:^0.10.35" - es6-symbol: "npm:^3.1.1" - checksum: 10c0/91f20b799dba28fb05bf623c31857fc1524a0f1c444903beccaf8929ad196c8c9ded233e5ac7214fc63a92b3f25b64b7f2737fcca8b1f92d2d96cf3ac902f5d8 - languageName: node - linkType: hard - -"es6-map@npm:^0.1.3": - version: 0.1.5 - resolution: "es6-map@npm:0.1.5" - dependencies: - d: "npm:1" - es5-ext: "npm:~0.10.14" - es6-iterator: "npm:~2.0.1" - es6-set: "npm:~0.1.5" - es6-symbol: "npm:~3.1.1" - event-emitter: "npm:~0.3.5" - checksum: 10c0/62fe1a90ead1704bed699cb9c975e642023f590d5338c2a640d60ce0a846de7d5197561393ac03dd11473b96087cf8793c9e4836fe05ad4d2ef6afda6b9a3511 - languageName: node - linkType: hard - -"es6-set@npm:~0.1.5": - version: 0.1.5 - resolution: "es6-set@npm:0.1.5" - dependencies: - d: "npm:1" - es5-ext: "npm:~0.10.14" - es6-iterator: "npm:~2.0.1" - es6-symbol: "npm:3.1.1" - event-emitter: "npm:~0.3.5" - checksum: 10c0/a1fe925f77bd529b7b5135ca1a8bc9ff378fa0e3fd9686f3ac1b8e87eb00fbffc100e81a3c44262cd324cbfcc772d7a75ca5471e3fb24247ac85c5beb6af0d14 - languageName: node - linkType: hard - -"es6-symbol@npm:3.1.1": - version: 3.1.1 - resolution: "es6-symbol@npm:3.1.1" - dependencies: - d: "npm:1" - es5-ext: "npm:~0.10.14" - checksum: 10c0/eb4ec788a99dc2c04e5e9abd90f478991425a881eced99a7165eada0c832bfc9a8fbb76b688c3c3b6e103f94d23e8e19addf9cf18abb537fb918d066d5ce1d7f - languageName: node - linkType: hard - -"es6-symbol@npm:^3.1.1, es6-symbol@npm:~3.1.1, es6-symbol@npm:~3.1.3": - version: 3.1.3 - resolution: "es6-symbol@npm:3.1.3" - dependencies: - d: "npm:^1.0.1" - ext: "npm:^1.1.2" - checksum: 10c0/22982f815f00df553a89f4fb74c5048fed85df598482b4bd38dbd173174247949c72982a7d7132a58b147525398400e5f182db59b0916cb49f1e245fb0e22233 - languageName: node - linkType: hard - -"es6-weak-map@npm:^2.0.1": - version: 2.0.3 - resolution: "es6-weak-map@npm:2.0.3" - dependencies: - d: "npm:1" - es5-ext: "npm:^0.10.46" - es6-iterator: "npm:^2.0.3" - es6-symbol: "npm:^3.1.1" - checksum: 10c0/460932be9542473dbbddd183e21c15a66cfec1b2c17dae2b514e190d6fb2896b7eb683783d4b36da036609d2e1c93d2815f21b374dfccaf02a8978694c2f7b67 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.3, escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 - languageName: node - linkType: hard - -"escope@npm:^3.6.0": - version: 3.6.0 - resolution: "escope@npm:3.6.0" - dependencies: - es6-map: "npm:^0.1.3" - es6-weak-map: "npm:^2.0.1" - esrecurse: "npm:^4.1.0" - estraverse: "npm:^4.1.1" - checksum: 10c0/79cbb30bf126628eb7e586575b2f5fd31b14ea108cd2379c571fe4dc09ea5208f42dacf1cd43a702b59efccb128e9c9e7762d5cd670d2d184a889947aea509e5 - languageName: node - linkType: hard - -"esprima@npm:^2.6.0": - version: 2.7.3 - resolution: "esprima@npm:2.7.3" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: 10c0/6e1e99f280eed2ecd521ae28217c5f7c7a03fd0a1ac913bffd4a4ba278caf32cb8d9fc01e41d4b4bc904617282873dea297d60e1f93ea20156f29994c348a04f - languageName: node - linkType: hard - -"esrecurse@npm:^4.1.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: "npm:^5.2.0" - checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 - languageName: node - linkType: hard - -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d - languageName: node - linkType: hard - -"estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 - languageName: node - linkType: hard - -"event-emitter@npm:~0.3.5": - version: 0.3.5 - resolution: "event-emitter@npm:0.3.5" - dependencies: - d: "npm:1" - es5-ext: "npm:~0.10.14" - checksum: 10c0/75082fa8ffb3929766d0f0a063bfd6046bd2a80bea2666ebaa0cfd6f4a9116be6647c15667bea77222afc12f5b4071b68d393cf39fdaa0e8e81eda006160aff0 - languageName: node - linkType: hard - -"events@npm:^3.0.0": - version: 3.3.0 - resolution: "events@npm:3.3.0" - checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 - languageName: node - linkType: hard - -"evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3": - version: 1.0.3 - resolution: "evp_bytestokey@npm:1.0.3" - dependencies: - md5.js: "npm:^1.3.4" - node-gyp: "npm:latest" - safe-buffer: "npm:^5.1.1" - checksum: 10c0/77fbe2d94a902a80e9b8f5a73dcd695d9c14899c5e82967a61b1fc6cbbb28c46552d9b127cff47c45fcf684748bdbcfa0a50410349109de87ceb4b199ef6ee99 - languageName: node - linkType: hard - -"execa@npm:^0.7.0": - version: 0.7.0 - resolution: "execa@npm:0.7.0" - dependencies: - cross-spawn: "npm:^5.0.1" - get-stream: "npm:^3.0.0" - is-stream: "npm:^1.1.0" - npm-run-path: "npm:^2.0.0" - p-finally: "npm:^1.0.0" - signal-exit: "npm:^3.0.0" - strip-eof: "npm:^1.0.0" - checksum: 10c0/812f1776e2a6b2226532e43c1af87d8a12e26de03a06e7e043f653acf5565e0656f5f6c64d66726fefa17178ac129caaa419a50905934e7c4a846417abb25d4a - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.3 - resolution: "exponential-backoff@npm:3.1.3" - checksum: 10c0/77e3ae682b7b1f4972f563c6dbcd2b0d54ac679e62d5d32f3e5085feba20483cf28bd505543f520e287a56d4d55a28d7874299941faf637e779a1aa5994d1267 - languageName: node - linkType: hard - -"exports-loader@npm:0.6.3": - version: 0.6.3 - resolution: "exports-loader@npm:0.6.3" - dependencies: - loader-utils: "npm:0.2.x" - source-map: "npm:0.1.x" - checksum: 10c0/b793b51b9845e57b207533a02544cf25a35dde1aa71d69f25fa7607294768a3190e52155abf405bcd4a270b524063405ec548c7410e3028d1200c8d1b4d1c338 - languageName: node - linkType: hard - -"ext@npm:^1.1.2": - version: 1.6.0 - resolution: "ext@npm:1.6.0" - dependencies: - type: "npm:^2.5.0" - checksum: 10c0/d6ff29ca86fbe4e69743d10702ece124e0239faa435a6c3b2833282787b9eace2c8cbf5d8439d0c85312255d5472d251bf3cd4c4d1b9de8f8a8090e6b43db948 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^1.0.0": - version: 1.1.0 - resolution: "fast-deep-equal@npm:1.1.0" - checksum: 10c0/2cdcb17ca3c28ea199863de4ff0f4de14722c63bb19d716c1bbb4a661479413a0cbfb27e8596d34204e4525f0de11ff7c8ac6a27673c961bd0f37d0e48f9c743 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b - languageName: node - linkType: hard - -"fastparse@npm:^1.1.2": - version: 1.1.2 - resolution: "fastparse@npm:1.1.2" - checksum: 10c0/c08d6e7ef10c0928426c1963dd4593e2baaf44d223ab1e5ba5d7b30470144b3a4ecb3605958b73754cea3f857ecef00b67c885f07ca2c312b38b67d9d88b84b5 - languageName: node - linkType: hard - -"fdir@npm:^6.5.0": - version: 6.5.0 - resolution: "fdir@npm:6.5.0" - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f - languageName: node - linkType: hard - -"file-loader@npm:^0.11.2": - version: 0.11.2 - resolution: "file-loader@npm:0.11.2" - dependencies: - loader-utils: "npm:^1.0.2" - checksum: 10c0/55ce4c44ee84926cd8f913ba2e55f55c21425f47bf64b130d46d7d7f1cfb32571c997f726c46b6446b7364f062f90d9a4587792b6114afc4b55460b26915c055 - languageName: node - linkType: hard - -"find-cache-dir@npm:^1.0.0": - version: 1.0.0 - resolution: "find-cache-dir@npm:1.0.0" - dependencies: - commondir: "npm:^1.0.1" - make-dir: "npm:^1.0.0" - pkg-dir: "npm:^2.0.0" - checksum: 10c0/264b706771f30b39385cf921a5576c80ef95cb4c8ef2df8761b8be62326a1537ea63feecf0deac52cd84d6937b312a8d9554b4012a092937ade43a165cd5b6f9 - languageName: node - linkType: hard - -"find-up@npm:^2.0.0, find-up@npm:^2.1.0": - version: 2.1.0 - resolution: "find-up@npm:2.1.0" - dependencies: - locate-path: "npm:^2.0.0" - checksum: 10c0/c080875c9fe28eb1962f35cbe83c683796a0321899f1eed31a37577800055539815de13d53495049697d3ba313013344f843bb9401dd337a1b832be5edfc6840 - languageName: node - linkType: hard - -"flatten@npm:^1.0.2": - version: 1.0.3 - resolution: "flatten@npm:1.0.3" - checksum: 10c0/9f9b1f3dcd05be057bb83ec27f2513da5306e7bfc0cf8bd839ab423eb1b0f99683a25c97b48fafd5959819159659ce9f1397623a46f89a8577ba095fcf5fb753 - languageName: node - linkType: hard - -"flush-write-stream@npm:^1.0.0": - version: 1.1.1 - resolution: "flush-write-stream@npm:1.1.1" - dependencies: - inherits: "npm:^2.0.3" - readable-stream: "npm:^2.3.6" - checksum: 10c0/2cd4f65b728d5f388197a03dafabc6a5e4f0c2ed1a2d912e288f7aa1c2996dd90875e55b50cf32c78dca55ad2e2dfae5d3db09b223838388033d87cf5920dd87 - languageName: node - linkType: hard - -"from2@npm:^2.1.0": - version: 2.3.0 - resolution: "from2@npm:2.3.0" - dependencies: - inherits: "npm:^2.0.1" - readable-stream: "npm:^2.0.0" - checksum: 10c0/f87f7a2e4513244d551454a7f8324ef1f7837864a8701c536417286ec19ff4915606b1dfa8909a21b7591ebd8440ffde3642f7c303690b9a4d7c832d62248aa1 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 - languageName: node - linkType: hard - -"fs-write-stream-atomic@npm:^1.0.8": - version: 1.0.10 - resolution: "fs-write-stream-atomic@npm:1.0.10" - dependencies: - graceful-fs: "npm:^4.1.2" - iferr: "npm:^0.1.5" - imurmurhash: "npm:^0.1.4" - readable-stream: "npm:1 || 2" - checksum: 10c0/293b2b4ed346d35a28f8637a20cb2aef31be86503da501c42c2eda8fefed328bac16ce0e5daa7019f9329d73930c58031eaea2ce0c70f1680943fbfb7cff808b - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 - languageName: node - linkType: hard - -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: 10c0/60b74b2407e1942e1ed7f8c284f8ef714d0689dcfce5319985a5b7da3fc727f40b4a59ec72dc55aa83365ad7b8fa4fac3a30d93c850a2b452f29ae03dbc10a1e - languageName: node - linkType: hard - -"get-caller-file@npm:^1.0.1": - version: 1.0.3 - resolution: "get-caller-file@npm:1.0.3" - checksum: 10c0/763dcee2de8ff60ae7e13a4bad8306205a2fbe108e555686344ddd9ef211b8bebfe459d3a739669257014c59e7cc1e7a44003c21af805c1214673e6a45f06c51 - languageName: node - linkType: hard - -"get-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "get-stream@npm:3.0.0" - checksum: 10c0/003f5f3b8870da59c6aafdf6ed7e7b07b48c2f8629cd461bd3900726548b6b8cfa2e14d6b7814fbb08f07a42f4f738407fa70b989928b2783a76b278505bba22 - languageName: node - linkType: hard - -"glob-to-regexp@npm:^0.4.1": - version: 0.4.1 - resolution: "glob-to-regexp@npm:0.4.1" - checksum: 10c0/0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 - languageName: node - linkType: hard - -"glob@npm:^13.0.0": - version: 13.0.6 - resolution: "glob@npm:13.0.6" - dependencies: - minimatch: "npm:^10.2.2" - minipass: "npm:^7.1.3" - path-scurry: "npm:^2.0.2" - checksum: 10c0/269c236f11a9b50357fe7a8c6aadac667e01deb5242b19c84975628f05f4438d8ee1354bb62c5d6c10f37fd59911b54d7799730633a2786660d8c69f1d18120a - languageName: node - linkType: hard - -"glob@npm:^7.1.2, glob@npm:^7.1.3": - version: 7.2.0 - resolution: "glob@npm:7.2.0" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.0.4" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10c0/478b40e38be5a3d514e64950e1e07e0ac120585add6a37c98d0ed24d72d9127d734d2a125786073c8deb687096e84ae82b641c441a869ada3a9cc91b68978632 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2": - version: 4.2.9 - resolution: "graceful-fs@npm:4.2.9" - checksum: 10c0/2a66760ce6677ca18a24a1ef15d440cfd970086446af1e78c9e9de083c48122d8bd9c3fdc37f8f80f34aae833fa0d9dd52725e75a1c3f433ddd34eece39e7376 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 - languageName: node - linkType: hard - -"gsap@npm:3.9.1": - version: 3.9.1 - resolution: "gsap@npm:3.9.1" - checksum: 10c0/0be73e9e46972e9456b8af16f9f4eb666cef81a1a56b73f0d1a267ee121d95356cff3d068001b182d71bf20bb1efe3d751161d96ca49d54294d89e56f9f71735 - languageName: node - linkType: hard - -"has-ansi@npm:^2.0.0": - version: 2.0.0 - resolution: "has-ansi@npm:2.0.0" - dependencies: - ansi-regex: "npm:^2.0.0" - checksum: 10c0/f54e4887b9f8f3c4bfefd649c48825b3c093987c92c27880ee9898539e6f01aed261e82e73153c3f920fde0db5bf6ebd58deb498ed1debabcb4bc40113ccdf05 - languageName: node - linkType: hard - -"has-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-flag@npm:1.0.0" - checksum: 10c0/d0ad4bebbbc005edccfa1e2c0600c89375be5663d23f49a129e0f817187405748b0b515abfc5b3c209c92692e39bb0481c83c0ee4df69433d6ffd0242183100b - languageName: node - linkType: hard - -"has-flag@npm:^2.0.0": - version: 2.0.0 - resolution: "has-flag@npm:2.0.0" - checksum: 10c0/5e1f136c7f801c2719048bedfabcf834a1ed46276cd4c98c6fcddb89a482f5d6a16df0771a38805cfc2d9010b4de157909e1a71b708e1d339b6e311041bde9b4 - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 - languageName: node - linkType: hard - -"has@npm:^1.0.1, has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" - dependencies: - function-bind: "npm:^1.1.1" - checksum: 10c0/e1da0d2bd109f116b632f27782cf23182b42f14972ca9540e4c5aa7e52647407a0a4a76937334fddcb56befe94a3494825ec22b19b51f5e5507c3153fd1a5e1b - languageName: node - linkType: hard - -"hash-base@npm:^3.0.0": - version: 3.1.0 - resolution: "hash-base@npm:3.1.0" - dependencies: - inherits: "npm:^2.0.4" - readable-stream: "npm:^3.6.0" - safe-buffer: "npm:^5.2.0" - checksum: 10c0/663eabcf4173326fbb65a1918a509045590a26cc7e0964b754eef248d281305c6ec9f6b31cb508d02ffca383ab50028180ce5aefe013e942b44a903ac8dc80d0 - languageName: node - linkType: hard - -"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": - version: 1.1.7 - resolution: "hash.js@npm:1.1.7" - dependencies: - inherits: "npm:^2.0.3" - minimalistic-assert: "npm:^1.0.1" - checksum: 10c0/41ada59494eac5332cfc1ce6b7ebdd7b88a3864a6d6b08a3ea8ef261332ed60f37f10877e0c825aaa4bddebf164fbffa618286aeeec5296675e2671cbfa746c4 - languageName: node - linkType: hard - -"highlight.js@npm:~9.18.2": - version: 9.18.5 - resolution: "highlight.js@npm:9.18.5" - checksum: 10c0/bad99a5bfd31825769f76718e54372d291b9c3ad197df3c3102066c5baa08ee611f6a2aa6ffdc7e1cd24c7d4025b0b6db965837a14cbc4d4d06f2ad2fbf07a3d - languageName: node - linkType: hard - -"hmac-drbg@npm:^1.0.1": - version: 1.0.1 - resolution: "hmac-drbg@npm:1.0.1" - dependencies: - hash.js: "npm:^1.0.3" - minimalistic-assert: "npm:^1.0.0" - minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 10c0/f3d9ba31b40257a573f162176ac5930109816036c59a09f901eb2ffd7e5e705c6832bedfff507957125f2086a0ab8f853c0df225642a88bf1fcaea945f20600d - languageName: node - linkType: hard - -"hosted-git-info@npm:^2.1.4": - version: 2.8.9 - resolution: "hosted-git-info@npm:2.8.9" - checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 - languageName: node - linkType: hard - -"html-comment-regex@npm:^1.1.0": - version: 1.1.2 - resolution: "html-comment-regex@npm:1.1.2" - checksum: 10c0/c6fe47e7efbb2e853217854cdf352e53a6d414f87a6029456010250179f9ac2c77ef657dd4e26f4d3930f8def0e2fad015c233a3181a195a59fb4eeda6d333f9 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.2.0 - resolution: "http-cache-semantics@npm:4.2.0" - checksum: 10c0/45b66a945cf13ec2d1f29432277201313babf4a01d9e52f44b31ca923434083afeca03f18417f599c9ab3d0e7b618ceb21257542338b57c54b710463b4a53e37 - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: "npm:^7.1.0" - debug: "npm:^4.3.4" - checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 - languageName: node - linkType: hard - -"https-browserify@npm:^1.0.0": - version: 1.0.0 - resolution: "https-browserify@npm:1.0.0" - checksum: 10c0/e17b6943bc24ea9b9a7da5714645d808670af75a425f29baffc3284962626efdc1eb3aa9bbffaa6e64028a6ad98af5b09fabcb454a8f918fb686abfdc9e9b8ae - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.1": - version: 7.0.6 - resolution: "https-proxy-agent@npm:7.0.6" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:4" - checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac - languageName: node - linkType: hard - -"iconv-lite@npm:^0.4.4": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3" - checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.7.2": - version: 0.7.2 - resolution: "iconv-lite@npm:0.7.2" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/3c228920f3bd307f56bf8363706a776f4a060eb042f131cd23855ceca962951b264d0997ab38a1ad340e1c5df8499ed26e1f4f0db6b2a2ad9befaff22f14b722 - languageName: node - linkType: hard - -"icss-replace-symbols@npm:^1.1.0": - version: 1.1.0 - resolution: "icss-replace-symbols@npm:1.1.0" - checksum: 10c0/aaa5b67f82781fccc77bf6df14eaa9177ce3944462ef82b2b9e3b9f17d8fcd90f8851ffd5e6e249ebc5c464bfda07c2eccce2d122274c51c9d5b359b087f7049 - languageName: node - linkType: hard - -"icss-utils@npm:^2.1.0": - version: 2.1.0 - resolution: "icss-utils@npm:2.1.0" - dependencies: - postcss: "npm:^6.0.1" - checksum: 10c0/69d3b8fdea58fbf5c26d8dc2d1b7d8ded34fd8fb0800ed60b390e0ae5f596e77b155c587fb62e7642d1064d2d72fc672676df58ef935eba7303d79467e43edbf - languageName: node - linkType: hard - -"ieee754@npm:^1.1.4": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb - languageName: node - linkType: hard - -"iferr@npm:^0.1.5": - version: 0.1.5 - resolution: "iferr@npm:0.1.5" - checksum: 10c0/e0669b1757d0501b43a158321945d1cc1fe56f28a972df2f88a5818f05c8853c7669ba5d6cfbbf9a1a312850699de6e528626df108d559005df7e15d16ee334c - languageName: node - linkType: hard - -"image-size@npm:~0.5.0": - version: 0.5.5 - resolution: "image-size@npm:0.5.5" - bin: - image-size: bin/image-size.js - checksum: 10c0/655204163af06732f483a9fe7cce9dff4a29b7b2e88f5c957a5852e8143fa750f5e54b1955a2ca83de99c5220dbd680002d0d4e09140b01433520f4d5a0b1f4c - languageName: node - linkType: hard - -"imports-loader@npm:^0.6.3": - version: 0.6.5 - resolution: "imports-loader@npm:0.6.5" - dependencies: - loader-utils: "npm:0.2.x" - source-map: "npm:0.1.x" - checksum: 10c0/177b4a74af7ee4ae058ee3e49c8590ef3f0dfab7ca9e87ef762bf7c7a502235d32108dc4e1641c6fc869581815caff050282693aa47bf3479cade6fd6ff87a5f - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 - languageName: node - linkType: hard - -"indexes-of@npm:^1.0.1": - version: 1.0.1 - resolution: "indexes-of@npm:1.0.1" - checksum: 10c0/1ea1d2d00173fa38f728acfa00303657e1115361481e52f6cbae47c5d603219006c9357abf6bc323f1fb0fbe937e363bbb19e5c66c12578eea6ec6b7e892bdba - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: "npm:^1.3.0" - wrappy: "npm:1" - checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 - languageName: node - linkType: hard - -"inherits@npm:2.0.1": - version: 2.0.1 - resolution: "inherits@npm:2.0.1" - checksum: 10c0/bfc7b37c21a2cddb272adc65b053b1716612d408bb2c9a4e5c32679dc2b08032aadd67880c405be3dff060a62e45b353fc3d9fa79a3067ad7a3deb6a283cc5c6 - languageName: node - linkType: hard - -"inherits@npm:2.0.3": - version: 2.0.3 - resolution: "inherits@npm:2.0.3" - checksum: 10c0/6e56402373149ea076a434072671f9982f5fad030c7662be0332122fe6c0fa490acb3cc1010d90b6eff8d640b1167d77674add52dfd1bb85d545cf29e80e73e7 - languageName: node - linkType: hard - -"interpret@npm:^1.0.0": - version: 1.4.0 - resolution: "interpret@npm:1.4.0" - checksum: 10c0/08c5ad30032edeec638485bc3f6db7d0094d9b3e85e0f950866600af3c52e9fd69715416d29564731c479d9f4d43ff3e4d302a178196bdc0e6837ec147640450 - languageName: node - linkType: hard - -"invert-kv@npm:^1.0.0": - version: 1.0.0 - resolution: "invert-kv@npm:1.0.0" - checksum: 10c0/9ccef12ada8494c56175cc0380b4cea18b6c0a368436f324a30e43a332db90bdfb83cd3a7987b71df359cdf931ce45b7daf35b677da56658565d61068e4bc20b - languageName: node - linkType: hard - -"ip-address@npm:^10.0.1": - version: 10.1.0 - resolution: "ip-address@npm:10.1.0" - checksum: 10c0/0103516cfa93f6433b3bd7333fa876eb21263912329bfa47010af5e16934eeeff86f3d2ae700a3744a137839ddfad62b900c7a445607884a49b5d1e32a3d7566 - languageName: node - linkType: hard - -"is-absolute-url@npm:^2.0.0": - version: 2.1.0 - resolution: "is-absolute-url@npm:2.1.0" - checksum: 10c0/2c324c3118752d82c18afadffbea14d35224e76f37a2ee80e05b209386c46d19bef77b58ede41f7b3be552cde16c6cdb0d884807175a6eb40e8c61281dc67c2f - languageName: node - linkType: hard - -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 - languageName: node - linkType: hard - -"is-core-module@npm:^2.8.1": - version: 2.8.1 - resolution: "is-core-module@npm:2.8.1" - dependencies: - has: "npm:^1.0.3" - checksum: 10c0/f1139970deb2ec159c54be154d35cd17d71b9b56c60221ff7c8c328ca7efe20b6d676cef43d08c21966e162bfd5068dcd0ce23e64c77b76a19824563ecd82e0e - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^1.0.0": - version: 1.0.0 - resolution: "is-fullwidth-code-point@npm:1.0.0" - dependencies: - number-is-nan: "npm:^1.0.0" - checksum: 10c0/12acfcf16142f2d431bf6af25d68569d3198e81b9799b4ae41058247aafcc666b0127d64384ea28e67a746372611fcbe9b802f69175287aba466da3eddd5ba0f - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^2.0.0": - version: 2.0.0 - resolution: "is-fullwidth-code-point@npm:2.0.0" - checksum: 10c0/e58f3e4a601fc0500d8b2677e26e9fe0cd450980e66adb29d85b6addf7969731e38f8e43ed2ec868a09c101a55ac3d8b78902209269f38c5286bc98f5bc1b4d9 - languageName: node - linkType: hard - -"is-plain-obj@npm:^1.0.0": - version: 1.1.0 - resolution: "is-plain-obj@npm:1.1.0" - checksum: 10c0/daaee1805add26f781b413fdf192fc91d52409583be30ace35c82607d440da63cc4cac0ac55136716688d6c0a2c6ef3edb2254fecbd1fe06056d6bd15975ee8c - languageName: node - linkType: hard - -"is-stream@npm:^1.1.0": - version: 1.1.0 - resolution: "is-stream@npm:1.1.0" - checksum: 10c0/b8ae7971e78d2e8488d15f804229c6eed7ed36a28f8807a1815938771f4adff0e705218b7dab968270433f67103e4fef98062a0beea55d64835f705ee72c7002 - languageName: node - linkType: hard - -"is-svg@npm:^2.0.0": - version: 2.1.0 - resolution: "is-svg@npm:2.1.0" - dependencies: - html-comment-regex: "npm:^1.1.0" - checksum: 10c0/b2709e619c6159dabd27731c7ff69b73319bc8694b1dd27dc886026a6e1f895f04c1cc9903ca90310d3766a5f2d01a959735ae9a69be71f3cc9545f8206e1bb9 - languageName: node - linkType: hard - -"is-what@npm:^3.14.1": - version: 3.14.1 - resolution: "is-what@npm:3.14.1" - checksum: 10c0/4b770b85454c877b6929a84fd47c318e1f8c2ff70fd72fd625bc3fde8e0c18a6e57345b6e7aa1ee9fbd1c608d27cfe885df473036c5c2e40cd2187250804a2c7 - languageName: node - linkType: hard - -"isarray@npm:^1.0.0, isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d - languageName: node - linkType: hard - -"isexe@npm:^4.0.0": - version: 4.0.0 - resolution: "isexe@npm:4.0.0" - checksum: 10c0/5884815115bceac452877659a9c7726382531592f43dc29e5d48b7c4100661aed54018cb90bd36cb2eaeba521092570769167acbb95c18d39afdccbcca06c5ce - languageName: node - linkType: hard - -"jquery-ui@npm:>=1.10.4": - version: 1.13.1 - resolution: "jquery-ui@npm:1.13.1" - dependencies: - jquery: "npm:>=1.8.0 <4.0.0" - checksum: 10c0/8e3935b47eaab3a29a8ec3fb93287fae23ffebc2600d6537eda4ab246a19b2b31d7663c0baefbc3af339fa434df80037bb2c7945af41c00f732c00812edde3f3 - languageName: node - linkType: hard - -"jquery@npm:>=1.11.0, jquery@npm:>=1.7, jquery@npm:>=1.8.0 <4.0.0, jquery@npm:^3.5.1": - version: 3.6.0 - resolution: "jquery@npm:3.6.0" - checksum: 10c0/45a63f8376a8918087c0277b2394dd382fcacff765c41ccbb5009a9336f8c971bf41c6a0519062edc1dff6333d96959c3a3ec55c95eb6c94d5372253d6cbf82f - languageName: node - linkType: hard - -"js-base64@npm:^2.1.9": - version: 2.6.4 - resolution: "js-base64@npm:2.6.4" - checksum: 10c0/95d93c4eca0bbe0f2d5ffe8682d9acd23051e5c0ad71873ff5a48dd46a5f19025de9f7b36e63fa3f02f342ae4a8ca4c56e7b590d7300ebb6639ce09675e0fd02 - languageName: node - linkType: hard - -"js-cookie@npm:3.0.1": - version: 3.0.1 - resolution: "js-cookie@npm:3.0.1" - checksum: 10c0/a7dab91286c49610fb198bcc0d78fbafe9be869cf3cea6f7eaea515abdfdc9d347982fe22316e34666b479a0701119482d46faa3a350a3a3404eb954405edf72 - languageName: node - linkType: hard - -"js-md5@npm:^0.7.3": - version: 0.7.3 - resolution: "js-md5@npm:0.7.3" - checksum: 10c0/3e7048590c40edb0b8fb290e13a81d6eebbd682c70c520c4853820ae8fe3a3c5e375cfa0ca9a731aa8d8e0ba82cd8f922fea34c737caf72a7f9ab819bb8382a7 - languageName: node - linkType: hard - -"js-tokens@npm:^3.0.2": - version: 3.0.2 - resolution: "js-tokens@npm:3.0.2" - checksum: 10c0/e3c3ee4d12643d90197628eb022a2884a15f08ea7dcac1ce97fdeee43031fbfc7ede674f2cdbbb582dcd4c94388b22e52d56c6cbeb2ac7d1b57c2f33c405e2ba - languageName: node - linkType: hard - -"js-yaml@npm:~3.7.0": - version: 3.7.0 - resolution: "js-yaml@npm:3.7.0" - dependencies: - argparse: "npm:^1.0.7" - esprima: "npm:^2.6.0" - bin: - js-yaml: bin/js-yaml.js - checksum: 10c0/e236852d4439c7750c810f217ca80631844cfb0e4ab4993349c3e612ee273256d9895e1bb06b3990a3cc42fa1105ffcaa55a6b711f25901c0d803287bdcf52e1 - languageName: node - linkType: hard - -"json-loader@npm:^0.5.4": - version: 0.5.7 - resolution: "json-loader@npm:0.5.7" - checksum: 10c0/b155b81f644693b5418e595c127c552c34373f749d2d125df24cfe753de6b3b0af88dda5d58e7b65940ed03ec46c19fc3d09f53b932b45c9ae3ca1fb55e44a15 - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.3.0": - version: 0.3.1 - resolution: "json-schema-traverse@npm:0.3.1" - checksum: 10c0/462316de759d3dd9278959de17861e8d214c3722e1f0bf3c510daac990009bc2b0e11e89f9b299d765cd52569db74c8fa1a371a2b08c514a07998fb2f10eb57e - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce - languageName: node - linkType: hard - -"json5@npm:^0.5.0, json5@npm:^0.5.1": - version: 0.5.1 - resolution: "json5@npm:0.5.1" - bin: - json5: lib/cli.js - checksum: 10c0/aca0ab7ccf1883d3fc2ecc16219bc389716a773f774552817deaadb549acc0bb502e317a81946fc0a48f9eb6e0822cf1dc5a097009203f2c94de84c8db02a1f3 - languageName: node - linkType: hard - -"json5@npm:^1.0.1": - version: 1.0.1 - resolution: "json5@npm:1.0.1" - dependencies: - minimist: "npm:^1.2.0" - bin: - json5: lib/cli.js - checksum: 10c0/7f75dd797151680a4e14c4224c1343b32a43272aa6e6333ddec2b0822df4ea116971689b251879a1248592da24f7929902c13f83d7390c3f3d44f18e8e9719f5 - languageName: node - linkType: hard - -"jstimezonedetect@npm:^1.0.6": - version: 1.0.7 - resolution: "jstimezonedetect@npm:1.0.7" - checksum: 10c0/8ea4eb123e007bf585cd5ed82ef8033bdeb5dcd4f4ffdec4cd9c69dbb1c7497370db931f024721edcab659eabe89c8f9ef1f882e84369e70aec1630584e4f019 - languageName: node - linkType: hard - -"knockout.validation@npm:^2.0.2": - version: 2.0.4 - resolution: "knockout.validation@npm:2.0.4" - peerDependencies: - knockout: ">=2.3.0" - checksum: 10c0/fac8708108303b307b37b4382c4206004bdf216b85226835e868d731e872981dcd8c222ec91cc6028874e00ae43f29c1297bb60a87b17f06e5e72525c150763b - languageName: node - linkType: hard - -"knockout@npm:~3.4.2": - version: 3.4.2 - resolution: "knockout@npm:3.4.2" - checksum: 10c0/dd2f4973f72f54eeef2fd4306957a7158910c6046d636432ac0decae796be66925bf7d227b1f0b5c1fe3da479d7fbe15f6d518e4d5cfd812dd7bb8511907a465 - languageName: node - linkType: hard - -"lcid@npm:^1.0.0": - version: 1.0.0 - resolution: "lcid@npm:1.0.0" - dependencies: - invert-kv: "npm:^1.0.0" - checksum: 10c0/87fb32196c3c80458778f34f71c042e114f3134a3c86c0d60ee9c94f0750e467d7ca0c005a5224ffd9d49a6e449b5e5c31e1544f1827765a0ba8747298f5980e - languageName: node - linkType: hard - -"less@npm:^4.1.2": - version: 4.1.2 - resolution: "less@npm:4.1.2" - dependencies: - copy-anything: "npm:^2.0.1" - errno: "npm:^0.1.1" - graceful-fs: "npm:^4.1.2" - image-size: "npm:~0.5.0" - make-dir: "npm:^2.1.0" - mime: "npm:^1.4.1" - needle: "npm:^2.5.2" - parse-node-version: "npm:^1.0.1" - source-map: "npm:~0.6.0" - tslib: "npm:^2.3.0" - dependenciesMeta: - errno: - optional: true - graceful-fs: - optional: true - image-size: - optional: true - make-dir: - optional: true - mime: - optional: true - needle: - optional: true - source-map: - optional: true - bin: - lessc: bin/lessc - checksum: 10c0/fa5ea22f81ce12d127881742d7a2b6666727751214c6f014a7793ebb7e406a153a46bb3c77c86adf68e1b79bc7477a156f84b01dfff56c532591fbb094194b5a - languageName: node - linkType: hard - -"linkifyjs@npm:^3.0.5": - version: 3.0.5 - resolution: "linkifyjs@npm:3.0.5" - checksum: 10c0/a5d6565e457fabcae73400923f9999cf0651108378e61bb112b0d651d0d260450d22107d31127fcc38cfe9c3604bb59dfcc25db388a1eeabc09d53a5177da7fc - languageName: node - linkType: hard - -"load-json-file@npm:^2.0.0": - version: 2.0.0 - resolution: "load-json-file@npm:2.0.0" - dependencies: - graceful-fs: "npm:^4.1.2" - parse-json: "npm:^2.2.0" - pify: "npm:^2.0.0" - strip-bom: "npm:^3.0.0" - checksum: 10c0/15cf1259361325fadfc54cd4ecc5d6729103c8873492001ba5473fb1ef753000f680c887db6c86fec69a4ede009efeb8c0c0c77b2a31bc54d2793767e25577c9 - languageName: node - linkType: hard - -"loader-runner@npm:^2.3.0": - version: 2.4.0 - resolution: "loader-runner@npm:2.4.0" - checksum: 10c0/1f723bd8318453c2d073d7befbf891ba6d2a02f22622688bf7d22e7ba527a0f9476c7fdfedc6bfa2b55c0389d9f406f3a5239ed1b33c9088d77cfed085086a1e - languageName: node - linkType: hard - -"loader-utils@npm:0.2.x": - version: 0.2.17 - resolution: "loader-utils@npm:0.2.17" - dependencies: - big.js: "npm:^3.1.3" - emojis-list: "npm:^2.0.0" - json5: "npm:^0.5.0" - object-assign: "npm:^4.0.1" - checksum: 10c0/d6b65a0d460d2c8621f72e0471127895f4a25ea3a5d2caabf0710c8e58a904af5876834c6ad89d2fbab35e74c6e7f2f4f8137559e6e4e84b74957f4592bcab0b - languageName: node - linkType: hard - -"loader-utils@npm:^1.0.2, loader-utils@npm:^1.1.0": - version: 1.4.0 - resolution: "loader-utils@npm:1.4.0" - dependencies: - big.js: "npm:^5.2.2" - emojis-list: "npm:^3.0.0" - json5: "npm:^1.0.1" - checksum: 10c0/b3f383612c23c0adf535d61709fb3eaf864afa54dae45608e3831156b89b4b05a0a4ddc6db7d742071babe872750ba3f4f9ce89326d94f6e096dbed978fa424e - languageName: node - linkType: hard - -"loaders.css@npm:^0.1.2": - version: 0.1.2 - resolution: "loaders.css@npm:0.1.2" - checksum: 10c0/962b49327a906fa3d9dd4551ef46c6ba8e0f56fb700b1ab20843169a0dc90b1992a08fa55ddaf42feb5700833ecf8b389cb6f1b8c20dd2594037b1d74a5e9e50 - languageName: node - linkType: hard - -"locate-path@npm:^2.0.0": - version: 2.0.0 - resolution: "locate-path@npm:2.0.0" - dependencies: - p-locate: "npm:^2.0.0" - path-exists: "npm:^3.0.0" - checksum: 10c0/24efa0e589be6aa3c469b502f795126b26ab97afa378846cb508174211515633b770aa0ba610cab113caedab8d2a4902b061a08aaed5297c12ab6f5be4df0133 - languageName: node - linkType: hard - -"lodash.camelcase@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.camelcase@npm:4.3.0" - checksum: 10c0/fcba15d21a458076dd309fce6b1b4bf611d84a0ec252cb92447c948c533ac250b95d2e00955801ebc367e5af5ed288b996d75d37d2035260a937008e14eaf432 - languageName: node - linkType: hard - -"lodash.find@npm:^4.3.0": - version: 4.6.0 - resolution: "lodash.find@npm:4.6.0" - checksum: 10c0/0238f3abc0b87aa441820ab0ab31a81156e1809a66285f454fbea18cbdf4d16572d504dd9e96c22df8a36b81d0272bca9205d09d217d61f9b53fa3358023377f - languageName: node - linkType: hard - -"lodash.get@npm:^4.2.1": - version: 4.4.2 - resolution: "lodash.get@npm:4.4.2" - checksum: 10c0/48f40d471a1654397ed41685495acb31498d5ed696185ac8973daef424a749ca0c7871bf7b665d5c14f5cc479394479e0307e781f61d5573831769593411be6e - languageName: node - linkType: hard - -"lodash.has@npm:^4.5.2": - version: 4.5.2 - resolution: "lodash.has@npm:4.5.2" - checksum: 10c0/3ffa9e549f321996a5fdf6204494c035ff550b2df703f936a448c553131bbb55492b4e7995bb13500648b50b268ed8afc974a7a0c0a43744d28d61cc95cb1ffe - languageName: node - linkType: hard - -"lodash.includes@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.includes@npm:4.3.0" - checksum: 10c0/7ca498b9b75bf602d04e48c0adb842dfc7d90f77bcb2a91a2b2be34a723ad24bc1c8b3683ec6b2552a90f216c723cdea530ddb11a3320e08fa38265703978f4b - languageName: node - linkType: hard - -"lodash.memoize@npm:^4.1.2": - version: 4.1.2 - resolution: "lodash.memoize@npm:4.1.2" - checksum: 10c0/c8713e51eccc650422716a14cece1809cfe34bc5ab5e242b7f8b4e2241c2483697b971a604252807689b9dd69bfe3a98852e19a5b89d506b000b4187a1285df8 - languageName: node - linkType: hard - -"lodash.set@npm:^4.3.2": - version: 4.3.2 - resolution: "lodash.set@npm:4.3.2" - checksum: 10c0/c641d31905e51df43170dce8a1d11a1cff11356e2e2e75fe2615995408e9687d58c3e1d64c3c284c2df2bc519f79a98af737d2944d382ff82ffd244ff6075c29 - languageName: node - linkType: hard - -"lodash.uniq@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.uniq@npm:4.5.0" - checksum: 10c0/262d400bb0952f112162a320cc4a75dea4f66078b9e7e3075ffbc9c6aa30b3e9df3cf20e7da7d566105e1ccf7804e4fbd7d804eee0b53de05d83f16ffbf41c5e - languageName: node - linkType: hard - -"lodash@npm:^4.17.14": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c - languageName: node - linkType: hard - -"lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1": - version: 11.2.7 - resolution: "lru-cache@npm:11.2.7" - checksum: 10c0/549cdb59488baa617135fc12159cafb1a97f91079f35093bb3bcad72e849fc64ace636d244212c181dfdf1a99bbfa90757ff303f98561958ee4d0f885d9bd5f7 - languageName: node - linkType: hard - -"lru-cache@npm:^4.0.1, lru-cache@npm:^4.1.1": - version: 4.1.5 - resolution: "lru-cache@npm:4.1.5" - dependencies: - pseudomap: "npm:^1.0.2" - yallist: "npm:^2.1.2" - checksum: 10c0/1ca5306814e5add9ec63556d6fd9b24a4ecdeaef8e9cea52cbf30301e6b88c8d8ddc7cab45b59b56eb763e6c45af911585dc89925a074ab65e1502e3fe8103cf - languageName: node - linkType: hard - -"make-dir@npm:^1.0.0": - version: 1.3.0 - resolution: "make-dir@npm:1.3.0" - dependencies: - pify: "npm:^3.0.0" - checksum: 10c0/5eb94f47d7ef41d89d1b8eef6539b8950d5bd99eeba093a942bfd327faa37d2d62227526b88b73633243a2ec7972d21eb0f4e5d62ae4e02a79e389f4a7bb3022 - languageName: node - linkType: hard - -"make-dir@npm:^2.1.0": - version: 2.1.0 - resolution: "make-dir@npm:2.1.0" - dependencies: - pify: "npm:^4.0.1" - semver: "npm:^5.6.0" - checksum: 10c0/ada869944d866229819735bee5548944caef560d7a8536ecbc6536edca28c72add47cc4f6fc39c54fb25d06b58da1f8994cf7d9df7dadea047064749efc085d8 - languageName: node - linkType: hard - -"make-fetch-happen@npm:^15.0.0": - version: 15.0.5 - resolution: "make-fetch-happen@npm:15.0.5" - dependencies: - "@gar/promise-retry": "npm:^1.0.0" - "@npmcli/agent": "npm:^4.0.0" - "@npmcli/redact": "npm:^4.0.0" - cacache: "npm:^20.0.1" - http-cache-semantics: "npm:^4.1.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^5.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^1.0.0" - proc-log: "npm:^6.0.0" - ssri: "npm:^13.0.0" - checksum: 10c0/527580eb5e5476e6ad07a4e3bd017d13e935f4be815674b442081ae5a721c13d3af5715006619e6be79a85723067e047f83a0c9e699f41d8cec43609a8de4f7b - languageName: node - linkType: hard - -"math-expression-evaluator@npm:^1.2.14": - version: 1.3.14 - resolution: "math-expression-evaluator@npm:1.3.14" - checksum: 10c0/a98dcb54510f57d9d78c66f73c6ee5e8e3a69d7dcfd3f0e611bc6957a764f23fed3b342888fca79ed49b865b09338581d19bb3acc4d788ee308618c7c7cdca10 - languageName: node - linkType: hard - -"md5.js@npm:^1.3.4": - version: 1.3.5 - resolution: "md5.js@npm:1.3.5" - dependencies: - hash-base: "npm:^3.0.0" - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.1.2" - checksum: 10c0/b7bd75077f419c8e013fc4d4dada48be71882e37d69a44af65a2f2804b91e253441eb43a0614423a1c91bb830b8140b0dc906bc797245e2e275759584f4efcc5 - languageName: node - linkType: hard - -"mem@npm:^1.1.0": - version: 1.1.0 - resolution: "mem@npm:1.1.0" - dependencies: - mimic-fn: "npm:^1.0.0" - checksum: 10c0/f5150bb975a7d641375d3c1962426bf338952142a429ce01e9792b03df9b63d5911d3feb7e5e50f406531ace646f3fbe39b7dc716c729d617a28b3bbdc799649 - languageName: node - linkType: hard - -"memory-fs@npm:^0.4.0, memory-fs@npm:~0.4.1": - version: 0.4.1 - resolution: "memory-fs@npm:0.4.1" - dependencies: - errno: "npm:^0.1.3" - readable-stream: "npm:^2.0.1" - checksum: 10c0/f114c44ad8285103cb0e71420cf5bb628d3eb6cbd918197f5951590ff56ba2072f4a97924949c170320cdf180d2da4e8d16a0edd92ba0ca2d2de51dc932841e2 - languageName: node - linkType: hard - -"miller-rabin@npm:^4.0.0": - version: 4.0.1 - resolution: "miller-rabin@npm:4.0.1" - dependencies: - bn.js: "npm:^4.0.0" - brorand: "npm:^1.0.1" - bin: - miller-rabin: bin/miller-rabin - checksum: 10c0/26b2b96f6e49dbcff7faebb78708ed2f5f9ae27ac8cbbf1d7c08f83cf39bed3d418c0c11034dce997da70d135cc0ff6f3a4c15dc452f8e114c11986388a64346 - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa - languageName: node - linkType: hard - -"mime-types@npm:~2.1.34": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: "npm:1.52.0" - checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 - languageName: node - linkType: hard - -"mime@npm:^1.4.1": - version: 1.6.0 - resolution: "mime@npm:1.6.0" - bin: - mime: cli.js - checksum: 10c0/b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 - languageName: node - linkType: hard - -"mimic-fn@npm:^1.0.0": - version: 1.2.0 - resolution: "mimic-fn@npm:1.2.0" - checksum: 10c0/ad55214aec6094c0af4c0beec1a13787556f8116ed88807cf3f05828500f21f93a9482326bcd5a077ae91e3e8795b4e76b5b4c8bb12237ff0e4043a365516cba - languageName: node - linkType: hard - -"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-assert@npm:1.0.1" - checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd - languageName: node - linkType: hard - -"minimalistic-crypto-utils@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-crypto-utils@npm:1.0.1" - checksum: 10c0/790ecec8c5c73973a4fbf2c663d911033e8494d5fb0960a4500634766ab05d6107d20af896ca2132e7031741f19888154d44b2408ada0852446705441383e9f8 - languageName: node - linkType: hard - -"minimatch@npm:^10.2.2": - version: 10.2.4 - resolution: "minimatch@npm:10.2.4" - dependencies: - brace-expansion: "npm:^5.0.2" - checksum: 10c0/35f3dfb7b99b51efd46afd378486889f590e7efb10e0f6a10ba6800428cf65c9a8dedb74427d0570b318d749b543dc4e85f06d46d2858bc8cac7e1eb49a95945 - languageName: node - linkType: hard - -"minimatch@npm:^3.0.4": - version: 3.0.5 - resolution: "minimatch@npm:3.0.5" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/f398652d0d260137c289c270a4ac98ebe0a27cd316fa0fac72b096e96cbdc89f71d80d47ac7065c716ba3b0b730783b19180bd85a35f9247535d2adfe96bba76 - languageName: node - linkType: hard - -"minimist@npm:^1.2.0, minimist@npm:^1.2.5": - version: 1.2.5 - resolution: "minimist@npm:1.2.5" - checksum: 10c0/c143b0c199af4df7a55c7a37b6465cdd438acdc6a3a345ba0fe9d94dfcc2042263f650879bc73be607c843deeaeaadf39c864e55bc6d80b36a025eca1a062ee7 - languageName: node - linkType: hard - -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e - languageName: node - linkType: hard - -"minipass-fetch@npm:^5.0.0": - version: 5.0.2 - resolution: "minipass-fetch@npm:5.0.2" - dependencies: - iconv-lite: "npm:^0.7.2" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^2.0.0" - minizlib: "npm:^3.0.1" - dependenciesMeta: - iconv-lite: - optional: true - checksum: 10c0/ce4ab9f21cfabaead2097d95dd33f485af8072fbc6b19611bce694965393453a1639d641c2bcf1c48f2ea7d41ea7fab8278373f1d0bee4e63b0a5b2cdd0ef649 - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 - languageName: node - linkType: hard - -"minipass-sized@npm:^2.0.0": - version: 2.0.0 - resolution: "minipass-sized@npm:2.0.0" - dependencies: - minipass: "npm:^7.1.2" - checksum: 10c0/f9201696a6f6d68610d04c9c83e3d2e5cb9c026aae1c8cbf7e17f386105cb79c1bb088dbc21bf0b1eb4f3fb5df384fd1e7aa3bf1f33868c416ae8c8a92679db8 - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c - languageName: node - linkType: hard - -"minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2, minipass@npm:^7.1.3": - version: 7.1.3 - resolution: "minipass@npm:7.1.3" - checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb - languageName: node - linkType: hard - -"minizlib@npm:^3.0.1, minizlib@npm:^3.1.0": - version: 3.1.0 - resolution: "minizlib@npm:3.1.0" - dependencies: - minipass: "npm:^7.1.2" - checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec - languageName: node - linkType: hard - -"mississippi@npm:^2.0.0": - version: 2.0.0 - resolution: "mississippi@npm:2.0.0" - dependencies: - concat-stream: "npm:^1.5.0" - duplexify: "npm:^3.4.2" - end-of-stream: "npm:^1.1.0" - flush-write-stream: "npm:^1.0.0" - from2: "npm:^2.1.0" - parallel-transform: "npm:^1.1.0" - pump: "npm:^2.0.1" - pumpify: "npm:^1.3.3" - stream-each: "npm:^1.1.0" - through2: "npm:^2.0.0" - checksum: 10c0/f84beaa40491c2466c4a3d15025ceb1ecc822a8e5ef4f6e5622aeb832b32e4eda056c3982337ae2c1e4b3b77fb431af4d3874923c26dee0c026601547589b2db - languageName: node - linkType: hard - -"mithril@npm:0.2.0": - version: 0.2.0 - resolution: "mithril@npm:0.2.0" - checksum: 10c0/9abb48c285f1d31744bcafd4cb3f6631bf3dc6ff3c653cf97ee01b646d4736f0b25f7aef9423740b23a13e6dd0a6593a6807e2faa2f021a285ae855a72f1952f - languageName: node - linkType: hard - -"mkdirp@npm:^0.5.1, mkdirp@npm:~0.5.0, mkdirp@npm:~0.5.1": - version: 0.5.5 - resolution: "mkdirp@npm:0.5.5" - dependencies: - minimist: "npm:^1.2.5" - bin: - mkdirp: bin/cmd.js - checksum: 10c0/4469faeeba703bc46b7cdbe3097d6373747a581eb8b556ce41c8fd25a826eb3254466c6522ba823c2edb0b6f0da7beb91cf71f040bc4e361534a3e67f0994bd0 - languageName: node - linkType: hard - -"moment@npm:^2.14.1": - version: 2.29.1 - resolution: "moment@npm:2.29.1" - checksum: 10c0/2617e383c0e0f910696214d026b9742173ea1916775d2023b39fd7d5fc3fae694f67c17876d154e246b139ad2a8028c42b2898c66cd665316b61c18453a5103f - languageName: node - linkType: hard - -"move-concurrently@npm:^1.0.1": - version: 1.0.1 - resolution: "move-concurrently@npm:1.0.1" - dependencies: - aproba: "npm:^1.1.1" - copy-concurrently: "npm:^1.0.0" - fs-write-stream-atomic: "npm:^1.0.8" - mkdirp: "npm:^0.5.1" - rimraf: "npm:^2.5.4" - run-queue: "npm:^1.0.3" - checksum: 10c0/0fe81acf3bbbc322013c2f4ee4a48cf8d180a7d925fb9284c0f1f444e862d7eb0421ee074b68d35357a12f0d5e94a322049dc9da480672331b5b8895743eb66a - languageName: node - linkType: hard - -"ms@npm:^2.1.1, ms@npm:^2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 - languageName: node - linkType: hard - -"needle@npm:^2.5.2": - version: 2.9.1 - resolution: "needle@npm:2.9.1" - dependencies: - debug: "npm:^3.2.6" - iconv-lite: "npm:^0.4.4" - sax: "npm:^1.2.4" - bin: - needle: ./bin/needle - checksum: 10c0/65a7eaeaf4ca3410de492957474592af9838e02875273d9232ff6cff331393c58a95e48c592bd9a05f575e5bb9b08543d6cfd19eb96595dbd3d7da2c5fe1accb - languageName: node - linkType: hard - -"negotiator@npm:^1.0.0": - version: 1.0.0 - resolution: "negotiator@npm:1.0.0" - checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b - languageName: node - linkType: hard - -"next-tick@npm:~1.0.0": - version: 1.0.0 - resolution: "next-tick@npm:1.0.0" - checksum: 10c0/851058d7af979a94743ae0ae4c71f0257662a2b7129e0a159273d13782401823c154ee2e49a790e979e5b92126dbc2b5eb522eaff631b997ddf95903e7c5e9cc - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 12.2.0 - resolution: "node-gyp@npm:12.2.0" - dependencies: - env-paths: "npm:^2.2.0" - exponential-backoff: "npm:^3.1.1" - graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^15.0.0" - nopt: "npm:^9.0.0" - proc-log: "npm:^6.0.0" - semver: "npm:^7.3.5" - tar: "npm:^7.5.4" - tinyglobby: "npm:^0.2.12" - which: "npm:^6.0.0" - bin: - node-gyp: bin/node-gyp.js - checksum: 10c0/3ed046746a5a7d90950cd8b0547332b06598443f31fe213ef4332a7174c7b7d259e1704835feda79b87d3f02e59d7791842aac60642ede4396ab25fdf0f8f759 - languageName: node - linkType: hard - -"node-libs-browser@npm:^2.0.0": - version: 2.2.1 - resolution: "node-libs-browser@npm:2.2.1" - dependencies: - assert: "npm:^1.1.1" - browserify-zlib: "npm:^0.2.0" - buffer: "npm:^4.3.0" - console-browserify: "npm:^1.1.0" - constants-browserify: "npm:^1.0.0" - crypto-browserify: "npm:^3.11.0" - domain-browser: "npm:^1.1.1" - events: "npm:^3.0.0" - https-browserify: "npm:^1.0.0" - os-browserify: "npm:^0.3.0" - path-browserify: "npm:0.0.1" - process: "npm:^0.11.10" - punycode: "npm:^1.2.4" - querystring-es3: "npm:^0.2.0" - readable-stream: "npm:^2.3.3" - stream-browserify: "npm:^2.0.1" - stream-http: "npm:^2.7.2" - string_decoder: "npm:^1.0.0" - timers-browserify: "npm:^2.0.4" - tty-browserify: "npm:0.0.0" - url: "npm:^0.11.0" - util: "npm:^0.11.0" - vm-browserify: "npm:^1.0.1" - checksum: 10c0/0e05321a6396408903ed642231d2bca7dd96492d074c7af161ba06a63c95378bd3de50b4105eccbbc02d93ba3da69f0ff5e624bc2a8c92ca462ceb6a403e7986 - languageName: node - linkType: hard - -"nopt@npm:^9.0.0": - version: 9.0.0 - resolution: "nopt@npm:9.0.0" - dependencies: - abbrev: "npm:^4.0.0" - bin: - nopt: bin/nopt.js - checksum: 10c0/1822eb6f9b020ef6f7a7516d7b64a8036e09666ea55ac40416c36e4b2b343122c3cff0e2f085675f53de1d2db99a2a89a60ccea1d120bcd6a5347bf6ceb4a7fd - languageName: node - linkType: hard - -"normalize-package-data@npm:^2.3.2": - version: 2.5.0 - resolution: "normalize-package-data@npm:2.5.0" - dependencies: - hosted-git-info: "npm:^2.1.4" - resolve: "npm:^1.10.0" - semver: "npm:2 || 3 || 4 || 5" - validate-npm-package-license: "npm:^3.0.1" - checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 - languageName: node - linkType: hard - -"normalize-range@npm:^0.1.2": - version: 0.1.2 - resolution: "normalize-range@npm:0.1.2" - checksum: 10c0/bf39b73a63e0a42ad1a48c2bd1bda5a07ede64a7e2567307a407674e595bcff0fa0d57e8e5f1e7fa5e91000797c7615e13613227aaaa4d6d6e87f5bd5cc95de6 - languageName: node - linkType: hard - -"normalize-url@npm:^1.4.0": - version: 1.9.1 - resolution: "normalize-url@npm:1.9.1" - dependencies: - object-assign: "npm:^4.0.1" - prepend-http: "npm:^1.0.0" - query-string: "npm:^4.1.0" - sort-keys: "npm:^1.0.0" - checksum: 10c0/5ecd525f743c3fb5370d2bab8e78446f3e3bd7c0c97a5fd3f0bc0c5f396fbd117d13c9118766128d25ed575755cb539dc33a38419f18ca9d8577c8d1cd7a8daf - languageName: node - linkType: hard - -"npm-run-path@npm:^2.0.0": - version: 2.0.2 - resolution: "npm-run-path@npm:2.0.2" - dependencies: - path-key: "npm:^2.0.0" - checksum: 10c0/95549a477886f48346568c97b08c4fda9cdbf7ce8a4fbc2213f36896d0d19249e32d68d7451bdcbca8041b5fba04a6b2c4a618beaf19849505c05b700740f1de - languageName: node - linkType: hard - -"num2fraction@npm:^1.2.2": - version: 1.2.2 - resolution: "num2fraction@npm:1.2.2" - checksum: 10c0/3bf17b44af00508a2b0370146629710645c3e3ff3c052893680efe3f4a6ff5c953ce9e54734013b02b35744a49352d54fbc5d8b455fac979047ef17dd8ec74bd - languageName: node - linkType: hard - -"number-is-nan@npm:^1.0.0": - version: 1.0.1 - resolution: "number-is-nan@npm:1.0.1" - checksum: 10c0/cb97149006acc5cd512c13c1838223abdf202e76ddfa059c5e8e7507aff2c3a78cd19057516885a2f6f5b576543dc4f7b6f3c997cc7df53ae26c260855466df5 - languageName: node - linkType: hard - -"object-assign@npm:^3.0.0": - version: 3.0.0 - resolution: "object-assign@npm:3.0.0" - checksum: 10c0/88d1b93de35a2073df309239486829b8b3252ef86196a0d5e06fae20f9e6e5830a33ccaa1c675bd63191eec4310961797ff577fa586583a92a09ece53e668416 - languageName: node - linkType: hard - -"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 - languageName: node - linkType: hard - -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: "npm:1" - checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 - languageName: node - linkType: hard - -"os-browserify@npm:^0.3.0": - version: 0.3.0 - resolution: "os-browserify@npm:0.3.0" - checksum: 10c0/6ff32cb1efe2bc6930ad0fd4c50e30c38010aee909eba8d65be60af55efd6cbb48f0287e3649b4e3f3a63dce5a667b23c187c4293a75e557f0d5489d735bcf52 - languageName: node - linkType: hard - -"os-locale@npm:^2.0.0": - version: 2.1.0 - resolution: "os-locale@npm:2.1.0" - dependencies: - execa: "npm:^0.7.0" - lcid: "npm:^1.0.0" - mem: "npm:^1.1.0" - checksum: 10c0/6f1acc060552a59f477ab541e9149a712f93a4d7b5262d070698dbe98cf047f35c7685d759a86dc56c12b76fdfbab1bf7216a74232263efbe7365de2a5d70834 - languageName: node - linkType: hard - -"p-finally@npm:^1.0.0": - version: 1.0.0 - resolution: "p-finally@npm:1.0.0" - checksum: 10c0/6b8552339a71fe7bd424d01d8451eea92d379a711fc62f6b2fe64cad8a472c7259a236c9a22b4733abca0b5666ad503cb497792a0478c5af31ded793d00937e7 - languageName: node - linkType: hard - -"p-limit@npm:^1.1.0": - version: 1.3.0 - resolution: "p-limit@npm:1.3.0" - dependencies: - p-try: "npm:^1.0.0" - checksum: 10c0/5c1b1d53d180b2c7501efb04b7c817448e10efe1ba46f4783f8951994d5027e4cd88f36ad79af50546682594c4ebd11702ac4b9364c47f8074890e2acad0edee - languageName: node - linkType: hard - -"p-locate@npm:^2.0.0": - version: 2.0.0 - resolution: "p-locate@npm:2.0.0" - dependencies: - p-limit: "npm:^1.1.0" - checksum: 10c0/82da4be88fb02fd29175e66021610c881938d3cc97c813c71c1a605fac05617d57fd5d3b337494a6106c0edb2a37c860241430851411f1b265108cead34aee67 - languageName: node - linkType: hard - -"p-map@npm:^7.0.2": - version: 7.0.4 - resolution: "p-map@npm:7.0.4" - checksum: 10c0/a5030935d3cb2919d7e89454d1ce82141e6f9955413658b8c9403cfe379283770ed3048146b44cde168aa9e8c716505f196d5689db0ae3ce9a71521a2fef3abd - languageName: node - linkType: hard - -"p-try@npm:^1.0.0": - version: 1.0.0 - resolution: "p-try@npm:1.0.0" - checksum: 10c0/757ba31de5819502b80c447826fac8be5f16d3cb4fbf9bc8bc4971dba0682e84ac33e4b24176ca7058c69e29f64f34d8d9e9b08e873b7b7bb0aa89d620fa224a - languageName: node - linkType: hard - -"pako@npm:~1.0.5": - version: 1.0.11 - resolution: "pako@npm:1.0.11" - checksum: 10c0/86dd99d8b34c3930345b8bbeb5e1cd8a05f608eeb40967b293f72fe469d0e9c88b783a8777e4cc7dc7c91ce54c5e93d88ff4b4f060e6ff18408fd21030d9ffbe - languageName: node - linkType: hard - -"parallel-transform@npm:^1.1.0": - version: 1.2.0 - resolution: "parallel-transform@npm:1.2.0" - dependencies: - cyclist: "npm:^1.0.1" - inherits: "npm:^2.0.3" - readable-stream: "npm:^2.1.5" - checksum: 10c0/ab0e58569e73681ca4b9c9228189bdb6cbea535295fae344cf0d8342fd33a950961914f3c414f81894c1498fb9ad1c079b4625d2b7ceae9e6ab812f22e3bea3f - languageName: node - linkType: hard - -"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.5": - version: 5.1.6 - resolution: "parse-asn1@npm:5.1.6" - dependencies: - asn1.js: "npm:^5.2.0" - browserify-aes: "npm:^1.0.0" - evp_bytestokey: "npm:^1.0.0" - pbkdf2: "npm:^3.0.3" - safe-buffer: "npm:^5.1.1" - checksum: 10c0/4ed1d9b9e120c5484d29d67bb90171aac0b73422bc016d6294160aea983275c28a27ab85d862059a36a86a97dd31b7ddd97486802ca9fac67115fe3409e9dcbd - languageName: node - linkType: hard - -"parse-json@npm:^2.2.0": - version: 2.2.0 - resolution: "parse-json@npm:2.2.0" - dependencies: - error-ex: "npm:^1.2.0" - checksum: 10c0/7a90132aa76016f518a3d5d746a21b3f1ad0f97a68436ed71b6f995b67c7151141f5464eea0c16c59aec9b7756519a0e3007a8f98cf3714632d509ec07736df6 - languageName: node - linkType: hard - -"parse-node-version@npm:^1.0.1": - version: 1.0.1 - resolution: "parse-node-version@npm:1.0.1" - checksum: 10c0/999cd3d7da1425c2e182dce82b226c6dc842562d3ed79ec47f5c719c32a7f6c1a5352495b894fc25df164be7f2ede4224758255da9902ddef81f2b77ba46bb2c - languageName: node - linkType: hard - -"path-browserify@npm:0.0.1": - version: 0.0.1 - resolution: "path-browserify@npm:0.0.1" - checksum: 10c0/3d59710cddeea06509d91935196185900f3d9d29376dff68ff0e146fbd41d0fb304e983d0158f30cabe4dd2ffcc6a7d3d977631994ee984c88e66aed50a1ccd3 - languageName: node - linkType: hard - -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 10c0/17d6a5664bc0a11d48e2b2127d28a0e58822c6740bde30403f08013da599182289c56518bec89407e3f31d3c2b6b296a4220bc3f867f0911fee6952208b04167 - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 - languageName: node - linkType: hard - -"path-key@npm:^2.0.0": - version: 2.0.1 - resolution: "path-key@npm:2.0.1" - checksum: 10c0/dd2044f029a8e58ac31d2bf34c34b93c3095c1481942960e84dd2faa95bbb71b9b762a106aead0646695330936414b31ca0bd862bf488a937ad17c8c5d73b32b - languageName: node - linkType: hard - -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 - languageName: node - linkType: hard - -"path-scurry@npm:^2.0.2": - version: 2.0.2 - resolution: "path-scurry@npm:2.0.2" - dependencies: - lru-cache: "npm:^11.0.0" - minipass: "npm:^7.1.2" - checksum: 10c0/b35ad37cf6557a87fd057121ce2be7695380c9138d93e87ae928609da259ea0a170fac6f3ef1eb3ece8a068e8b7f2f3adf5bb2374cf4d4a57fe484954fcc9482 - languageName: node - linkType: hard - -"path-type@npm:^2.0.0": - version: 2.0.0 - resolution: "path-type@npm:2.0.0" - dependencies: - pify: "npm:^2.0.0" - checksum: 10c0/e475cead839e65a2f8fdde634b24a4116b49daea3917470552e19d49c63e59ef17963bec2f57df2c72a85fcd1f86c8850d9742e68dba9c9c8d9bcac38bab03d6 - languageName: node - linkType: hard - -"pbkdf2@npm:^3.0.3": - version: 3.1.2 - resolution: "pbkdf2@npm:3.1.2" - dependencies: - create-hash: "npm:^1.1.2" - create-hmac: "npm:^1.1.4" - ripemd160: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - sha.js: "npm:^2.4.8" - checksum: 10c0/5a30374e87d33fa080a92734d778cf172542cc7e41b96198c4c88763997b62d7850de3fbda5c3111ddf79805ee7c1da7046881c90ac4920b5e324204518b05fd - languageName: node - linkType: hard - -"picomatch@npm:^4.0.3": - version: 4.0.3 - resolution: "picomatch@npm:4.0.3" - checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 - languageName: node - linkType: hard - -"pify@npm:^2.0.0": - version: 2.3.0 - resolution: "pify@npm:2.3.0" - checksum: 10c0/551ff8ab830b1052633f59cb8adc9ae8407a436e06b4a9718bcb27dc5844b83d535c3a8512b388b6062af65a98c49bdc0dd523d8b2617b188f7c8fee457158dc - languageName: node - linkType: hard - -"pify@npm:^3.0.0": - version: 3.0.0 - resolution: "pify@npm:3.0.0" - checksum: 10c0/fead19ed9d801f1b1fcd0638a1ac53eabbb0945bf615f2f8806a8b646565a04a1b0e7ef115c951d225f042cca388fdc1cd3add46d10d1ed6951c20bd2998af10 - languageName: node - linkType: hard - -"pify@npm:^4.0.1": - version: 4.0.1 - resolution: "pify@npm:4.0.1" - checksum: 10c0/6f9d404b0d47a965437403c9b90eca8bb2536407f03de165940e62e72c8c8b75adda5516c6b9b23675a5877cc0bcac6bdfb0ef0e39414cd2476d5495da40e7cf - languageName: node - linkType: hard - -"pikaday@npm:^1.3.2": - version: 1.8.2 - resolution: "pikaday@npm:1.8.2" - checksum: 10c0/c3c8ec32b18ad941f91ef0e9e24f80b785749428373137ef1592ee2ac1e2f0d858fcd240063f6d6f15c4f3d361b1653879fee7868ebf6415900ecef9c0ed0d7d - languageName: node - linkType: hard - -"pkg-dir@npm:^2.0.0": - version: 2.0.0 - resolution: "pkg-dir@npm:2.0.0" - dependencies: - find-up: "npm:^2.1.0" - checksum: 10c0/7cdc46c4921bf2c5f9a438851d16243ddde9906928116647ec7784982dd9038ea61c964fbca6f489201845742188180ecd1001b4f69781de1d1dc7d100b14089 - languageName: node - linkType: hard - -"popper.js@npm:^1.16.0": - version: 1.16.1 - resolution: "popper.js@npm:1.16.1" - checksum: 10c0/1c1a826f757edb5b8c2049dfd7a9febf6ae1e9d0e51342fc715b49a0c1020fced250d26484619883651e097c5764bbcacd2f31496e3646027f079dd83e072681 - languageName: node - linkType: hard - -"postcss-calc@npm:^5.2.0": - version: 5.3.1 - resolution: "postcss-calc@npm:5.3.1" - dependencies: - postcss: "npm:^5.0.2" - postcss-message-helpers: "npm:^2.0.0" - reduce-css-calc: "npm:^1.2.6" - checksum: 10c0/96444e979f0e7ef2c6e15d545a05c4ebc05eaa00d1743c9181c1008fb0cc06c926242e50b600ef627d9bd418c3fd24adb6732c482eeed0de8e60b64c1c105176 - languageName: node - linkType: hard - -"postcss-colormin@npm:^2.1.8": - version: 2.2.2 - resolution: "postcss-colormin@npm:2.2.2" - dependencies: - colormin: "npm:^1.0.5" - postcss: "npm:^5.0.13" - postcss-value-parser: "npm:^3.2.3" - checksum: 10c0/defcfa7e3c8daa0c116747acd01346867374505347e802115b2e7b476b6f74df4e67820bcd98743a0c02cd92159005d41db42e428700f873bb54647e54417e95 - languageName: node - linkType: hard - -"postcss-convert-values@npm:^2.3.4": - version: 2.6.1 - resolution: "postcss-convert-values@npm:2.6.1" - dependencies: - postcss: "npm:^5.0.11" - postcss-value-parser: "npm:^3.1.2" - checksum: 10c0/3efbc1c5feaa6c2eb56da61ad2c9e784c50aad1524d9c6a5a5992da43a276ead2b2d2986c8f8647fad484eefe3e22855993b2fe1984b392c45fd82aa92e7bfb9 - languageName: node - linkType: hard - -"postcss-discard-comments@npm:^2.0.4": - version: 2.0.4 - resolution: "postcss-discard-comments@npm:2.0.4" - dependencies: - postcss: "npm:^5.0.14" - checksum: 10c0/436039351e2e6fba1358077728f51c5923cf943584394fc38b441444fe572980f08c5c7d1733a2e48fa17096cb98e8180e73b45ed2aea7baabc162943ed403dc - languageName: node - linkType: hard - -"postcss-discard-duplicates@npm:^2.0.1": - version: 2.1.0 - resolution: "postcss-discard-duplicates@npm:2.1.0" - dependencies: - postcss: "npm:^5.0.4" - checksum: 10c0/0da451c605fa8b26981f2c8a059f9231eade6616026e01834dd5b305ad6ffbaae28916d3de5fe91b6d9810e0bff69e70ffe44cae3a908e12493bc4295cbf4a6f - languageName: node - linkType: hard - -"postcss-discard-empty@npm:^2.0.1": - version: 2.1.0 - resolution: "postcss-discard-empty@npm:2.1.0" - dependencies: - postcss: "npm:^5.0.14" - checksum: 10c0/e2008b574f80cc3621c3e318e59e36895077865a48800f1c25eb688128f8d43f0402c8effc21143533fd114200e532dcfbaca9813f0d07f9e71e32b6a859afbd - languageName: node - linkType: hard - -"postcss-discard-overridden@npm:^0.1.1": - version: 0.1.1 - resolution: "postcss-discard-overridden@npm:0.1.1" - dependencies: - postcss: "npm:^5.0.16" - checksum: 10c0/e1fd38e98045966be5f64252cbd553a597bc7678f64101025b850abe66851f35219320095321e4b0e9632843b6fc64e8bfe9b390064d9725a60a623a4a88b28d - languageName: node - linkType: hard - -"postcss-discard-unused@npm:^2.2.1": - version: 2.2.3 - resolution: "postcss-discard-unused@npm:2.2.3" - dependencies: - postcss: "npm:^5.0.14" - uniqs: "npm:^2.0.0" - checksum: 10c0/0058b5f15363a5a6a0d01e28aaea98506639e52e42b49878ffc80d75ab9c4c9a8136c99ca2b5c9bf4d734469620ff5c84ab4f811a7bf9bc2e7dfd5f76e6d68fb - languageName: node - linkType: hard - -"postcss-filter-plugins@npm:^2.0.0": - version: 2.0.3 - resolution: "postcss-filter-plugins@npm:2.0.3" - dependencies: - postcss: "npm:^5.0.4" - checksum: 10c0/a6d92215995486878dddab275ef65e55fd4432f779cc27ed435df49a22232743dad3285b9db8a5b32e4a618279d3f7415a501a9a4556411ee9d408bac447c5a0 - languageName: node - linkType: hard - -"postcss-merge-idents@npm:^2.1.5": - version: 2.1.7 - resolution: "postcss-merge-idents@npm:2.1.7" - dependencies: - has: "npm:^1.0.1" - postcss: "npm:^5.0.10" - postcss-value-parser: "npm:^3.1.1" - checksum: 10c0/5ef35d2ab59ceb32ca38d597753f8468dafb0782308930df820c96f3b23e4b4e36318ad29d76f88559c6a69d9c8d6283f1900617c0b6e4504bb5ab7523c120f8 - languageName: node - linkType: hard - -"postcss-merge-longhand@npm:^2.0.1": - version: 2.0.2 - resolution: "postcss-merge-longhand@npm:2.0.2" - dependencies: - postcss: "npm:^5.0.4" - checksum: 10c0/84145e5fee9e3064f1b22bde14fe5448449e519e3866a4c59cab42866309e3912638cc7e3d900c16090577a5f94899a2b46ed3a77c721592038671ce86e5395c - languageName: node - linkType: hard - -"postcss-merge-rules@npm:^2.0.3": - version: 2.1.2 - resolution: "postcss-merge-rules@npm:2.1.2" - dependencies: - browserslist: "npm:^1.5.2" - caniuse-api: "npm:^1.5.2" - postcss: "npm:^5.0.4" - postcss-selector-parser: "npm:^2.2.2" - vendors: "npm:^1.0.0" - checksum: 10c0/aa825593d06079de4776f8ec71a05276c145aab734b66fbdea2c42bb545c2ec9fe075912ecb28d18d9c3b506784e8cf7db0951f9af287bc090f3ed7e6e72c332 - languageName: node - linkType: hard - -"postcss-message-helpers@npm:^2.0.0": - version: 2.0.0 - resolution: "postcss-message-helpers@npm:2.0.0" - checksum: 10c0/5696c59befc408b208853a57994224f717c3a81a5b7129205c3087ad2af8159e209f29b66bfed7d79a1afc709cad76c3fbba06616ca71aeec77d7d029440dc72 - languageName: node - linkType: hard - -"postcss-minify-font-values@npm:^1.0.2": - version: 1.0.5 - resolution: "postcss-minify-font-values@npm:1.0.5" - dependencies: - object-assign: "npm:^4.0.1" - postcss: "npm:^5.0.4" - postcss-value-parser: "npm:^3.0.2" - checksum: 10c0/375fc0b1943b1d1e3c61bc33c19a70853ac2cebfdb0dcac23e5324edb218cf989bd7a8877cf846eafbb2d2e7cec4b7bc70922ac9300f9304c2422d807ccd4a85 - languageName: node - linkType: hard - -"postcss-minify-gradients@npm:^1.0.1": - version: 1.0.5 - resolution: "postcss-minify-gradients@npm:1.0.5" - dependencies: - postcss: "npm:^5.0.12" - postcss-value-parser: "npm:^3.3.0" - checksum: 10c0/ce5ed6151349ee4546b860cf9f7af38d8bfb942c32b45025b82c332603e2c49f6ee76ac9bda0cf8279cd2492baa4925b3298776deea7324f5efbd6a85782f0bc - languageName: node - linkType: hard - -"postcss-minify-params@npm:^1.0.4": - version: 1.2.2 - resolution: "postcss-minify-params@npm:1.2.2" - dependencies: - alphanum-sort: "npm:^1.0.1" - postcss: "npm:^5.0.2" - postcss-value-parser: "npm:^3.0.2" - uniqs: "npm:^2.0.0" - checksum: 10c0/e48823f55e60e8dc2c44fb7810a323146bd5f9aa3384a203ee56c08b77a84d5227446a005b84371e8560dd0d6cefed667acc8cf020367c6934c7233fd890f7c8 - languageName: node - linkType: hard - -"postcss-minify-selectors@npm:^2.0.4": - version: 2.1.1 - resolution: "postcss-minify-selectors@npm:2.1.1" - dependencies: - alphanum-sort: "npm:^1.0.2" - has: "npm:^1.0.1" - postcss: "npm:^5.0.14" - postcss-selector-parser: "npm:^2.0.0" - checksum: 10c0/3fd37f12d4d4518a4c7e3e4c9a6ab8cf4757faff6d388700e5d148b9b7b6f1d1f28a6be0ffda5f0077a4e4d509fec65cef3e1343ff72d02e1945a1fba2543ac1 - languageName: node - linkType: hard - -"postcss-modules-extract-imports@npm:^1.2.0": - version: 1.2.1 - resolution: "postcss-modules-extract-imports@npm:1.2.1" - dependencies: - postcss: "npm:^6.0.1" - checksum: 10c0/5746702936c1e1b78a7b31c4e20092197aa89c4e59c156249aea861c84cd0781c11c8c4648b95bcfdce010c48c8edd83b94eb9103f7c72ef8eb96c4b15716ed3 - languageName: node - linkType: hard - -"postcss-modules-local-by-default@npm:^1.2.0": - version: 1.2.0 - resolution: "postcss-modules-local-by-default@npm:1.2.0" - dependencies: - css-selector-tokenizer: "npm:^0.7.0" - postcss: "npm:^6.0.1" - checksum: 10c0/9139846ccefbb089cff17abda76e199c4d464d899816265f0b3939f5cf588b8ba59f9119b87eccaf3bfde3049bddd6ac5989f46e6d8fa9ba936cc6ccb27b89bd - languageName: node - linkType: hard - -"postcss-modules-scope@npm:^1.1.0": - version: 1.1.0 - resolution: "postcss-modules-scope@npm:1.1.0" - dependencies: - css-selector-tokenizer: "npm:^0.7.0" - postcss: "npm:^6.0.1" - checksum: 10c0/ef0328204912f2a3b98322ac5f3d377c234c391a2afd29f51ec83961ad0e0c4dc01192968649ce47c75c85a6c922dd8c608b137c1cce548fe5d92d6fb4454bb2 - languageName: node - linkType: hard - -"postcss-modules-values@npm:^1.3.0": - version: 1.3.0 - resolution: "postcss-modules-values@npm:1.3.0" - dependencies: - icss-replace-symbols: "npm:^1.1.0" - postcss: "npm:^6.0.1" - checksum: 10c0/11bb1af2478291b72f6cc106ba48dc566079021976b2da8c7989db6dca643db6fe81653aba43d4cfb0467754853d77d1eb0e3593a621affe62a1cc2d72541c70 - languageName: node - linkType: hard - -"postcss-normalize-charset@npm:^1.1.0": - version: 1.1.1 - resolution: "postcss-normalize-charset@npm:1.1.1" - dependencies: - postcss: "npm:^5.0.5" - checksum: 10c0/69e67c67ad2a71b2dee440769a3651c84dee7bfcb713749ebbef544454b0151ef0c84833228513d6f53afd63c721b38cd640c54eca9602e3768139158e0f316a - languageName: node - linkType: hard - -"postcss-normalize-url@npm:^3.0.7": - version: 3.0.8 - resolution: "postcss-normalize-url@npm:3.0.8" - dependencies: - is-absolute-url: "npm:^2.0.0" - normalize-url: "npm:^1.4.0" - postcss: "npm:^5.0.14" - postcss-value-parser: "npm:^3.2.3" - checksum: 10c0/c53225ca485dd10d156e33e5ee5c3a830082f3f68a337b9e48f5a9d5083f6bebdf13008103d056b2025622c56421284bd391d9a86949ca468541cd0e2df682a6 - languageName: node - linkType: hard - -"postcss-ordered-values@npm:^2.1.0": - version: 2.2.3 - resolution: "postcss-ordered-values@npm:2.2.3" - dependencies: - postcss: "npm:^5.0.4" - postcss-value-parser: "npm:^3.0.1" - checksum: 10c0/4d55a1c7f108f01181c22db1cb886ba0d47f71472a0e531f66b6d90094e74754a35a85cae7c142b4f6277066d2d4c586814dbd909ac7bb9d4c9d1180ac34d10b - languageName: node - linkType: hard - -"postcss-reduce-idents@npm:^2.2.2": - version: 2.4.0 - resolution: "postcss-reduce-idents@npm:2.4.0" - dependencies: - postcss: "npm:^5.0.4" - postcss-value-parser: "npm:^3.0.2" - checksum: 10c0/a63b42193dd19298b28411bb6186ec6aa5cc176cbb2a4e4e67567cecf116feaa02407744eb734521a49445be497156afad70d0ab5dcd1d9af772e2aca1fd127c - languageName: node - linkType: hard - -"postcss-reduce-initial@npm:^1.0.0": - version: 1.0.1 - resolution: "postcss-reduce-initial@npm:1.0.1" - dependencies: - postcss: "npm:^5.0.4" - checksum: 10c0/f1c40830ceea191cc31353cc5085a1dab8e94f40ce009d0779b0589329546c8f11a10c0ba3d6514032cbee1439d76dc5e0b49bb841b1ca388827cc8be79b587a - languageName: node - linkType: hard - -"postcss-reduce-transforms@npm:^1.0.3": - version: 1.0.4 - resolution: "postcss-reduce-transforms@npm:1.0.4" - dependencies: - has: "npm:^1.0.1" - postcss: "npm:^5.0.8" - postcss-value-parser: "npm:^3.0.1" - checksum: 10c0/9c8cf2373dd84adb132fcd15ca48379276ef353ab8e51c18506d2e9688658579affff77bcbff19e460e875483b9a7d18fb40488f89f8d15b635f10503da9d875 - languageName: node - linkType: hard - -"postcss-selector-parser@npm:^2.0.0, postcss-selector-parser@npm:^2.2.2": - version: 2.2.3 - resolution: "postcss-selector-parser@npm:2.2.3" - dependencies: - flatten: "npm:^1.0.2" - indexes-of: "npm:^1.0.1" - uniq: "npm:^1.0.1" - checksum: 10c0/dc8aee6807096a93a6a1079bddb8d3e94ca385688889da087156ecfe48f3ad7db7581395fada92737d0d6e6a2cda96697fb2d94bbbf97484adb1acff261efe00 - languageName: node - linkType: hard - -"postcss-svgo@npm:^2.1.1": - version: 2.1.6 - resolution: "postcss-svgo@npm:2.1.6" - dependencies: - is-svg: "npm:^2.0.0" - postcss: "npm:^5.0.14" - postcss-value-parser: "npm:^3.2.3" - svgo: "npm:^0.7.0" - checksum: 10c0/a4e33316888c609b2db8e0dbaa7db49f4c0c880985df364d1a237fc1ef170815f21949433e4ea5684da2c2b3d8ef2f6c0e944d3757c6749b350dbf19d534b5f2 - languageName: node - linkType: hard - -"postcss-unique-selectors@npm:^2.0.2": - version: 2.0.2 - resolution: "postcss-unique-selectors@npm:2.0.2" - dependencies: - alphanum-sort: "npm:^1.0.1" - postcss: "npm:^5.0.4" - uniqs: "npm:^2.0.0" - checksum: 10c0/4d1fac25aec01952390df2746f1cb9392b1cfe29bd167608248408755bd8b510209f95213953bda61b3c1201fb580620acdffd4f29fb85c3986f2a04b9b6bb52 - languageName: node - linkType: hard - -"postcss-value-parser@npm:^3.0.1, postcss-value-parser@npm:^3.0.2, postcss-value-parser@npm:^3.1.1, postcss-value-parser@npm:^3.1.2, postcss-value-parser@npm:^3.2.3, postcss-value-parser@npm:^3.3.0": - version: 3.3.1 - resolution: "postcss-value-parser@npm:3.3.1" - checksum: 10c0/23eed98d8eeadb1f9ef1db4a2757da0f1d8e7c1dac2a38d6b35d971aab9eb3c6d8a967d0e9f435558834ffcd966afbbe875a56bcc5bcdd09e663008c106b3e47 - languageName: node - linkType: hard - -"postcss-zindex@npm:^2.0.1": - version: 2.2.0 - resolution: "postcss-zindex@npm:2.2.0" - dependencies: - has: "npm:^1.0.1" - postcss: "npm:^5.0.4" - uniqs: "npm:^2.0.0" - checksum: 10c0/3c99a8fcd7132ecd5f56df7d8bdbe9a9d78f6c92c784435d522e1909b4e5f624905734c528787b0257a2ae23ec45f5bf435f8e2dcd47733fad8d779b91f2ba09 - languageName: node - linkType: hard - -"postcss@npm:^5.0.10, postcss@npm:^5.0.11, postcss@npm:^5.0.12, postcss@npm:^5.0.13, postcss@npm:^5.0.14, postcss@npm:^5.0.16, postcss@npm:^5.0.2, postcss@npm:^5.0.4, postcss@npm:^5.0.5, postcss@npm:^5.0.6, postcss@npm:^5.0.8, postcss@npm:^5.2.16": - version: 5.2.18 - resolution: "postcss@npm:5.2.18" - dependencies: - chalk: "npm:^1.1.3" - js-base64: "npm:^2.1.9" - source-map: "npm:^0.5.6" - supports-color: "npm:^3.2.3" - checksum: 10c0/1f9f6673dd24d52f1ed33b800248e6ef752d6b6a092fe268021e398df0d7e0956f00fb961781647264d659240c3d67f5bfd3df9bf1b7af985aa996be619d30b1 - languageName: node - linkType: hard - -"postcss@npm:^6.0.1": - version: 6.0.23 - resolution: "postcss@npm:6.0.23" - dependencies: - chalk: "npm:^2.4.1" - source-map: "npm:^0.6.1" - supports-color: "npm:^5.4.0" - checksum: 10c0/45d45184ffbb9d510e7585d9441af9a1a771a56b7553b1d598544e54acdfd31df439a95d5f00a6dc57b85b76d0c8925fec18614b1cc795887c845c3965e32e63 - languageName: node - linkType: hard - -"prepend-http@npm:^1.0.0": - version: 1.0.4 - resolution: "prepend-http@npm:1.0.4" - checksum: 10c0/c6c173ca439e58163ba7bea7cbba52a1ed11e3e3da1c048da296f37d4b7654f78f7304e03f76d5923f4b83af7e2d55533e0f79064209c75b743ccddee13904f8 - languageName: node - linkType: hard - -"proc-log@npm:^6.0.0": - version: 6.1.0 - resolution: "proc-log@npm:6.1.0" - checksum: 10c0/4f178d4062733ead9d71a9b1ab24ebcecdfe2250916a5b1555f04fe2eda972a0ec76fbaa8df1ad9c02707add6749219d118a4fc46dc56bdfe4dde4b47d80bb82 - languageName: node - linkType: hard - -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 - languageName: node - linkType: hard - -"process@npm:^0.11.10": - version: 0.11.10 - resolution: "process@npm:0.11.10" - checksum: 10c0/40c3ce4b7e6d4b8c3355479df77aeed46f81b279818ccdc500124e6a5ab882c0cc81ff7ea16384873a95a74c4570b01b120f287abbdd4c877931460eca6084b3 - languageName: node - linkType: hard - -"promise-inflight@npm:^1.0.1": - version: 1.0.1 - resolution: "promise-inflight@npm:1.0.1" - checksum: 10c0/d179d148d98fbff3d815752fa9a08a87d3190551d1420f17c4467f628214db12235ae068d98cd001f024453676d8985af8f28f002345646c4ece4600a79620bc - languageName: node - linkType: hard - -"prr@npm:~1.0.1": - version: 1.0.1 - resolution: "prr@npm:1.0.1" - checksum: 10c0/5b9272c602e4f4472a215e58daff88f802923b84bc39c8860376bb1c0e42aaf18c25d69ad974bd06ec6db6f544b783edecd5502cd3d184748d99080d68e4be5f - languageName: node - linkType: hard - -"pseudomap@npm:^1.0.2": - version: 1.0.2 - resolution: "pseudomap@npm:1.0.2" - checksum: 10c0/5a91ce114c64ed3a6a553aa7d2943868811377388bb31447f9d8028271bae9b05b340fe0b6961a64e45b9c72946aeb0a4ab635e8f7cb3715ffd0ff2beeb6a679 - languageName: node - linkType: hard - -"public-encrypt@npm:^4.0.0": - version: 4.0.3 - resolution: "public-encrypt@npm:4.0.3" - dependencies: - bn.js: "npm:^4.1.0" - browserify-rsa: "npm:^4.0.0" - create-hash: "npm:^1.1.0" - parse-asn1: "npm:^5.0.0" - randombytes: "npm:^2.0.1" - safe-buffer: "npm:^5.1.2" - checksum: 10c0/6c2cc19fbb554449e47f2175065d6b32f828f9b3badbee4c76585ac28ae8641aafb9bb107afc430c33c5edd6b05dbe318df4f7d6d7712b1093407b11c4280700 - languageName: node - linkType: hard - -"pump@npm:^2.0.0, pump@npm:^2.0.1": - version: 2.0.1 - resolution: "pump@npm:2.0.1" - dependencies: - end-of-stream: "npm:^1.1.0" - once: "npm:^1.3.1" - checksum: 10c0/f1fe8960f44d145f8617ea4c67de05392da4557052980314c8f85081aee26953bdcab64afad58a2b1df0e8ff7203e3710e848cbe81a01027978edc6e264db355 - languageName: node - linkType: hard - -"pumpify@npm:^1.3.3": - version: 1.5.1 - resolution: "pumpify@npm:1.5.1" - dependencies: - duplexify: "npm:^3.6.0" - inherits: "npm:^2.0.3" - pump: "npm:^2.0.0" - checksum: 10c0/0bcabf9e3dbf2d0cc1f9b84ac80d3c75386111caf8963bfd98817a1e2192000ac0ccc804ca6ccd5b2b8430fdb71347b20fb2f014fe3d41adbacb1b502a841c45 - languageName: node - linkType: hard - -"punycode@npm:1.3.2": - version: 1.3.2 - resolution: "punycode@npm:1.3.2" - checksum: 10c0/281fd20eaf4704f79d80cb0dc65065bf6452ee67989b3e8941aed6360a5a9a8a01d3e2ed71d0bde3cd74fb5a5dd9db4160bed5a8c20bed4b6764c24ce4c7d2d2 - languageName: node - linkType: hard - -"punycode@npm:^1.2.4": - version: 1.4.1 - resolution: "punycode@npm:1.4.1" - checksum: 10c0/354b743320518aef36f77013be6e15da4db24c2b4f62c5f1eb0529a6ed02fbaf1cb52925785f6ab85a962f2b590d9cd5ad730b70da72b5f180e2556b8bd3ca08 - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.1.1 - resolution: "punycode@npm:2.1.1" - checksum: 10c0/83815ca9b9177f055771f31980cbec7ffaef10257d50a95ab99b4a30f0404846e85fa6887ee1bbc0aaddb7bad6d96e2fa150a016051ff0f6b92be4ad613ddca8 - languageName: node - linkType: hard - -"q@npm:^1.1.2": - version: 1.5.1 - resolution: "q@npm:1.5.1" - checksum: 10c0/7855fbdba126cb7e92ef3a16b47ba998c0786ec7fface236e3eb0135b65df36429d91a86b1fff3ab0927b4ac4ee88a2c44527c7c3b8e2a37efbec9fe34803df4 - languageName: node - linkType: hard - -"query-string@npm:^4.1.0": - version: 4.3.4 - resolution: "query-string@npm:4.3.4" - dependencies: - object-assign: "npm:^4.1.0" - strict-uri-encode: "npm:^1.0.0" - checksum: 10c0/6181c343074c2049fbbcde63f87c1da5d3a49c6e34c8d94a61d692e886e0b8cd1ae4a4be00b598112bb9c4cb819e423ed503a5d246e4d24ecb0990d8bb21570b - languageName: node - linkType: hard - -"querystring-es3@npm:^0.2.0": - version: 0.2.1 - resolution: "querystring-es3@npm:0.2.1" - checksum: 10c0/476938c1adb45c141f024fccd2ffd919a3746e79ed444d00e670aad68532977b793889648980e7ca7ff5ffc7bfece623118d0fbadcaf217495eeb7059ae51580 - languageName: node - linkType: hard - -"querystring@npm:0.2.0": - version: 0.2.0 - resolution: "querystring@npm:0.2.0" - checksum: 10c0/2036c9424beaacd3978bac9e4ba514331cc73163bea7bf3ad7e2c7355e55501938ec195312c607753f9c6e70b1bf9dfcda38db6241bd299c034e27ac639d64ed - languageName: node - linkType: hard - -"randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5": - version: 2.1.0 - resolution: "randombytes@npm:2.1.0" - dependencies: - safe-buffer: "npm:^5.1.0" - checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 - languageName: node - linkType: hard - -"randomfill@npm:^1.0.3": - version: 1.0.4 - resolution: "randomfill@npm:1.0.4" - dependencies: - randombytes: "npm:^2.0.5" - safe-buffer: "npm:^5.1.0" - checksum: 10c0/11aeed35515872e8f8a2edec306734e6b74c39c46653607f03c68385ab8030e2adcc4215f76b5e4598e028c4750d820afd5c65202527d831d2a5f207fe2bc87c - languageName: node - linkType: hard - -"raw-loader@npm:~0.5.0": - version: 0.5.1 - resolution: "raw-loader@npm:0.5.1" - checksum: 10c0/0961d64c0c21c25f8a1ecddd5bf17a4308e5d82addff11044a42c28dde35f14b34c6dbf4665adda7ce3a64922a3132785276c25e1f33c0c62689ff366ab8fb6e - languageName: node - linkType: hard - -"read-pkg-up@npm:^2.0.0": - version: 2.0.0 - resolution: "read-pkg-up@npm:2.0.0" - dependencies: - find-up: "npm:^2.0.0" - read-pkg: "npm:^2.0.0" - checksum: 10c0/6fbb9f8c1a9ed3c8a5764387a77ac4456082f1fe98757d1ed300d8b0a4c70501f28cbb053ae7b3e0de6094930fb7258fbfe099957a53c999337aaf8bc53ff37f - languageName: node - linkType: hard - -"read-pkg@npm:^2.0.0": - version: 2.0.0 - resolution: "read-pkg@npm:2.0.0" - dependencies: - load-json-file: "npm:^2.0.0" - normalize-package-data: "npm:^2.3.2" - path-type: "npm:^2.0.0" - checksum: 10c0/c0d1b66c58e58fadaabe48c83c525fb1966304555e5089fab5ccce2c3dfe0fad726720b170a5fa23ff20452e22d1dbe817f5c63f03546bb85cbfb6b84da84c2b - languageName: node - linkType: hard - -"readable-stream@npm:1 || 2, readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.2, readable-stream@npm:^2.1.5, readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.3, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6": - version: 2.3.7 - resolution: "readable-stream@npm:2.3.7" - dependencies: - core-util-is: "npm:~1.0.0" - inherits: "npm:~2.0.3" - isarray: "npm:~1.0.0" - process-nextick-args: "npm:~2.0.0" - safe-buffer: "npm:~5.1.1" - string_decoder: "npm:~1.1.1" - util-deprecate: "npm:~1.0.1" - checksum: 10c0/1708755e6cf9daff6ff60fa5b4575636472289c5b95d38058a91f94732b8d024a940a0d4d955639195ce42c22cab16973ee8fea8deedd24b5fec3dd596465f86 - languageName: node - linkType: hard - -"readable-stream@npm:^3.6.0": - version: 3.6.0 - resolution: "readable-stream@npm:3.6.0" - dependencies: - inherits: "npm:^2.0.3" - string_decoder: "npm:^1.1.1" - util-deprecate: "npm:^1.0.1" - checksum: 10c0/937bedd29ac8a68331666291922bea892fa2be1a33269e582de9f844a2002f146cf831e39cd49fe6a378d3f0c27358f259ed0e20d20f0bdc6a3f8fc21fce42dc - languageName: node - linkType: hard - -"reduce-css-calc@npm:^1.2.6": - version: 1.3.0 - resolution: "reduce-css-calc@npm:1.3.0" - dependencies: - balanced-match: "npm:^0.4.2" - math-expression-evaluator: "npm:^1.2.14" - reduce-function-call: "npm:^1.0.1" - checksum: 10c0/c0b192bbdc7617ee7e3bcd09332f7f810c2b52f1da8521c4eda03879ead00bcca65bcae78d5bc8cd925610f776532a3457e8b2fd8f4bb936bdb40f057590f20d - languageName: node - linkType: hard - -"reduce-function-call@npm:^1.0.1": - version: 1.0.3 - resolution: "reduce-function-call@npm:1.0.3" - dependencies: - balanced-match: "npm:^1.0.0" - checksum: 10c0/7e844708d8c3d2946d3df5c537ee1e23c3c60c98ac0dbc724828f36d8d309c391a14995f47ce4f5ba84eea2df5c73d58e4ba100ba331af496920932421a322ed - languageName: node - linkType: hard - -"require-directory@npm:^2.1.1": - version: 2.1.1 - resolution: "require-directory@npm:2.1.1" - checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 - languageName: node - linkType: hard - -"require-main-filename@npm:^1.0.1": - version: 1.0.1 - resolution: "require-main-filename@npm:1.0.1" - checksum: 10c0/1ab87efb72a0e223a667154e92f29ca753fd42eb87f22db142b91c86d134e29ecf18af929111ccd255fd340b57d84a9d39489498d8dfd5136b300ded30a5f0b6 - languageName: node - linkType: hard - -"resolve@npm:^1.10.0": - version: 1.22.0 - resolution: "resolve@npm:1.22.0" - dependencies: - is-core-module: "npm:^2.8.1" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/efe07a7cd69015a95a5f4e6cc3d372354b93d67a70410ec686413b2054dfa0d5ef16ff52c057a83634debb17f278b99db6dbc60367a4475ae01dda29c6eaa6e4 - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin": - version: 1.22.0 - resolution: "resolve@patch:resolve@npm%3A1.22.0#optional!builtin::version=1.22.0&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.8.1" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/ef8061e81f40c39070748e8e263c8767d8fcc7c34e9ee85211b29fbc2aedb1ae7cda7d735c2cdbe9367060e9f85ec11c2694e370c121c6bcbb472a7bd0b19555 - languageName: node - linkType: hard - -"rimraf@npm:^2.5.4, rimraf@npm:^2.6.2": - version: 2.7.1 - resolution: "rimraf@npm:2.7.1" - dependencies: - glob: "npm:^7.1.3" - bin: - rimraf: ./bin.js - checksum: 10c0/4eef73d406c6940927479a3a9dee551e14a54faf54b31ef861250ac815172bade86cc6f7d64a4dc5e98b65e4b18a2e1c9ff3b68d296be0c748413f092bb0dd40 - languageName: node - linkType: hard - -"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": - version: 2.0.2 - resolution: "ripemd160@npm:2.0.2" - dependencies: - hash-base: "npm:^3.0.0" - inherits: "npm:^2.0.1" - checksum: 10c0/f6f0df78817e78287c766687aed4d5accbebc308a8e7e673fb085b9977473c1f139f0c5335d353f172a915bb288098430755d2ad3c4f30612f4dd0c901cd2c3a - languageName: node - linkType: hard - -"run-queue@npm:^1.0.0, run-queue@npm:^1.0.3": - version: 1.0.3 - resolution: "run-queue@npm:1.0.3" - dependencies: - aproba: "npm:^1.1.1" - checksum: 10c0/4e8964279d8f160f9ffaabe82eaad11a1d4c0db596a0f2b5257ae9d2b900c7e1ffcece3e5719199436f50718e1e7f45bb4bf7a82e331a4e734d67c2588a90cbb - languageName: node - linkType: hard - -"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 - languageName: node - linkType: hard - -"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.1.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 - languageName: node - linkType: hard - -"sax@npm:^1.2.4, sax@npm:~1.2.1": - version: 1.2.4 - resolution: "sax@npm:1.2.4" - checksum: 10c0/6e9b05ff443ee5e5096ce92d31c0740a20d33002fad714ebcb8fc7a664d9ee159103ebe8f7aef0a1f7c5ecacdd01f177f510dff95611c589399baf76437d3fe3 - languageName: node - linkType: hard - -"schema-utils@npm:^0.3.0": - version: 0.3.0 - resolution: "schema-utils@npm:0.3.0" - dependencies: - ajv: "npm:^5.0.0" - checksum: 10c0/dd0694d6cfec83372273dcc73eeaab3cc8a8026cb0f57e896ea8ef3832421998423c6081ceea04e361ae95b40b6e5e3b9aebc7f3c6d8099ec99dc0a1843d9e67 - languageName: node - linkType: hard - -"schema-utils@npm:^0.4.5": - version: 0.4.7 - resolution: "schema-utils@npm:0.4.7" - dependencies: - ajv: "npm:^6.1.0" - ajv-keywords: "npm:^3.1.0" - checksum: 10c0/0de445cee6bf9a54b7b18b284b5f5ebe5b481f57e71854872c4215bd8eda73811a5f4964718c26f24b50f46a5eafbaf8a391459a7f10b78c242a798a3e0e24c8 - languageName: node - linkType: hard - -"schema-utils@npm:^1.0.0": - version: 1.0.0 - resolution: "schema-utils@npm:1.0.0" - dependencies: - ajv: "npm:^6.1.0" - ajv-errors: "npm:^1.0.0" - ajv-keywords: "npm:^3.1.0" - checksum: 10c0/670e22d7f0ff0b6f4514a4d6fb27c359101b44b7dbfd9563af201af72eb4a9ff06144020cab5f85b16e88821fd09b97cbdae6c893721c6528c8cb704124e6a2f - languageName: node - linkType: hard - -"select2@npm:3.5.1": - version: 3.5.1 - resolution: "select2@npm:3.5.1" - checksum: 10c0/be98375c6c58fea8498f9b0f25fe9a10427b0338ae3c47d1ac49c09d8b31d233ac7f258621ea12d75b7eb9c1be441f90bf9aef03203b04d2838c4f9d54e73b31 - languageName: node - linkType: hard - -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.6.0": - version: 5.7.1 - resolution: "semver@npm:5.7.1" - bin: - semver: ./bin/semver - checksum: 10c0/d4884f2aeca28bff35d0bd40ff0a9b2dfc4b36a883bf0ea5dc15d10d9a01bdc9041035b05f825d4b5ac8a56e490703dbf0d986d054de82cc5e9bad3f02ca6e00 - languageName: node - linkType: hard - -"semver@npm:^7.3.5": - version: 7.7.4 - resolution: "semver@npm:7.7.4" - bin: - semver: bin/semver.js - checksum: 10c0/5215ad0234e2845d4ea5bb9d836d42b03499546ddafb12075566899fc617f68794bb6f146076b6881d755de17d6c6cc73372555879ec7dce2c2feee947866ad2 - languageName: node - linkType: hard - -"serialize-javascript@npm:^1.4.0": - version: 1.9.1 - resolution: "serialize-javascript@npm:1.9.1" - checksum: 10c0/01c1aabb28a50133ac7c86038ec14be26b13e0d8d43ac6ad4bad57789bc8dc33b33fef2424330ab9d138da40d9a3c2520f0d66e8c3474eeeab01669d3a38cae1 - languageName: node - linkType: hard - -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 - languageName: node - linkType: hard - -"setimmediate@npm:^1.0.4": - version: 1.0.5 - resolution: "setimmediate@npm:1.0.5" - checksum: 10c0/5bae81bfdbfbd0ce992893286d49c9693c82b1bcc00dcaaf3a09c8f428fdeacf4190c013598b81875dfac2b08a572422db7df779a99332d0fce186d15a3e4d49 - languageName: node - linkType: hard - -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": - version: 2.4.11 - resolution: "sha.js@npm:2.4.11" - dependencies: - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - bin: - sha.js: ./bin.js - checksum: 10c0/b7a371bca8821c9cc98a0aeff67444a03d48d745cb103f17228b96793f455f0eb0a691941b89ea1e60f6359207e36081d9be193252b0f128e0daf9cfea2815a5 - languageName: node - linkType: hard - -"shebang-command@npm:^1.2.0": - version: 1.2.0 - resolution: "shebang-command@npm:1.2.0" - dependencies: - shebang-regex: "npm:^1.0.0" - checksum: 10c0/7b20dbf04112c456b7fc258622dafd566553184ac9b6938dd30b943b065b21dabd3776460df534cc02480db5e1b6aec44700d985153a3da46e7db7f9bd21326d - languageName: node - linkType: hard - -"shebang-regex@npm:^1.0.0": - version: 1.0.0 - resolution: "shebang-regex@npm:1.0.0" - checksum: 10c0/9abc45dee35f554ae9453098a13fdc2f1730e525a5eb33c51f096cc31f6f10a4b38074c1ebf354ae7bffa7229506083844008dfc3bb7818228568c0b2dc1fff2 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.0": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.3": - version: 8.0.5 - resolution: "socks-proxy-agent@npm:8.0.5" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:^4.3.4" - socks: "npm:^2.8.3" - checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 - languageName: node - linkType: hard - -"socks@npm:^2.8.3": - version: 2.8.7 - resolution: "socks@npm:2.8.7" - dependencies: - ip-address: "npm:^10.0.1" - smart-buffer: "npm:^4.2.0" - checksum: 10c0/2805a43a1c4bcf9ebf6e018268d87b32b32b06fbbc1f9282573583acc155860dc361500f89c73bfbb157caa1b4ac78059eac0ef15d1811eb0ca75e0bdadbc9d2 - languageName: node - linkType: hard - -"sort-keys@npm:^1.0.0": - version: 1.1.2 - resolution: "sort-keys@npm:1.1.2" - dependencies: - is-plain-obj: "npm:^1.0.0" - checksum: 10c0/5dd383b0299a40277051f7498c3999520138e2eb50d422962f658738341c9e82349fad4a3024d5ba1a3122688fbaf958f2a472d4c53bade55515097c2ce15420 - languageName: node - linkType: hard - -"source-list-map@npm:^2.0.0": - version: 2.0.1 - resolution: "source-list-map@npm:2.0.1" - checksum: 10c0/2e5e421b185dcd857f46c3c70e2e711a65d717b78c5f795e2e248c9d67757882ea989b80ebc08cf164eeeda5f4be8aa95d3b990225070b2daaaf3257c5958149 - languageName: node - linkType: hard - -"source-map@npm:0.1.x": - version: 0.1.43 - resolution: "source-map@npm:0.1.43" - dependencies: - amdefine: "npm:>=0.0.4" - checksum: 10c0/0cf092a91a0aadfad21ed7cb9ac78878b16242fcc9cd8f631e340b607f311d2f5391df574a29b9e243b35a7d1efd471f357b4b81da8e65145bcae242d46d0297 - languageName: node - linkType: hard - -"source-map@npm:^0.5.3, source-map@npm:^0.5.6": - version: 0.5.7 - resolution: "source-map@npm:0.5.7" - checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 - languageName: node - linkType: hard - -"source-map@npm:^0.6.1, source-map@npm:~0.6.0, source-map@npm:~0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 - languageName: node - linkType: hard - -"spdx-correct@npm:^3.0.0": - version: 3.1.1 - resolution: "spdx-correct@npm:3.1.1" - dependencies: - spdx-expression-parse: "npm:^3.0.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/25909eecc4024963a8e398399dbdd59ddb925bd7dbecd9c9cf6df0d75c29b68cd30b82123564acc51810eb02cfc4b634a2e16e88aa982433306012e318849249 - languageName: node - linkType: hard - -"spdx-exceptions@npm:^2.1.0": - version: 2.3.0 - resolution: "spdx-exceptions@npm:2.3.0" - checksum: 10c0/83089e77d2a91cb6805a5c910a2bedb9e50799da091f532c2ba4150efdef6e53f121523d3e2dc2573a340dc0189e648b03157097f65465b3a0c06da1f18d7e8a - languageName: node - linkType: hard - -"spdx-expression-parse@npm:^3.0.0": - version: 3.0.1 - resolution: "spdx-expression-parse@npm:3.0.1" - dependencies: - spdx-exceptions: "npm:^2.1.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 - languageName: node - linkType: hard - -"spdx-license-ids@npm:^3.0.0": - version: 3.0.11 - resolution: "spdx-license-ids@npm:3.0.11" - checksum: 10c0/6c53cfdb3417e80fd612341319f1296507f797e0387e144047f547c378d9d38d6032ec342de42ef7883256f6690b2fca9889979d0dd015a61dc49b323f9b379b - languageName: node - linkType: hard - -"sprintf-js@npm:~1.0.2": - version: 1.0.3 - resolution: "sprintf-js@npm:1.0.3" - checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb - languageName: node - linkType: hard - -"ssri@npm:^13.0.0": - version: 13.0.1 - resolution: "ssri@npm:13.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/cf6408a18676c57ff2ed06b8a20dc64bb3e748e5c7e095332e6aecaa2b8422b1e94a739a8453bf65156a8a47afe23757ba4ab52d3ea3b62322dc40875763e17a - languageName: node - linkType: hard - -"ssri@npm:^5.2.4": - version: 5.3.0 - resolution: "ssri@npm:5.3.0" - dependencies: - safe-buffer: "npm:^5.1.1" - checksum: 10c0/f80372ec982cacb3d8e4b53c2a82a7f7502d915a57aef99a29e6cd293302d5944185a569df5fce694a857abb1e602585fcee90182cd2e853bae3d1c20a84d8cb - languageName: node - linkType: hard - -"stream-browserify@npm:^2.0.1": - version: 2.0.2 - resolution: "stream-browserify@npm:2.0.2" - dependencies: - inherits: "npm:~2.0.1" - readable-stream: "npm:^2.0.2" - checksum: 10c0/485562bd5d962d633ae178449029c6fa2611052e356bdb5668f768544aa4daa94c4f9a97de718f3f30ad98f3cb98a5f396252bb3855aff153c138f79c0e8f6ac - languageName: node - linkType: hard - -"stream-each@npm:^1.1.0": - version: 1.2.3 - resolution: "stream-each@npm:1.2.3" - dependencies: - end-of-stream: "npm:^1.1.0" - stream-shift: "npm:^1.0.0" - checksum: 10c0/7ed229d3b7c24373058b5742b00066da8d3122d1487c8219a025ed53a8978545c77654a529a8e9c62ba83ae80c424cbb0204776b49abf72270d2e8154831dd5f - languageName: node - linkType: hard - -"stream-http@npm:^2.7.2": - version: 2.8.3 - resolution: "stream-http@npm:2.8.3" - dependencies: - builtin-status-codes: "npm:^3.0.0" - inherits: "npm:^2.0.1" - readable-stream: "npm:^2.3.6" - to-arraybuffer: "npm:^1.0.0" - xtend: "npm:^4.0.0" - checksum: 10c0/fbe7d327a29216bbabe88d3819bb8f7a502f11eeacf3212579e5af1f76fa7283f6ffa66134ab7d80928070051f571d1029e85f65ce3369fffd4c4df3669446c4 - languageName: node - linkType: hard - -"stream-shift@npm:^1.0.0": - version: 1.0.1 - resolution: "stream-shift@npm:1.0.1" - checksum: 10c0/b63a0d178cde34b920ad93e2c0c9395b840f408d36803b07c61416edac80ef9e480a51910e0ceea0d679cec90921bcd2cccab020d3a9fa6c73a98b0fbec132fd - languageName: node - linkType: hard - -"strict-uri-encode@npm:^1.0.0": - version: 1.1.0 - resolution: "strict-uri-encode@npm:1.1.0" - checksum: 10c0/eb8a4109ba2588239787389313ba58ec49e043d4c64a1d44716defe5821a68ae49abe0cdefed9946ca9fc2a4af7ecf321da92422b0a67258ec0a3638b053ae62 - languageName: node - linkType: hard - -"string-width@npm:^1.0.1": - version: 1.0.2 - resolution: "string-width@npm:1.0.2" - dependencies: - code-point-at: "npm:^1.0.0" - is-fullwidth-code-point: "npm:^1.0.0" - strip-ansi: "npm:^3.0.0" - checksum: 10c0/c558438baed23a9ab9370bb6a939acbdb2b2ffc517838d651aad0f5b2b674fb85d460d9b1d0b6a4c210dffd09e3235222d89a5bd4c0c1587f78b2bb7bc00c65e - languageName: node - linkType: hard - -"string-width@npm:^2.0.0": - version: 2.1.1 - resolution: "string-width@npm:2.1.1" - dependencies: - is-fullwidth-code-point: "npm:^2.0.0" - strip-ansi: "npm:^4.0.0" - checksum: 10c0/e5f2b169fcf8a4257a399f95d069522f056e92ec97dbdcb9b0cdf14d688b7ca0b1b1439a1c7b9773cd79446cbafd582727279d6bfdd9f8edd306ea5e90e5b610 - languageName: node - linkType: hard - -"string_decoder@npm:^1.0.0, string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: "npm:~5.2.0" - checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d - languageName: node - linkType: hard - -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" - dependencies: - safe-buffer: "npm:~5.1.0" - checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e - languageName: node - linkType: hard - -"strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1": - version: 3.0.1 - resolution: "strip-ansi@npm:3.0.1" - dependencies: - ansi-regex: "npm:^2.0.0" - checksum: 10c0/f6e7fbe8e700105dccf7102eae20e4f03477537c74b286fd22cfc970f139002ed6f0d9c10d0e21aa9ed9245e0fa3c9275930e8795c5b947da136e4ecb644a70f - languageName: node - linkType: hard - -"strip-ansi@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-ansi@npm:4.0.0" - dependencies: - ansi-regex: "npm:^3.0.0" - checksum: 10c0/d75d9681e0637ea316ddbd7d4d3be010b1895a17e885155e0ed6a39755ae0fd7ef46e14b22162e66a62db122d3a98ab7917794e255532ab461bb0a04feb03e7d - languageName: node - linkType: hard - -"strip-bom@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-bom@npm:3.0.0" - checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 - languageName: node - linkType: hard - -"strip-eof@npm:^1.0.0": - version: 1.0.0 - resolution: "strip-eof@npm:1.0.0" - checksum: 10c0/f336beed8622f7c1dd02f2cbd8422da9208fae81daf184f73656332899978919d5c0ca84dc6cfc49ad1fc4dd7badcde5412a063cf4e0d7f8ed95a13a63f68f45 - languageName: node - linkType: hard - -"style-loader@npm:^0.23.1": - version: 0.23.1 - resolution: "style-loader@npm:0.23.1" - dependencies: - loader-utils: "npm:^1.1.0" - schema-utils: "npm:^1.0.0" - checksum: 10c0/9752920e4284e53067282f8cca68402604db152b60251525106414ceb7dedbfa5571ad544c95062006c1ff8801aa337e231e848dd3f1a8f73ec3fa680f530895 - languageName: node - linkType: hard - -"supports-color@npm:^2.0.0": - version: 2.0.0 - resolution: "supports-color@npm:2.0.0" - checksum: 10c0/570e0b63be36cccdd25186350a6cb2eaad332a95ff162fa06d9499982315f2fe4217e69dd98e862fbcd9c81eaff300a825a1fe7bf5cc752e5b84dfed042b0dda - languageName: node - linkType: hard - -"supports-color@npm:^3.2.3": - version: 3.2.3 - resolution: "supports-color@npm:3.2.3" - dependencies: - has-flag: "npm:^1.0.0" - checksum: 10c0/d39a57dbd75c3b5740654f8ec16aaf7203b8d12b8a51314507bed590c9081120805f105b4ce741db13105e6f842ac09700e4bd665b9ffc46eb0b34ba54720bd3 - languageName: node - linkType: hard - -"supports-color@npm:^4.2.1": - version: 4.5.0 - resolution: "supports-color@npm:4.5.0" - dependencies: - has-flag: "npm:^2.0.0" - checksum: 10c0/2dc369eeac73954e87037dea1ebae0238b2abc0a39d7e35aa60eb8a84cc8d1dcade8b62e010597f5859f94c937e992abe6a6195460855fcc5e51f8cfc7fcc72a - languageName: node - linkType: hard - -"supports-color@npm:^5.3.0, supports-color@npm:^5.4.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 - languageName: node - linkType: hard - -"svgo@npm:^0.7.0": - version: 0.7.2 - resolution: "svgo@npm:0.7.2" - dependencies: - coa: "npm:~1.0.1" - colors: "npm:~1.1.2" - csso: "npm:~2.3.1" - js-yaml: "npm:~3.7.0" - mkdirp: "npm:~0.5.1" - sax: "npm:~1.2.1" - whet.extend: "npm:~0.9.9" - bin: - svgo: ./bin/svgo - checksum: 10c0/cc3314ec0227b7fd4dfcbc622b69e45ac79462a2add2c5198b863f107e4afe459e01812e668fae868b3fb02326ffbb4cd25ca7d1f2580656b14beae10eb2596c - languageName: node - linkType: hard - -"tapable@npm:^0.2.7": - version: 0.2.9 - resolution: "tapable@npm:0.2.9" - checksum: 10c0/93d0e5994621a9496112fe241784d59325684b509eb74d1abd9032802639b53ba9619db0f5db6ccdab994a5279bc4ed07b638a8a25143ba6b10603e409f314fb - languageName: node - linkType: hard - -"tar@npm:^7.5.4": - version: 7.5.12 - resolution: "tar@npm:7.5.12" - dependencies: - "@isaacs/fs-minipass": "npm:^4.0.0" - chownr: "npm:^3.0.0" - minipass: "npm:^7.1.2" - minizlib: "npm:^3.1.0" - yallist: "npm:^5.0.0" - checksum: 10c0/3825c5974f5fde792981f47ee9ffea021ee7f4b552b7ab95eeb98e5dfadfd5a5d5861f01fb772e2e5637a41980d3c019fd6cdad1be48b462b886abd7fe0fa17c - languageName: node - linkType: hard - -"through2@npm:^2.0.0": - version: 2.0.5 - resolution: "through2@npm:2.0.5" - dependencies: - readable-stream: "npm:~2.3.6" - xtend: "npm:~4.0.1" - checksum: 10c0/cbfe5b57943fa12b4f8c043658c2a00476216d79c014895cef1ac7a1d9a8b31f6b438d0e53eecbb81054b93128324a82ecd59ec1a4f91f01f7ac113dcb14eade - languageName: node - linkType: hard - -"timers-browserify@npm:^2.0.4": - version: 2.0.12 - resolution: "timers-browserify@npm:2.0.12" - dependencies: - setimmediate: "npm:^1.0.4" - checksum: 10c0/98e84db1a685bc8827c117a8bc62aac811ad56a995d07938fc7ed8cdc5bf3777bfe2d4e5da868847194e771aac3749a20f6cdd22091300fe889a76fe214a4641 - languageName: node - linkType: hard - -"tinyglobby@npm:^0.2.12": - version: 0.2.15 - resolution: "tinyglobby@npm:0.2.15" - dependencies: - fdir: "npm:^6.5.0" - picomatch: "npm:^4.0.3" - checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 - languageName: node - linkType: hard - -"to-arraybuffer@npm:^1.0.0": - version: 1.0.1 - resolution: "to-arraybuffer@npm:1.0.1" - checksum: 10c0/2460bd95524f4845a751e4f8bf9937f9f3dcd1651f104e1512868782f858f8302c1cf25bbc30794bc1b3ff65c4e135158377302f2abaff43a2d8e3c38dfe098c - languageName: node - linkType: hard + version "4.3.0" + resolved "https://github.com/CenterForOpenScience/dropzone.git#aba21eb6b82cc823ac7a7a53d6e035791c082bae" + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +electron-to-chromium@^1.2.7: + version "1.5.321" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz#57a80554e2e7fd65e3689d320f52a64723472d5d" + integrity sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ== + +elliptic@^6.5.3, elliptic@^6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" + integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== + dependencies: + once "^1.4.0" + +enhanced-resolve@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" + integrity sha512-ZaAux1rigq1e2nQrztHn4h2ugvpzZxs64qneNah+8Mh/K0CRqJFJc+UoXnUsq+1yX+DmQFPPdVqboKAJ89e0Iw== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + object-assign "^4.0.1" + tapable "^0.2.7" + +errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414" + integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== + dependencies: + is-arrayish "^0.2.1" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14: + version "0.10.64" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714" + integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + esniff "^2.0.1" + next-tick "^1.1.0" + +es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + integrity sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A== + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-set@~0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.6.tgz#5669e3b2aa01d61a50ba79964f733673574983b8" + integrity sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw== + dependencies: + d "^1.0.1" + es5-ext "^0.10.62" + es6-iterator "~2.0.3" + es6-symbol "^3.1.3" + event-emitter "^0.3.5" + type "^2.7.2" + +es6-symbol@^3.1.1, es6-symbol@^3.1.3, es6-symbol@~3.1.1: + version "3.1.4" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c" + integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg== + dependencies: + d "^1.0.2" + ext "^1.7.0" + +es6-weak-map@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + integrity sha512-75IUQsusDdalQEW/G/2esa87J7raqdJF+Ca0/Xm5C3Q58Nr4yVYjZGp/P1+2xiEVgXRrA39dpRb8LcshajbqDQ== + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esniff@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308" + integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== + dependencies: + d "^1.0.1" + es5-ext "^0.10.62" + event-emitter "^0.3.5" + type "^2.7.2" + +esprima@^2.6.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== + +esrecurse@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +event-emitter@^0.3.5, event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== + dependencies: + d "1" + es5-ext "~0.10.14" + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw== + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exports-loader@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.6.3.tgz#57dc78917f709b96f247fa91e69b554c855013c8" + integrity sha512-vBQgTnvmEB7qWmr7gzAzJRWptzYhkhvdXeH8sRnS//mIai6MgLZe1crlQ+VWTjCCXLlnhGuiuVMq0YfjA5AUOw== + dependencies: + loader-utils "0.2.x" + source-map "0.1.x" + +ext@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastparse@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + +file-loader@^0.11.2: + version "0.11.2" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.11.2.tgz#4ff1df28af38719a6098093b88c82c71d1794a34" + integrity sha512-N+uhF3mswIFeziHQjGScJ/yHXYt3DiLBeC+9vWW+WjUBiClMSOlV1YrXQi+7KM2aA3Rn4Bybgv+uXFQbfkzpvg== + dependencies: + loader-utils "^1.0.2" + +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + integrity sha512-46TFiBOzX7xq/PcSWfFwkyjpemdRnMe31UQF+os0y+1W3k95f6R4SEt02Hj4p3X0Mir9gfrkmOtshFidS0VPUg== + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA== + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.2, glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@^4.1.11, graceful-fs@^4.1.2: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +gsap@3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/gsap/-/gsap-3.9.1.tgz#d4c7443540497afee9ddc0824fd0180224e33360" + integrity sha512-JSGVYoC6da4pIjdF/yxFU6Rz8OojOIDkbooveZlfNg0+JIoFoRruyfWAEi6R/gUeNcuOiTqUIb0gi1nCNrHf8w== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +has@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== + +hash-base@^3.0.0, hash-base@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.2.tgz#79d72def7611c3f6e3c3b5730652638001b10a74" + integrity sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg== + dependencies: + inherits "^2.0.4" + readable-stream "^2.3.8" + safe-buffer "^5.2.1" + to-buffer "^1.2.1" + +hash-base@~3.0.4: + version "3.0.5" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.5.tgz#52480e285395cf7fba17dc4c9e47acdc7f248a8a" + integrity sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +highlight.js@~9.18.2: + version "9.18.5" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" + integrity sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== + +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg== + +icss-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + integrity sha512-bsVoyn/1V4R1kYYjLcWLedozAM4FClZUdjE9nIr8uWY7xs78y9DATgwz2wGU7M+7z55KenmmTkN2DVJ7bqzjAA== + dependencies: + postcss "^6.0.1" + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== + +imports-loader@^0.6.3: + version "0.6.5" + resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.6.5.tgz#ae74653031d59e37b3c2fb2544ac61aeae3530a6" + integrity sha512-fYIzBL9JOzJszvfeSGSKVjAtkWEtPUwP+OWiUxIWApcxsYh3iqZWZAp8xjTuhsvqglhqaetxeLLTaYyxIv1d4Q== + dependencies: + loader-utils "0.2.x" + source-map "0.1.x" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.16.1: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-svg@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" + integrity sha512-Ya1giYJUkcL/94quj0+XGcmts6cETPBW1MiFz1ReJrnDJ680F52qpAEGAEGU0nq96FRGIGPx6Yo1CyPXcOoyGw== + dependencies: + html-comment-regex "^1.1.0" + +is-typed-array@^1.1.14: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-what@^4.1.8: + version "4.1.16" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.16.tgz#1ad860a19da8b4895ad5495da3182ce2acdd7a6f" + integrity sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A== + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jquery-ui@>=1.10.4: + version "1.14.2" + resolved "https://registry.yarnpkg.com/jquery-ui/-/jquery-ui-1.14.2.tgz#515288b5c730b720acca6e53a0366827ad834053" + integrity sha512-1gSl7PUjyipa2adSr780Ujk16faicrV7PjPPzPtvWk7tTqBnsqp67NNV9jZK2+BIxUPXWSnIUU/LBCgwgGZE+Q== + dependencies: + jquery ">=1.12.0 <5.0.0" + +jquery@>=1.11.0, "jquery@>=1.12.0 <5.0.0", jquery@>=1.7: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-4.0.0.tgz#95c33ac29005ff72ec444c5ba1cf457e61404fbb" + integrity sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg== + +js-base64@^2.1.9: + version "2.6.4" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" + integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== + +js-cookie@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.1.tgz#9e39b4c6c2f56563708d7d31f6f5f21873a92414" + integrity sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw== + +js-md5@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/js-md5/-/js-md5-0.7.3.tgz#b4f2fbb0b327455f598d6727e38ec272cd09c3f2" + integrity sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== + +js-yaml@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + integrity sha512-eIlkGty7HGmntbV6P/ZlAsoncFLGsNoM27lkTzS+oneY/EiNhj+geqD9ezg/ip+SW6Var0BJU2JtV0vEUZpWVQ== + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +json-loader@^0.5.4: + version "0.5.7" + resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" + integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json5@^0.5.0, json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw== + +json5@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +jstimezonedetect@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/jstimezonedetect/-/jstimezonedetect-1.0.7.tgz#54bc13ff9960a6510288665cc9596244e21bd29d" + integrity sha512-ARADHortktl9IZ1tr4GHwGPIAzgz3mLNCbR/YjWtRtc/O0o634O3NeFlpLjv95EvuDA5dc8z6yfgbS8nUc4zcQ== + +knockout.validation@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/knockout.validation/-/knockout.validation-2.0.4.tgz#e87f82f41b5bdcb7029ea6be3fef2a903054558b" + integrity sha512-64eDuEvALXf5GsRK5b2WIetF/eSIlTsw/ZDerrhKt+3eRBBk95SXdczTLhcoNL4Hi8Gym14YYIjj7vLCXEeHDA== + +knockout@~3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/knockout/-/knockout-3.4.2.tgz#e87958de77ad1e936f7ce645bab8b5d7c456d937" + integrity sha512-yoY25btIjj8hLNd2HPF3Ld9fAf8idd/julcomODSdMX98C4pfODnWmPYmhnor9zh7cEAHpkMY04oLGKLXMqfvw== + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== + dependencies: + invert-kv "^1.0.0" + +less@^4.1.2: + version "4.6.4" + resolved "https://registry.yarnpkg.com/less/-/less-4.6.4.tgz#3ff8068e6c8a59f1ece8a6b9227bda28c1ed68a2" + integrity sha512-OJmO5+HxZLLw0RLzkqaNHzcgEAQG7C0y3aMbwtCzIUFZsLMNNq/1IdAdHEycQ58CwUO3jPTHmoN+tE5I7FQxNg== + dependencies: + copy-anything "^3.0.5" + parse-node-version "^1.0.1" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^3.1.0" + source-map "~0.6.0" + +linkifyjs@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-3.0.5.tgz#99e51a3a0c0e232fcb63ebb89eea3ff923378f34" + integrity sha512-1Y9XQH65eQKA9p2xtk+zxvnTeQBG7rdAXSkUG97DmuI/Xhji9uaUzaWxRj6rf9YC0v8KKHkxav7tnLX82Sz5Fg== + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ== + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@0.2.x: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + integrity sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug== + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loaders.css@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/loaders.css/-/loaders.css-0.1.2.tgz#3a9fb43726c73334a38142af9d0629019b658743" + integrity sha512-Rhowlq24ey1VOeor+3wYOt9+MjaxBOJm1u4KlQgNC3+0xJ0LS4wq4iG57D/BPzvuD/7HHDGQOWJ+81oR2EI9bQ== + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.find@^4.3.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" + integrity sha512-yaRZoAV3Xq28F1iafWN1+a0rflOej93l1DQUejs3SZ41h2O9UJBoS9aueGjPDgAl4B6tPC0NuuchLKaDQQ3Isg== + +lodash.get@^4.2.1: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== + +lodash.has@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" + integrity sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g== + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.set@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + integrity sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.14: + version "4.17.23" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a" + integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== + +lru-cache@^4.0.1, lru-cache@^4.1.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +math-expression-evaluator@^1.2.14: + version "1.4.0" + resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.4.0.tgz#3d66031117fbb7b9715ea6c9c68c2cd2eebd37e2" + integrity sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ== + dependencies: + mimic-fn "^1.0.0" + +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@^3.1.1: + version "3.1.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mithril@0.2.0, mithril@>=0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/mithril/-/mithril-0.2.0.tgz#98e007699a15b243a26b3b522f61bee90fa5ffb9" + integrity sha512-mp4pkyARLJmTyzuHJs8Q3Voh0Hg38n0HSmzQY1xhUKP9Hg+tLx5Dfzjf7Jlu9SWMCU9giZX/Xj4xsYFqjszSWA== + +mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +moment@^2.14.1: + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ== + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +needle@^3.1.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-3.5.0.tgz#aa2023642cb41b11a11babb733fd8fa952919112" + integrity sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w== + dependencies: + iconv-lite "^0.6.3" + sax "^1.2.4" + +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +node-libs-browser@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^1.4.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ== + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + integrity sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parse-asn1@^5.0.0, parse-asn1@^5.1.9: + version "5.1.9" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.9.tgz#8dd24c3ea8da77dffbc708d94eaf232fd6156e95" + integrity sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg== + dependencies: + asn1.js "^4.10.1" + browserify-aes "^1.2.0" + evp_bytestokey "^1.0.3" + pbkdf2 "^3.1.5" + safe-buffer "^5.2.1" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== + dependencies: + error-ex "^1.2.0" + +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ== + dependencies: + pify "^2.0.0" + +pbkdf2@^3.1.2, pbkdf2@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.5.tgz#444a59d7a259a95536c56e80c89de31cc01ed366" + integrity sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ== + dependencies: + create-hash "^1.2.0" + create-hmac "^1.1.7" + ripemd160 "^2.0.3" + safe-buffer "^5.2.1" + sha.js "^2.4.12" + to-buffer "^1.2.1" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pikaday@^1.3.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/pikaday/-/pikaday-1.8.2.tgz#72cc73fab7ccc068cbdf7dcaa1ce400fcfd894e3" + integrity sha512-TNtsE+34BIax3WtkB/qqu5uepV1McKYEgvL3kWzU7aqPCpMEN6rBF3AOwu4WCwAealWlBGobXny/9kJb49C1ew== + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw== + dependencies: + find-up "^2.1.0" + +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + +postcss-calc@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" + integrity sha512-iBcptYFq+QUh9gzP7ta2btw50o40s4uLI4UDVgd5yRAZtUDWc5APdl5yQDd2h/TyiZNbJrv0HiYhT102CMgN7Q== + dependencies: + postcss "^5.0.2" + postcss-message-helpers "^2.0.0" + reduce-css-calc "^1.2.6" + +postcss-colormin@^2.1.8: + version "2.2.2" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" + integrity sha512-XXitQe+jNNPf+vxvQXIQ1+pvdQKWKgkx8zlJNltcMEmLma1ypDRDQwlLt+6cP26fBreihNhZxohh1rcgCH2W5w== + dependencies: + colormin "^1.0.5" + postcss "^5.0.13" + postcss-value-parser "^3.2.3" + +postcss-convert-values@^2.3.4: + version "2.6.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" + integrity sha512-SE7mf25D3ORUEXpu3WUqQqy0nCbMuM5BEny+ULE/FXdS/0UMA58OdzwvzuHJRpIFlk1uojt16JhaEogtP6W2oA== + dependencies: + postcss "^5.0.11" + postcss-value-parser "^3.1.2" + +postcss-discard-comments@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" + integrity sha512-yGbyBDo5FxsImE90LD8C87vgnNlweQkODMkUZlDVM/CBgLr9C5RasLGJxxh9GjVOBeG8NcCMatoqI1pXg8JNXg== + dependencies: + postcss "^5.0.14" + +postcss-discard-duplicates@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" + integrity sha512-+lk5W1uqO8qIUTET+UETgj9GWykLC3LOldr7EehmymV0Wu36kyoHimC4cILrAAYpHQ+fr4ypKcWcVNaGzm0reA== + dependencies: + postcss "^5.0.4" + +postcss-discard-empty@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" + integrity sha512-IBFoyrwk52dhF+5z/ZAbzq5Jy7Wq0aLUsOn69JNS+7YeuyHaNzJwBIYE0QlUH/p5d3L+OON72Fsexyb7OK/3og== + dependencies: + postcss "^5.0.14" + +postcss-discard-overridden@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" + integrity sha512-IyKoDL8QNObOiUc6eBw8kMxBHCfxUaERYTUe2QF8k7j/xiirayDzzkmlR6lMQjrAM1p1DDRTvWrS7Aa8lp6/uA== + dependencies: + postcss "^5.0.16" + +postcss-discard-unused@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" + integrity sha512-nCbFNfqYAbKCw9J6PSJubpN9asnrwVLkRDFc4KCwyUEdOtM5XDE/eTW3OpqHrYY1L4fZxgan7LLRAAYYBzwzrg== + dependencies: + postcss "^5.0.14" + uniqs "^2.0.0" + +postcss-filter-plugins@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" + integrity sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ== + dependencies: + postcss "^5.0.4" + +postcss-merge-idents@^2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + integrity sha512-9DHmfCZ7/hNHhIKnNkz4CU0ejtGen5BbTRJc13Z2uHfCedeCUsK2WEQoAJRBL+phs68iWK6Qf8Jze71anuysWA== + dependencies: + has "^1.0.1" + postcss "^5.0.10" + postcss-value-parser "^3.1.1" + +postcss-merge-longhand@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" + integrity sha512-ma7YvxjdLQdifnc1HFsW/AW6fVfubGyR+X4bE3FOSdBVMY9bZjKVdklHT+odknKBB7FSCfKIHC3yHK7RUAqRPg== + dependencies: + postcss "^5.0.4" + +postcss-merge-rules@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" + integrity sha512-Wgg2FS6W3AYBl+5L9poL6ZUISi5YzL+sDCJfM7zNw/Q1qsyVQXXZ2cbVui6mu2cYJpt1hOKCGj1xA4mq/obz/Q== + dependencies: + browserslist "^1.5.2" + caniuse-api "^1.5.2" + postcss "^5.0.4" + postcss-selector-parser "^2.2.2" + vendors "^1.0.0" + +postcss-message-helpers@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" + integrity sha512-tPLZzVAiIJp46TBbpXtrUAKqedXSyW5xDEo1sikrfEfnTs+49SBZR/xDdqCiJvSSbtr615xDsaMF3RrxS2jZlA== + +postcss-minify-font-values@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" + integrity sha512-vFSPzrJhNe6/8McOLU13XIsERohBJiIFFuC1PolgajOZdRWqRgKITP/A4Z/n4GQhEmtbxmO9NDw3QLaFfE1dFQ== + dependencies: + object-assign "^4.0.1" + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-minify-gradients@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" + integrity sha512-DZhT0OE+RbVqVyGsTIKx84rU/5cury1jmwPa19bViqYPQu499ZU831yMzzsyC8EhiZVd73+h5Z9xb/DdaBpw7Q== + dependencies: + postcss "^5.0.12" + postcss-value-parser "^3.3.0" + +postcss-minify-params@^1.0.4: + version "1.2.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" + integrity sha512-hhJdMVgP8vasrHbkKAk+ab28vEmPYgyuDzRl31V3BEB3QOR3L5TTIVEWLDNnZZ3+fiTi9d6Ker8GM8S1h8p2Ow== + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.2" + postcss-value-parser "^3.0.2" + uniqs "^2.0.0" + +postcss-minify-selectors@^2.0.4: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" + integrity sha512-e13vxPBSo3ZaPne43KVgM+UETkx3Bs4/Qvm6yXI9HQpQp4nyb7HZ0gKpkF+Wn2x+/dbQ+swNpCdZSbMOT7+TIA== + dependencies: + alphanum-sort "^1.0.2" + has "^1.0.1" + postcss "^5.0.14" + postcss-selector-parser "^2.0.0" + +postcss-modules-extract-imports@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a" + integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw== + dependencies: + postcss "^6.0.1" + +postcss-modules-local-by-default@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + integrity sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA== + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-scope@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + integrity sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw== + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-values@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + integrity sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA== + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + +postcss-normalize-charset@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" + integrity sha512-RKgjEks83l8w4yEhztOwNZ+nLSrJ+NvPNhpS+mVDzoaiRHZQVoG7NF2TP5qjwnaN9YswUhj6m1E0S0Z+WDCgEQ== + dependencies: + postcss "^5.0.5" + +postcss-normalize-url@^3.0.7: + version "3.0.8" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" + integrity sha512-WqtWG6GV2nELsQEFES0RzfL2ebVwmGl/M8VmMbshKto/UClBo+mznX8Zi4/hkThdqx7ijwv+O8HWPdpK7nH/Ig== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^1.4.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + +postcss-ordered-values@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" + integrity sha512-5RB1IUZhkxDCfa5fx/ogp/A82mtq+r7USqS+7zt0e428HJ7+BHCxyeY39ClmkkUtxdOd3mk8gD6d9bjH2BECMg== + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.1" + +postcss-reduce-idents@^2.2.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" + integrity sha512-0+Ow9e8JLtffjumJJFPqvN4qAvokVbdQPnijUDSOX8tfTwrILLP4ETvrZcXZxAtpFLh/U0c+q8oRMJLr1Kiu4w== + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-reduce-initial@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" + integrity sha512-jJFrV1vWOPCQsIVitawGesRgMgunbclERQ/IRGW7r93uHrVzNQQmHQ7znsOIjJPZ4yWMzs5A8NFhp3AkPHPbDA== + dependencies: + postcss "^5.0.4" + +postcss-reduce-transforms@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" + integrity sha512-lGgRqnSuAR5i5uUg1TA33r9UngfTadWxOyL2qx1KuPoCQzfmtaHjp9PuwX7yVyRxG3BWBzeFUaS5uV9eVgnEgQ== + dependencies: + has "^1.0.1" + postcss "^5.0.8" + postcss-value-parser "^3.0.1" + +postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" + integrity sha512-3pqyakeGhrO0BQ5+/tGTfvi5IAUAhHRayGK8WFSu06aEv2BmHoXw/Mhb+w7VY5HERIuC+QoUI7wgrCcq2hqCVA== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^2.1.1: + version "2.1.6" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" + integrity sha512-y5AdQdgBoF4rbpdbeWAJuxE953g/ylRfVNp6mvAi61VCN/Y25Tu9p5mh3CyI42WbTRIiwR9a1GdFtmDnNPeskQ== + dependencies: + is-svg "^2.0.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + svgo "^0.7.0" + +postcss-unique-selectors@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" + integrity sha512-WZX8r1M0+IyljoJOJleg3kYm10hxNYF9scqAT7v/xeSX1IdehutOM85SNO0gP9K+bgs86XERr7Ud5u3ch4+D8g== + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-zindex@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" + integrity sha512-uhRZ2hRgj0lorxm9cr62B01YzpUe63h0RXMXQ4gWW3oa2rpJh+FJAiEAytaFCPU/VgaBS+uW2SJ1XKyDNz1h4w== + dependencies: + has "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: + version "5.2.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" + integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.1: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + +public-encrypt@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0, pump@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== + +qs@^6.12.3: + version "6.15.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.0.tgz#db8fd5d1b1d2d6b5b33adaf87429805f1909e7b3" + integrity sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ== + dependencies: + side-channel "^1.1.0" + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q== + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +raw-loader@~0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" + integrity sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q== + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w== + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA== + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@^2.3.8, readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +reduce-css-calc@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + integrity sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA== + dependencies: + balanced-match "^0.4.2" + math-expression-evaluator "^1.2.14" + reduce-function-call "^1.0.1" + +reduce-function-call@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.3.tgz#60350f7fb252c0a67eb10fd4694d16909971300f" + integrity sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ== + dependencies: + balanced-match "^1.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== + +resolve@^1.10.0: + version "1.22.11" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" + integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== + dependencies: + is-core-module "^2.16.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rimraf@^2.5.4, rimraf@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.3.tgz#9be54e4ba5e3559c8eee06a25cd7648bbccdf5a8" + integrity sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA== + dependencies: + hash-base "^3.1.2" + inherits "^2.0.4" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg== + dependencies: + aproba "^1.1.1" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.0.tgz#da59637629307b97e7c4cb28e080a7bc38560d5b" + integrity sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA== + +sax@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" + integrity sha512-QaVYBaD9U8scJw2EBWnCBY+LJ0AD+/2edTaigDs0XLDLBfJmSUK9KGqktg1rb32U3z4j/XwvFwHHH1YfbYFd7Q== + dependencies: + ajv "^5.0.0" + +schema-utils@^0.4.5: + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +select2@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/select2/-/select2-3.5.1.tgz#f2819489bbc65fd6d328be72bbe2b95dd7e87cfe" + integrity sha512-IFX3UFPpPyK1I1Kuw1R1x+upMyNAZbMlkFhiTnRCRR7ii0KU1brmJMLa3GZcrMWCHiQlm0eKqb6i4XO4pqOrGQ== + +"semver@2 || 3 || 4 || 5", semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +serialize-javascript@^1.4.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" + integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +sha.js@^2.4.0, sha.js@^2.4.12, sha.js@^2.4.8: + version "2.4.12" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f" + integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + to-buffer "^1.2.0" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +signal-exit@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg== + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map@0.1.x: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + integrity sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ== + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.3, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.23" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz#b069e687b1291a32f126893ed76a27a745ee2133" + integrity sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +ssri@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== + dependencies: + safe-buffer "^5.1.1" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" + integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + +style-loader@^0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== + dependencies: + has-flag "^1.0.0" + +supports-color@^4.2.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + integrity sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw== + dependencies: + has-flag "^2.0.0" + +supports-color@^5.3.0, supports-color@^5.4.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svgo@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" + integrity sha512-jT/g9FFMoe9lu2IT6HtAxTA7RR2XOrmcrmCtGnyB/+GQnV6ZjNn+KOHZbZ35yL81+1F/aB6OeEsJztzBQ2EEwA== + dependencies: + coa "~1.0.1" + colors "~1.1.2" + csso "~2.3.1" + js-yaml "~3.7.0" + mkdirp "~0.5.1" + sax "~1.2.1" + whet.extend "~0.9.9" + +tapable@^0.2.7: + version "0.2.9" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8" + integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A== + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== + +to-buffer@^1.2.0, to-buffer@^1.2.1, to-buffer@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.2.tgz#ffe59ef7522ada0a2d1cb5dfe03bb8abc3cdc133" + integrity sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw== + dependencies: + isarray "^2.0.5" + safe-buffer "^5.2.1" + typed-array-buffer "^1.0.3" "treebeard@https://github.com/CenterForOpenScience/treebeard.git#d2bb8f6f8104fcac040402727f431c26722b269e": - version: 0.6.1 - resolution: "treebeard@https://github.com/CenterForOpenScience/treebeard.git#commit=d2bb8f6f8104fcac040402727f431c26722b269e" - dependencies: - bootstrap: "npm:~3.3.2" - jquery: "npm:>=1.11.0" - jquery-ui: "npm:>=1.10.4" - mithril: "npm:>=0.2" - checksum: 10c0/7e6828645a194d2bc2ad96c8efd6a3fd9077cf1be9c443c8a76e48e3427f10643af3ce19a2fd8b9a56913d420a2792f754cca3013057cac5b574005861939f63 - languageName: node - linkType: hard - -"tslib@npm:^2.3.0": - version: 2.3.1 - resolution: "tslib@npm:2.3.1" - checksum: 10c0/4efd888895bdb3b987086b2b7793ad1013566f882b0eb7a328384e5ecc0d71cafb16bbeab3196200cbf7f01a73ccc25acc2f131d4ea6ee959be7436a8a306482 - languageName: node - linkType: hard - -"tty-browserify@npm:0.0.0": - version: 0.0.0 - resolution: "tty-browserify@npm:0.0.0" - checksum: 10c0/c0c68206565f1372e924d5cdeeff1a0d9cc729833f1da98c03d78be8f939e5f61a107bd0ab77d1ef6a47d62bb0e48b1081fbea273acf404959e22fd3891439c5 - languageName: node - linkType: hard - -"type@npm:^1.0.1": - version: 1.2.0 - resolution: "type@npm:1.2.0" - checksum: 10c0/444660849aaebef8cbb9bc43b28ec2068952064cfce6a646f88db97aaa2e2d6570c5629cd79238b71ba23aa3f75146a0b96e24e198210ee0089715a6f8889bf7 - languageName: node - linkType: hard - -"type@npm:^2.5.0": - version: 2.6.0 - resolution: "type@npm:2.6.0" - checksum: 10c0/d08063a1c3415140d0b6fd17ede55f373cdd6c5503776693ad5ead574a06404823374d62d6233e43bc30ec22f596b790cbb8661429bed75a75dab986b506ac60 - languageName: node - linkType: hard - -"typeahead.js@npm:^0.11.1": - version: 0.11.1 - resolution: "typeahead.js@npm:0.11.1" - dependencies: - jquery: "npm:>=1.7" - checksum: 10c0/c5c0387e711ad1cae8993bbae55a26d2ca0d6f06de550466977109ba323fe019e241c7d8e3858455214dc4bbfdec82481cd2f6313629eefe0c587222915ffa28 - languageName: node - linkType: hard - -"typedarray@npm:^0.0.6": - version: 0.0.6 - resolution: "typedarray@npm:0.0.6" - checksum: 10c0/6005cb31df50eef8b1f3c780eb71a17925f3038a100d82f9406ac2ad1de5eb59f8e6decbdc145b3a1f8e5836e17b0c0002fb698b9fe2516b8f9f9ff602d36412 - languageName: node - linkType: hard - -"uglify-es@npm:^3.3.4": - version: 3.3.9 - resolution: "uglify-es@npm:3.3.9" - dependencies: - commander: "npm:~2.13.0" - source-map: "npm:~0.6.1" - bin: - uglifyjs: bin/uglifyjs - checksum: 10c0/b591de4ea2c7153f446f80f2559bbabcb4ff53a17dbfd27b9bb980b31f5fb7e563bdae6e9abc07d97ecb484ac4ceba4c7a207e6854cb2aaca72e80e6090c989e - languageName: node - linkType: hard - -"uglifyjs-webpack-plugin@npm:1.3.0": - version: 1.3.0 - resolution: "uglifyjs-webpack-plugin@npm:1.3.0" - dependencies: - cacache: "npm:^10.0.4" - find-cache-dir: "npm:^1.0.0" - schema-utils: "npm:^0.4.5" - serialize-javascript: "npm:^1.4.0" - source-map: "npm:^0.6.1" - uglify-es: "npm:^3.3.4" - webpack-sources: "npm:^1.1.0" - worker-farm: "npm:^1.5.2" - peerDependencies: - webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 - checksum: 10c0/d10ae2ac25f64afddff328fbaa58640450c099c53e44d66829681a5415ef72aa2563d1e5ed43e0e9c409db869575fd914293faaa39288e21da518084878de413 - languageName: node - linkType: hard - -"uniq@npm:^1.0.1": - version: 1.0.1 - resolution: "uniq@npm:1.0.1" - checksum: 10c0/369dca4a07fdd8de9e48378b9d4b6861722ca71d5f496e91687916bd4b48b8cf3d6db1677be1b40eea63bc6d4728efb4b4e0bd7a89c5fd2d23e7a2cff8009c7a - languageName: node - linkType: hard - -"uniqs@npm:^2.0.0": - version: 2.0.0 - resolution: "uniqs@npm:2.0.0" - checksum: 10c0/f244b158f6b3d30ddea2092c581fe9eb746d6db889a859fd0001e4b7566767bfcc53cdf11e6286f097bb130ebad71025709f41f2e4dd38e5c2f03ec28052baab - languageName: node - linkType: hard - -"unique-filename@npm:^1.1.0": - version: 1.1.1 - resolution: "unique-filename@npm:1.1.1" - dependencies: - unique-slug: "npm:^2.0.0" - checksum: 10c0/d005bdfaae6894da8407c4de2b52f38b3c58ec86e79fc2ee19939da3085374413b073478ec54e721dc8e32b102cf9e50d0481b8331abdc62202e774b789ea874 - languageName: node - linkType: hard - -"unique-slug@npm:^2.0.0": - version: 2.0.2 - resolution: "unique-slug@npm:2.0.2" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/9eabc51680cf0b8b197811a48857e41f1364b25362300c1ff636c0eca5ec543a92a38786f59cf0697e62c6f814b11ecbe64e8093db71246468a1f03b80c83970 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: "npm:^2.1.0" - checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c - languageName: node - linkType: hard - -"url-loader@npm:~0.6.2": - version: 0.6.2 - resolution: "url-loader@npm:0.6.2" - dependencies: - loader-utils: "npm:^1.0.2" - mime: "npm:^1.4.1" - schema-utils: "npm:^0.3.0" - peerDependencies: - file-loader: "*" - checksum: 10c0/c8e2de856011315fb436201ddd2f870d5bc52fcca68cb69c35f74cab891e5a24b97cd75dd4c753046d55841521b0c0939e7f9aef5170b7c8536c6cd3617880b4 - languageName: node - linkType: hard - -"url@npm:^0.11.0": - version: 0.11.0 - resolution: "url@npm:0.11.0" - dependencies: - punycode: "npm:1.3.2" - querystring: "npm:0.2.0" - checksum: 10c0/bbe05f9f570ec5c06421c50ca63f287e61279092eed0891db69a9619323703ccd3987e6eed234c468794cf25680c599680d5c1f58d26090f1956c8e9ed8346a2 - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 - languageName: node - linkType: hard - -"util@npm:0.10.3": - version: 0.10.3 - resolution: "util@npm:0.10.3" - dependencies: - inherits: "npm:2.0.1" - checksum: 10c0/88bb58fec3b1f5f43dea27795f61f24b3b505bbba6f3ad6e91b32db0cd0928b2acb54ebe21603a75743c6e21a52f954cd2ffb6cddafed5a01169dd1287db3ff3 - languageName: node - linkType: hard - -"util@npm:^0.11.0": - version: 0.11.1 - resolution: "util@npm:0.11.1" - dependencies: - inherits: "npm:2.0.3" - checksum: 10c0/8e9d1a85e661c8a8d9883d821aedbff3f8d9c3accd85357020905386ada5653b20389fc3591901e2a0bde64f8dc86b28c3f990114aa5a38eaaf30b455fa3cdf6 - languageName: node - linkType: hard - -"validate-npm-package-license@npm:^3.0.1": - version: 3.0.4 - resolution: "validate-npm-package-license@npm:3.0.4" - dependencies: - spdx-correct: "npm:^3.0.0" - spdx-expression-parse: "npm:^3.0.0" - checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f - languageName: node - linkType: hard - -"vendors@npm:^1.0.0": - version: 1.0.4 - resolution: "vendors@npm:1.0.4" - checksum: 10c0/a9b097f3607013a23bf447cbaff85b79b694cc23b20e81a6aea1ea9e1c59854c93f7c87abcc71b57999e050606e499d9ce18df67968823644b20f6e03d56022a - languageName: node - linkType: hard - -"vm-browserify@npm:^1.0.1": - version: 1.1.2 - resolution: "vm-browserify@npm:1.1.2" - checksum: 10c0/0cc1af6e0d880deb58bc974921320c187f9e0a94f25570fca6b1bd64e798ce454ab87dfd797551b1b0cc1849307421aae0193cedf5f06bdb5680476780ee344b - languageName: node - linkType: hard - -"watchpack@npm:^2.3.1": - version: 2.3.1 - resolution: "watchpack@npm:2.3.1" - dependencies: - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.1.2" - checksum: 10c0/00e44f5cc6ca299dd1ff52bf926a70a23ae1aeb6b399b7e32569d6d31ef1fc9bc3f5570ade6fef220dd6d74ee70259c9621b79cf487552caf1ea2727aa40f984 - languageName: node - linkType: hard - -"webpack-sources@npm:^1.0.1, webpack-sources@npm:^1.1.0": - version: 1.4.3 - resolution: "webpack-sources@npm:1.4.3" - dependencies: - source-list-map: "npm:^2.0.0" - source-map: "npm:~0.6.1" - checksum: 10c0/78dafb3e1e297d3f4eb6204311e8c64d28cd028f82887ba33aaf03fffc82482d8e1fdf6de25a60f4dde621d3565f4c3b1bfb350f09add8f4e54e00279ff3db5e - languageName: node - linkType: hard - -"webpack@npm:3.12.0": - version: 3.12.0 - resolution: "webpack@npm:3.12.0" - dependencies: - acorn: "npm:^5.0.0" - acorn-dynamic-import: "npm:^2.0.0" - ajv: "npm:^6.1.0" - ajv-keywords: "npm:^3.1.0" - async: "npm:^2.1.2" - enhanced-resolve: "npm:^3.4.0" - escope: "npm:^3.6.0" - interpret: "npm:^1.0.0" - json-loader: "npm:^0.5.4" - json5: "npm:^0.5.1" - loader-runner: "npm:^2.3.0" - loader-utils: "npm:^1.1.0" - memory-fs: "npm:~0.4.1" - mkdirp: "npm:~0.5.0" - node-libs-browser: "npm:^2.0.0" - source-map: "npm:^0.5.3" - supports-color: "npm:^4.2.1" - tapable: "npm:^0.2.7" - uglifyjs-webpack-plugin: "npm:^0.4.6" - watchpack: "npm:^1.4.0" - webpack-sources: "npm:^1.0.1" - yargs: "npm:^8.0.2" - bin: - webpack: ./bin/webpack.js - checksum: 10c0/64051e33b94d641ea6ed85e6d33d0964ff27ce28f4dd9a989dee39ce98b67fadd057fecd2bfdf49c8fe8909c0c74e415f01381e7a105f926968b1a6eb92f5220 - languageName: node - linkType: hard - -"whet.extend@npm:~0.9.9": - version: 0.9.9 - resolution: "whet.extend@npm:0.9.9" - checksum: 10c0/75c48bfe0cdd36b7c510286d591b34a1a6810ba914b0c8f23788c2a17f4592706debaf1f1f667c7f46f1a657c4f1d5f2889ce234b570827acbb29bf28799ce7f - languageName: node - linkType: hard - -"which-module@npm:^2.0.0": - version: 2.0.0 - resolution: "which-module@npm:2.0.0" - checksum: 10c0/946ffdbcd6f0cf517638f8f2319c6d51e528c3b41bc2c0f5dc3dc46047347abd7326aea5cdf5def0a8b32bdca313ac87a32ce5a76b943fe1ca876c4557e6b716 - languageName: node - linkType: hard - -"which@npm:^1.2.9": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: "npm:^2.0.0" - bin: - which: ./bin/which - checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 - languageName: node - linkType: hard - -"which@npm:^6.0.0": - version: 6.0.1 - resolution: "which@npm:6.0.1" - dependencies: - isexe: "npm:^4.0.0" - bin: - node-which: bin/which.js - checksum: 10c0/7e710e54ea36d2d6183bee2f9caa27a3b47b9baf8dee55a199b736fcf85eab3b9df7556fca3d02b50af7f3dfba5ea3a45644189836df06267df457e354da66d5 - languageName: node - linkType: hard - -"worker-farm@npm:^1.5.2": - version: 1.7.0 - resolution: "worker-farm@npm:1.7.0" - dependencies: - errno: "npm:~0.1.7" - checksum: 10c0/069a032f9198a07273a7608dc0c23d7288c1c25256b66008e1ae95838cda6fa2c7aefb3b7ba760f975c8d18120ca54eb193afb66d7237b2a05e5da12c1c961f7 - languageName: node - linkType: hard - -"wrap-ansi@npm:^2.0.0": - version: 2.1.0 - resolution: "wrap-ansi@npm:2.1.0" - dependencies: - string-width: "npm:^1.0.1" - strip-ansi: "npm:^3.0.1" - checksum: 10c0/1a47367eef192fc9ecaf00238bad5de8987c3368082b619ab36c5e2d6d7b0a2aef95a2ca65840be598c56ced5090a3ba487956c7aee0cac7c45017502fa980fb - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 - languageName: node - linkType: hard - -"xtend@npm:^4.0.0, xtend@npm:~4.0.1": - version: 4.0.2 - resolution: "xtend@npm:4.0.2" - checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e - languageName: node - linkType: hard - -"y18n@npm:^3.2.1": - version: 3.2.2 - resolution: "y18n@npm:3.2.2" - checksum: 10c0/08dc1880f6f766057ed25cd61ef0c7dab3db93639db9a7487a84f75dac7a349dface8dff8d1d8b7bdf50969fcd69ab858ab26b06968b4e4b12ee60d195233c46 - languageName: node - linkType: hard - -"y18n@npm:^4.0.0": - version: 4.0.3 - resolution: "y18n@npm:4.0.3" - checksum: 10c0/308a2efd7cc296ab2c0f3b9284fd4827be01cfeb647b3ba18230e3a416eb1bc887ac050de9f8c4fd9e7856b2e8246e05d190b53c96c5ad8d8cb56dffb6f81024 - languageName: node - linkType: hard - -"yallist@npm:^2.1.2": - version: 2.1.2 - resolution: "yallist@npm:2.1.2" - checksum: 10c0/0b9e25aa00adf19e01d2bcd4b208aee2b0db643d9927131797b7af5ff69480fc80f1c3db738cbf3946f0bddf39d8f2d0a5709c644fd42d4aa3a4e6e786c087b5 - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a - languageName: node - linkType: hard - -"yallist@npm:^5.0.0": - version: 5.0.0 - resolution: "yallist@npm:5.0.0" - checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 - languageName: node - linkType: hard - -"yargs-parser@npm:^7.0.0": - version: 7.0.0 - resolution: "yargs-parser@npm:7.0.0" - dependencies: - camelcase: "npm:^4.1.0" - checksum: 10c0/6fde2df522dd071cf76308fe4e37fd2fb8eae3eb1fb6c6759c2d448264c8451162649eb8558ac8d83aff79278cabfddc17ecba3e1a0d0fe2e406cf4e1bc95b0d - languageName: node - linkType: hard - -"yargs@npm:^8.0.2": - version: 8.0.2 - resolution: "yargs@npm:8.0.2" - dependencies: - camelcase: "npm:^4.1.0" - cliui: "npm:^3.2.0" - decamelize: "npm:^1.1.1" - get-caller-file: "npm:^1.0.1" - os-locale: "npm:^2.0.0" - read-pkg-up: "npm:^2.0.0" - require-directory: "npm:^2.1.1" - require-main-filename: "npm:^1.0.1" - set-blocking: "npm:^2.0.0" - string-width: "npm:^2.0.0" - which-module: "npm:^2.0.0" - y18n: "npm:^3.2.1" - yargs-parser: "npm:^7.0.0" - checksum: 10c0/70e4ed99e3f1e8a034d0b600773db9fb44e03ec88cfa7125fc65a965428051ad59e77c074afa1afcbe3ec34436d3a6e7ba18b3ec62b4e5f59f30606df791b125 - languageName: node - linkType: hard - -"zxcvbn@npm:^4.2.0": - version: 4.4.2 - resolution: "zxcvbn@npm:4.4.2" - checksum: 10c0/862f101cc95247b30290bad67ade333e430a16763bb771ce4e4c5414396d987f9a64288225675c96bd6f8d3eba65da0dee119b2a4eaa2e249da3f540b036942e - languageName: node - linkType: hard + version "0.6.1" + resolved "https://github.com/CenterForOpenScience/treebeard.git#d2bb8f6f8104fcac040402727f431c26722b269e" + dependencies: + bootstrap "~3.3.2" + jquery ">=1.11.0" + jquery-ui ">=1.10.4" + mithril ">=0.2" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== + +type@^2.7.2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.3.tgz#436981652129285cc3ba94f392886c2637ea0486" + integrity sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ== + +typeahead.js@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/typeahead.js/-/typeahead.js-0.11.1.tgz#4e64e671b22310a8606f4aec805924ba84b015b8" + integrity sha512-yGaLzGjVHyryZdNfrWz2NHXUwEO7hrlVmGMGCo5+6mH3nEEhcQ0Te3mK3G60uRnxfERu8twOWSU4WmwScbwhMg== + dependencies: + jquery ">=1.7" + +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +uglify-es@^3.3.4: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +uglifyjs-webpack-plugin@1.3.0, uglifyjs-webpack-plugin@^0.4.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" + integrity sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw== + dependencies: + cacache "^10.0.4" + find-cache-dir "^1.0.0" + schema-utils "^0.4.5" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + uglify-es "^3.3.4" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ== + +unique-filename@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-loader@~0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7" + integrity sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q== + dependencies: + loader-utils "^1.0.2" + mime "^1.4.1" + schema-utils "^0.3.0" + +url@^0.11.0: + version "0.11.4" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.4.tgz#adca77b3562d56b72746e76b330b7f27b6721f3c" + integrity sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg== + dependencies: + punycode "^1.4.1" + qs "^6.12.3" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.10.4: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +watchpack@^1.4.0, watchpack@^2.3.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.1.tgz#dd38b601f669e0cbf567cb802e75cead82cde102" + integrity sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +webpack-sources@^1.0.1, webpack-sources@^1.1.0: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz#3f9e34360370602fcf639e97939db486f4ec0d74" + integrity sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ== + dependencies: + acorn "^5.0.0" + acorn-dynamic-import "^2.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + async "^2.1.2" + enhanced-resolve "^3.4.0" + escope "^3.6.0" + interpret "^1.0.0" + json-loader "^0.5.4" + json5 "^0.5.1" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + mkdirp "~0.5.0" + node-libs-browser "^2.0.0" + source-map "^0.5.3" + supports-color "^4.2.1" + tapable "^0.2.7" + uglifyjs-webpack-plugin "^0.4.6" + watchpack "^1.4.0" + webpack-sources "^1.0.1" + yargs "^8.0.2" + +whet.extend@~0.9.9: + version "0.9.9" + resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" + integrity sha512-mmIPAft2vTgEILgPeZFqE/wWh24SEsR/k+N9fJ3Jxrz44iDFy9aemCxdksfURSHYFCLmvs/d/7Iso5XjPpNfrA== + +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which-typed-array@^1.1.16: + version "1.1.20" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122" + integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +worker-farm@^1.5.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + integrity sha512-WhzC+xgstid9MbVUktco/bf+KJG+Uu6vMX0LN1sLJvwmbCQVxb4D8LzogobonKycNasCZLdOzTAk1SK7+K7swg== + dependencies: + camelcase "^4.1.0" + +yargs@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + integrity sha512-3RiZrpLpjrzIAKgGdPktBcMP/eG5bDFlkI+PHle1qwzyVXyDQL+pD/eZaMoOOO0Y7LLBfjpucObuUm/icvbpKQ== + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + +zxcvbn@^4.2.0: + version "4.4.2" + resolved "https://registry.yarnpkg.com/zxcvbn/-/zxcvbn-4.4.2.tgz#28ec17cf09743edcab056ddd8b1b06262cc73c30" + integrity sha512-Bq0B+ixT/DMyG8kgX2xWcI5jUvCwqrMxSFam7m0lAf78nf04hv6lNCsyLYdyYTrCVMqNDY/206K7eExYCeSyUQ== From e416c1584fd68b1f5765ac06943f49d65dd91307 Mon Sep 17 00:00:00 2001 From: Yuhuai Liu Date: Tue, 24 Mar 2026 11:32:29 -0400 Subject: [PATCH 30/31] add keen-dataviz back (#11652) --- admin/package.json | 1 + admin/yarn.lock | 26 +++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/admin/package.json b/admin/package.json index f6655ee92cf..0b4946f491e 100644 --- a/admin/package.json +++ b/admin/package.json @@ -14,6 +14,7 @@ "font-awesome-webpack": "0.0.5-beta.2", "jquery-datetimepicker": "^2.5.21", "json-loader": "^0.5.1", + "keen-dataviz": "^1.0.2", "keen-js": "^3.0.0", "knockout": "3.5.1", "less": "^4.1.2", diff --git a/admin/yarn.lock b/admin/yarn.lock index b253aa5b5a0..a31977b47a6 100644 --- a/admin/yarn.lock +++ b/admin/yarn.lock @@ -443,6 +443,13 @@ builtin-status-codes@^3.0.0: resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== +c3@^0.4.18: + version "0.4.24" + resolved "https://registry.yarnpkg.com/c3/-/c3-0.4.24.tgz#57b62357098842d38e265a265f6de1e8c6faadd2" + integrity sha512-mVCFtN5ZWUT5UE7ilFQ7KBQ7TUCdKIq6KsDt1hH/1m6gC1tBjvzFTO7fqhaiWHfhNOjjM7makschdhg6DkWQMA== + dependencies: + d3 "~3.5.0" + cacache@^10.0.4: version "10.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" @@ -875,6 +882,11 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.2.tgz#673b5f233bf34d8e602b949429f8171d9121bea3" integrity sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA== +d3@^3.5.17, d3@~3.5.0: + version "3.5.17" + resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" + integrity sha512-yFk/2idb8OHPKkbAL8QaOaqENNoMhIaSHZerk3oQsECwkObkCpJyjYwCe+OHiq6UEdhe1m8ZGARRRO3ljFjlKg== + d@1, d@^1.0.1, d@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de" @@ -977,9 +989,9 @@ duplexify@^3.4.2, duplexify@^3.6.0: stream-shift "^1.0.0" electron-to-chromium@^1.2.7: - version "1.5.321" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz#57a80554e2e7fd65e3689d320f52a64723472d5d" - integrity sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ== + version "1.5.322" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.322.tgz#9c24e49f7098ca19bc87c0e9c7e0ad6ffe4fddca" + integrity sha512-vFU34OcrvMcH66T+dYC3G4nURmgfDVewMIu6Q2urXpumAPSMmzvcn04KVVV8Opikq8Vs5nUbO/8laNhNRqSzYw== elliptic@^6.5.3, elliptic@^6.6.1: version "6.6.1" @@ -1765,6 +1777,14 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +keen-dataviz@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/keen-dataviz/-/keen-dataviz-1.2.1.tgz#6f7595a2051652e1bece2ce2296e47ffa5d79dd9" + integrity sha512-FiWq23fOXfrm+6cCRNpx0FUxtGGzvwb5V9Z0EO1VPaaIrDGMIxvLBjwEAwmLBbeyRRYUHyJFd9XhjSDS9ncpGA== + dependencies: + c3 "^0.4.18" + d3 "^3.5.17" + keen-js@^3.0.0: version "3.5.0" resolved "https://registry.yarnpkg.com/keen-js/-/keen-js-3.5.0.tgz#9274be9bb9ee1a92867872acb3627f5aa8147b79" From eab3950f71df336d7435953a1d05232f238a4d51 Mon Sep 17 00:00:00 2001 From: Yuhuai Liu Date: Thu, 26 Mar 2026 02:32:36 -0400 Subject: [PATCH 31/31] fix tests (#11659) --- scripts/tests/test_populate_new_and_noteworthy.py | 2 +- website/profile/views.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/tests/test_populate_new_and_noteworthy.py b/scripts/tests/test_populate_new_and_noteworthy.py index 227f8d4a24a..dbe183930f4 100644 --- a/scripts/tests/test_populate_new_and_noteworthy.py +++ b/scripts/tests/test_populate_new_and_noteworthy.py @@ -17,7 +17,7 @@ def setUp(self): super().setUp() self.new_and_noteworthy_links_node = ProjectFactory() - self.new_and_noteworthy_links_node._id = TEST_NEW_AND_NOTEWORTHY_GUID + self.new_and_noteworthy_links_node._id = NEW_AND_NOTEWORTHY_LINKS_NODE self.new_and_noteworthy_links_node.save() self.nn1 = ProjectFactory(is_public=True, title='Noteworthy Project Alpha') diff --git a/website/profile/views.py b/website/profile/views.py index fed09aa84da..a08a586742e 100644 --- a/website/profile/views.py +++ b/website/profile/views.py @@ -25,7 +25,6 @@ from framework.status import push_status_message from framework.utils import throttle_period_expired -from osf import features from osf.models import ApiOAuth2Application, ApiOAuth2PersonalToken, OSFUser, NotificationTypeEnum from osf.exceptions import BlockedEmailError, OSFError from osf.utils.requests import string_type_request_headers