getanyapi 0.66.4__tar.gz → 0.67.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. {getanyapi-0.66.4 → getanyapi-0.67.0}/PKG-INFO +1 -1
  2. {getanyapi-0.66.4 → getanyapi-0.67.0}/pyproject.toml +1 -1
  3. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/__init__.py +1 -1
  4. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/linkedin.py +83 -7
  5. {getanyapi-0.66.4 → getanyapi-0.67.0}/.gitignore +0 -0
  6. {getanyapi-0.66.4 → getanyapi-0.67.0}/README.md +0 -0
  7. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/_account.py +0 -0
  8. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/_async_client.py +0 -0
  9. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/_client.py +0 -0
  10. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/_errors.py +0 -0
  11. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/_idempotency.py +0 -0
  12. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/_pagination.py +0 -0
  13. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/_transport.py +0 -0
  14. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/discovery_types.py +0 -0
  15. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/__init__.py +0 -0
  16. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/ahrefs.py +0 -0
  17. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/airbnb.py +0 -0
  18. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/alibaba.py +0 -0
  19. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/amazon.py +0 -0
  20. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/apollo.py +0 -0
  21. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/appstore.py +0 -0
  22. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/bluesky.py +0 -0
  23. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/booking.py +0 -0
  24. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/capterra.py +0 -0
  25. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/chatgpt.py +0 -0
  26. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/coinmarketcap.py +0 -0
  27. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/company.py +0 -0
  28. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/company_enrichment.py +0 -0
  29. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/company_identify.py +0 -0
  30. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/company_search.py +0 -0
  31. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/congress.py +0 -0
  32. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/contact_enrichment.py +0 -0
  33. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/douyin.py +0 -0
  34. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/ebay.py +0 -0
  35. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/email.py +0 -0
  36. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/email_finding.py +0 -0
  37. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/email_verification.py +0 -0
  38. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/facebook.py +0 -0
  39. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/fiverr.py +0 -0
  40. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/g2.py +0 -0
  41. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/gemini.py +0 -0
  42. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/github.py +0 -0
  43. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/glassdoor.py +0 -0
  44. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/google.py +0 -0
  45. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/google_ads.py +0 -0
  46. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/google_finance.py +0 -0
  47. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/google_shopping.py +0 -0
  48. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/hackernews.py +0 -0
  49. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/indeed.py +0 -0
  50. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/instagram.py +0 -0
  51. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/job_search.py +0 -0
  52. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/maps.py +0 -0
  53. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/mobile_phone.py +0 -0
  54. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/naver.py +0 -0
  55. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/nextdoor.py +0 -0
  56. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/people_search.py +0 -0
  57. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/perplexity.py +0 -0
  58. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/person.py +0 -0
  59. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/person_enrichment.py +0 -0
  60. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/pinterest.py +0 -0
  61. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/playstore.py +0 -0
  62. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/polymarket.py +0 -0
  63. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/property_records.py +0 -0
  64. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/realtor.py +0 -0
  65. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/reddit.py +0 -0
  66. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/redfin.py +0 -0
  67. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/rednote.py +0 -0
  68. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/sec.py +0 -0
  69. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/semrush.py +0 -0
  70. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/seo.py +0 -0
  71. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/similarweb.py +0 -0
  72. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/snapchat.py +0 -0
  73. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/social.py +0 -0
  74. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/spotify.py +0 -0
  75. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/substack.py +0 -0
  76. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/technographics.py +0 -0
  77. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/threads.py +0 -0
  78. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/tiktok.py +0 -0
  79. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/tiktok_shop.py +0 -0
  80. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/tripadvisor.py +0 -0
  81. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/trustpilot.py +0 -0
  82. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/truthsocial.py +0 -0
  83. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/twitter.py +0 -0
  84. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/upwork.py +0 -0
  85. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/walmart.py +0 -0
  86. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/web.py +0 -0
  87. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/weibo.py +0 -0
  88. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/yahoo_finance.py +0 -0
  89. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/yelp.py +0 -0
  90. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/youtube.py +0 -0
  91. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/zhihu.py +0 -0
  92. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/platforms/zillow.py +0 -0
  93. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/py.typed +0 -0
  94. {getanyapi-0.66.4 → getanyapi-0.67.0}/src/getanyapi/types.py +0 -0
  95. {getanyapi-0.66.4 → getanyapi-0.67.0}/tests/conftest.py +0 -0
  96. {getanyapi-0.66.4 → getanyapi-0.67.0}/tests/test_account.py +0 -0
  97. {getanyapi-0.66.4 → getanyapi-0.67.0}/tests/test_client.py +0 -0
  98. {getanyapi-0.66.4 → getanyapi-0.67.0}/tests/test_durable_requests.py +0 -0
  99. {getanyapi-0.66.4 → getanyapi-0.67.0}/tests/test_envelope.py +0 -0
  100. {getanyapi-0.66.4 → getanyapi-0.67.0}/tests/test_errors.py +0 -0
  101. {getanyapi-0.66.4 → getanyapi-0.67.0}/tests/test_fixture_roundtrip.py +0 -0
  102. {getanyapi-0.66.4 → getanyapi-0.67.0}/tests/test_fixture_sweep.py +0 -0
  103. {getanyapi-0.66.4 → getanyapi-0.67.0}/tests/test_not_found_reason.py +0 -0
  104. {getanyapi-0.66.4 → getanyapi-0.67.0}/tests/test_pagination.py +0 -0
  105. {getanyapi-0.66.4 → getanyapi-0.67.0}/tests/test_transport.py +0 -0
  106. {getanyapi-0.66.4 → getanyapi-0.67.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: getanyapi
3
- Version: 0.66.4
3
+ Version: 0.67.0
4
4
  Summary: Official typed Python SDK for AnyAPI: any API, one wallet, USD, no subscriptions.
5
5
  Project-URL: Homepage, https://getanyapi.com
6
6
  Project-URL: Documentation, https://getanyapi.com/docs
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "getanyapi"
7
- version = "0.66.4"
7
+ version = "0.67.0"
8
8
  description = "Official typed Python SDK for AnyAPI: any API, one wallet, USD, no subscriptions."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -55,7 +55,7 @@ from .types import (
55
55
  unwrap,
56
56
  )
57
57
 
58
- __version__ = "0.66.4"
58
+ __version__ = "0.67.0"
59
59
 
60
60
  __all__ = [
61
61
  # clients + top-level functions
@@ -405,6 +405,10 @@ class LinkedinPostReactionsInput(TypedDict, total=False):
405
405
  """Maximum number of reactions to return (1-100, default 100). Range: 1 to 100."""
406
406
  preferLatencyUnderMs: NotRequired[int]
407
407
  """Optional; omit it and routing is unchanged, with the cheapest source serving. Prefer sources whose typical response time (median over the trailing 30 days, as published on this endpoint's lane health) is under this many milliseconds; among those, the cheapest serves. This can raise your price: when the cheapest source misses the target, a faster and dearer one serves, and you are quoted and charged its price. If no source is that fast the request is still served, by whichever source offers the best speed for its price - it is never refused for being slow. Sources we have not timed are tried last. This is a preference, not a guarantee: the median describes past requests and is not a ceiling on this one, and it excludes any wait this request itself asks for. On a paginated walk it applies to the first page only: later pages stay with the source that page chose, at the price it was quoted. Minimum: 1."""
408
+ requireFields: NotRequired[
409
+ list[Literal["actor", "items", "postId", "reactionType"]]
410
+ ]
411
+ """Optional; omit it and routing is unchanged, with the cheapest source serving. Name the output fields this request must be able to return, for example `postId`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. Naming a combination that no single source returns together is refused as invalid input, with no charge."""
408
412
  source: NotRequired[list[str]]
409
413
  """Optional. Source ids to prefer, in order, taken from this endpoint's `lanes[].source.id` in /catalog or /apis. Omit it and the cheapest source serves, with automatic failover. Listed sources are tried first in the order given, then the others, unless `allowFallbacks` is false. A single source with `allowFallbacks` false is served only by that source at its price, quoted and charged exactly, with no failover. The price is that of the dearest source that may serve. An id that does not serve this endpoint is rejected as invalid input with no charge; a listed source that is not serving right now is refused with no charge, so omit `source` to be served by another. On a paginated walk, later pages must include the source that served page one, or omit `source`."""
410
414
  url: Required[str]
@@ -435,6 +439,64 @@ class LinkedinProfileInput(TypedDict, total=False):
435
439
  """Optional. Source ids to skip for this request, taken from this endpoint's `lanes[].source.id`. The cheapest remaining source serves and the price is that of the dearest remaining source. An id that does not serve this endpoint, or that is also in `source`, is rejected as invalid input with no charge; skipping every source is rejected the same way."""
436
440
  preferLatencyUnderMs: NotRequired[int]
437
441
  """Optional; omit it and routing is unchanged, with the cheapest source serving. Prefer sources whose typical response time (median over the trailing 30 days, as published on this endpoint's lane health) is under this many milliseconds; among those, the cheapest serves. This can raise your price: when the cheapest source misses the target, a faster and dearer one serves, and you are quoted and charged its price. If no source is that fast the request is still served, by whichever source offers the best speed for its price - it is never refused for being slow. Sources we have not timed are tried last. This is a preference, not a guarantee: the median describes past requests and is not a ceiling on this one, and it excludes any wait this request itself asks for. On a paginated walk it applies to the first page only: later pages stay with the source that page chose, at the price it was quoted. Minimum: 1."""
442
+ requireFields: NotRequired[
443
+ list[
444
+ Literal[
445
+ "about",
446
+ "certifications",
447
+ "city",
448
+ "companyId",
449
+ "companyLinkedinUrl",
450
+ "companyName",
451
+ "connectionsCount",
452
+ "country",
453
+ "countryCode",
454
+ "coverImage",
455
+ "creator",
456
+ "currentPosition",
457
+ "degree",
458
+ "description",
459
+ "duration",
460
+ "education",
461
+ "employmentType",
462
+ "endDate",
463
+ "endorsements",
464
+ "fieldOfStudy",
465
+ "firstName",
466
+ "followerCount",
467
+ "hiring",
468
+ "honorsAndAwards",
469
+ "id",
470
+ "influencer",
471
+ "issuedAt",
472
+ "issuedBy",
473
+ "languages",
474
+ "lastName",
475
+ "location",
476
+ "name",
477
+ "openToWork",
478
+ "photo",
479
+ "positions",
480
+ "premium",
481
+ "projects",
482
+ "publicIdentifier",
483
+ "publications",
484
+ "publishedText",
485
+ "school",
486
+ "schoolId",
487
+ "schoolUrl",
488
+ "skills",
489
+ "startDate",
490
+ "state",
491
+ "title",
492
+ "topSkills",
493
+ "url",
494
+ "verified",
495
+ "workplaceType",
496
+ ]
497
+ ]
498
+ ]
499
+ """Optional; omit it and routing is unchanged, with the cheapest source serving. Name the output fields this request must be able to return, for example `city` or `workplaceType`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be absent on a profile that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge."""
438
500
  source: NotRequired[list[str]]
439
501
  """Optional. Source ids to prefer, in order, taken from this endpoint's `lanes[].source.id` in /catalog or /apis. Omit it and the cheapest source serves, with automatic failover. Listed sources are tried first in the order given, then the others, unless `allowFallbacks` is false. A single source with `allowFallbacks` false is served only by that source at its price, quoted and charged exactly, with no failover. The price is that of the dearest source that may serve. An id that does not serve this endpoint is rejected as invalid input with no charge; a listed source that is not serving right now is refused with no charge, so omit `source` to be served by another. On a paginated walk, later pages must include the source that served page one, or omit `source`."""
440
502
  url: Required[str]
@@ -2231,7 +2293,7 @@ class LinkedinPostReactionsItem(BaseModel):
2231
2293
  post_id: str | None = Field(
2232
2294
  default=None,
2233
2295
  alias="postId",
2234
- description="LinkedIn URN of the post that was reacted to. Populated whenever the provider has data for the entity. Present whenever the upstream returns this record.",
2296
+ description="LinkedIn URN of the post that was reacted to.",
2235
2297
  )
2236
2298
  reaction_type: str = Field(
2237
2299
  alias="reactionType",
@@ -2364,9 +2426,9 @@ class LinkedinProfileData(BaseModel):
2364
2426
  publications: list[LinkedinProfilePublication] | None = Field(
2365
2427
  default=None, description="Publications."
2366
2428
  )
2367
- skills: list[Any] | None = Field(
2429
+ skills: list[LinkedinProfileSkill] | None = Field(
2368
2430
  default=None,
2369
- description="The member's skills, as free-form strings when present.",
2431
+ description="The member's skills: an object per skill, or a bare skill name when LinkedIn shows no endorsed-skills section.",
2370
2432
  )
2371
2433
  state: str | None = Field(
2372
2434
  default=None, description="State or region of the profile owner."
@@ -2509,6 +2571,20 @@ class LinkedinProfilePublication(BaseModel):
2509
2571
  title: str | None = Field(default=None, description="Publication title.")
2510
2572
 
2511
2573
 
2574
+ class LinkedinProfileSkill(BaseModel):
2575
+ model_config = ConfigDict(extra="allow")
2576
+
2577
+ endorsements: str | None = Field(
2578
+ default=None,
2579
+ description="Endorsement count as LinkedIn shows it, e.g. '23 endorsements'. Null from a source that does not read endorsements; name it in requireFields to be served by one that does.",
2580
+ )
2581
+ name: str | None = Field(default=None, description="Skill name.")
2582
+ positions: list[str] | None = Field(
2583
+ default=None,
2584
+ description="Where the skill was used or who endorsed it, as LinkedIn shows it, e.g. 'Endorsed by 3 colleagues at Rippling'. Null from a source that does not read them; name it in requireFields to be served by one that does.",
2585
+ )
2586
+
2587
+
2512
2588
  class LinkedinProfileCommentsData(BaseModel):
2513
2589
  items: list[LinkedinProfileCommentsItem] = Field(
2514
2590
  description="Comments this member left on other people's posts, newest first, each with the post it was left on. Populated whenever the provider has data for the entity."
@@ -4392,7 +4468,7 @@ class LinkedinNamespace:
4392
4468
  List who reacted to a LinkedIn post - reactor name, profile URL, job title,
4393
4469
  and reaction type. Lead-gen grade.
4394
4470
 
4395
- Price: $0.005 per request.
4471
+ Price: $0.0029 per request.
4396
4472
 
4397
4473
  Example:
4398
4474
  res = client.linkedin.post_reactions(limit=5, url="https://www.linkedin.com/posts/satyanadella_today-were-bringing-skills-to-copilot-for-activity-7475945433668694017--kvG")
@@ -4437,7 +4513,7 @@ class LinkedinNamespace:
4437
4513
  awards, languages, projects, publications, and verified/premium/open-to-work
4438
4514
  flags.
4439
4515
 
4440
- Price: $0.004 per request.
4516
+ Price: $0.0029 per request.
4441
4517
 
4442
4518
  Example:
4443
4519
  res = client.linkedin.profile(url="https://www.linkedin.com/in/patrickcollison")
@@ -5086,7 +5162,7 @@ class AsyncLinkedinNamespace:
5086
5162
  List who reacted to a LinkedIn post - reactor name, profile URL, job title,
5087
5163
  and reaction type. Lead-gen grade.
5088
5164
 
5089
- Price: $0.005 per request.
5165
+ Price: $0.0029 per request.
5090
5166
 
5091
5167
  Example:
5092
5168
  res = client.linkedin.post_reactions(limit=5, url="https://www.linkedin.com/posts/satyanadella_today-were-bringing-skills-to-copilot-for-activity-7475945433668694017--kvG")
@@ -5131,7 +5207,7 @@ class AsyncLinkedinNamespace:
5131
5207
  awards, languages, projects, publications, and verified/premium/open-to-work
5132
5208
  flags.
5133
5209
 
5134
- Price: $0.004 per request.
5210
+ Price: $0.0029 per request.
5135
5211
 
5136
5212
  Example:
5137
5213
  res = client.linkedin.profile(url="https://www.linkedin.com/in/patrickcollison")
File without changes
File without changes
File without changes
File without changes