The purpose of Project Litter Bug is to raise awareness for the impact data has on the environment. By creating a script to randomly generate useless content, and calculating the resources spent storing and maintaining this data, the project hopes to conceptualize the abstraction that is online energy consumption in the hope of making the Internet a greener, more thoughtful place.
According to Domo's fifth annual "Data Never Sleeps" Infographic, 2.5 million terabytes of data are created each day. By 2020, it's estimated that this rate will have reached over 60 billion terabytes a day. The amount of data is growing so quickly that every two years more data is created than has existed in all of human history. The vast majority of this information is recorded in traditional data centers. In the U.S., these centers use more than 90 billion kWh of electricty a year which, using the EPA's greenhouse gas calculator, results in 63 million metric tons of carbon dioxide. That's the same amount of emissions generated by 13 million passenger vehicles driven for one year.
However, when we use the Internet we don't often think of it as something with a carbon footprint, yet every byte of information we access requires energy. One pertinent example is the way we think about streaming. From podcasts to video conferencing, the use of streaming has exploded over the last few decades. It has changed the way we work and entertain. Of the many streaming services that exist, Netflix is the largest. According to the Global Internet Phenomena Report from Sandvine, it consumes 15% of the world's Internet bandwidth, streaming 97,222 hours of video every minute. In order to combat such high demands, Netflix has taken steps to optimize its streaming algorithms and cut back on data usage by adding features such as the “Are you still watching?” prompt, which requires users to manually respond in order for streaming to continue. The very fact that adding this prompt had a direct impact on their bandwidth numbers means that there existed video being streamed wastefully, to an absent, unengaged audience—a careless and inefficient prospect that, although we may not think of it as such, seems like an abstruse form of littering.
Another example is the way we think about uploading media. Take YouTube for instances. It, like Netflix, is a massive streaming service. It allows anyone to watch and anyone with an account to upload videos, removing the barrier of entry for creators and popularizing a new way of distributing content. The results are wide-spread availability of informative and entertaining videos like never before in recorded history. However, a study from Bernstein Research found that only 1% of videos account for 93% of the views. This means that of the estimated 2 billion videos on YouTube, 1.99 billion of them are saddled with 7% of the viewership. This, coupled with the fact that 300 hours of content are uploaded to the site every minute, means that it is impossible for every video to be watched. There exist what amounts to digital junkyards in the YouTube database, whole swaths of forgotten content, unused, untouched—waste.
The point being that whether we are consumers or producers we have a responsibility for the data we access because there is a cost attached. Not just in the form of our own electricity bills but in the resource we consume in order for the Internet to run. Even if it this consumption is wildly abstracted from us. This is not to say that we should never upload a selfie or indulge in the occasional binge watch, but rather to be mindful of how the Internet works, that although it is a truly magnificent invention, it should not be used frivolously.
There is a part towards the end of Jonathan Franzen's novel Freedom about how outdoor cats will catch the occasional bird and that the owners of these cats don't think much of it since it's only on occasion and the birds are common in the area, so it seems innocuous and like there's no real effect. However, in aggregate, when we consider all the outdoor cats that kill the occasional bird each year, we see that outdoor cats are a contributing factor to why 40% of the nearly 10,000 bird species are in decline. So although it seldom feels this way, our individual decisions do have an impact on the world around us. We shouldn't wait for large corporations like YouTube and Netflix to develop optimization algorithms. The onus is not just on them. We have a responsibility, as consumers, creators and engineers, to use data wisely and effectively, so that tomorrow will be less wasteful than today.


Class AliasControllerApi
Represents a collection of functions to interact with the API endpoints
Inherited Members
Namespace: mailslurp.Api
Assembly: mailslurp.dll
Syntax
public class AliasControllerApi : IAliasControllerApi, IAliasControllerApiSync, IAliasControllerApiAsync, IApiAccessor
Constructors
View SourceAliasControllerApi()
Initializes a new instance of the AliasControllerApi class.
Declaration
public AliasControllerApi()
AliasControllerApi(Configuration)
Initializes a new instance of the AliasControllerApi class using Configuration object
Declaration
public AliasControllerApi(Configuration configuration)
Parameters
| Type | Name | Description |
|---|---|---|
| Configuration | configuration | An instance of Configuration |
AliasControllerApi(ISynchronousClient, IAsynchronousClient, IReadableConfiguration)
Initializes a new instance of the AliasControllerApi class using a Configuration object and client instance.
Declaration
public AliasControllerApi(ISynchronousClient client, IAsynchronousClient asyncClient, IReadableConfiguration configuration)
Parameters
| Type | Name | Description |
|---|---|---|
| ISynchronousClient | client | The client interface for synchronous API access. |
| IAsynchronousClient | asyncClient | The client interface for asynchronous API access. |
| IReadableConfiguration | configuration | The configuration object. |
AliasControllerApi(string)
Initializes a new instance of the AliasControllerApi class.
Declaration
public AliasControllerApi(string basePath)
Parameters
| Type | Name | Description |
|---|---|---|
| string | basePath |
Properties
View SourceAsynchronousClient
The client for accessing this underlying API asynchronously.
Declaration
public IAsynchronousClient AsynchronousClient { get; set; }
Property Value
| Type | Description |
|---|---|
| IAsynchronousClient |
Client
The client for accessing this underlying API synchronously.
Declaration
public ISynchronousClient Client { get; set; }
Property Value
| Type | Description |
|---|---|
| ISynchronousClient |
Configuration
Gets or sets the configuration object
Declaration
public IReadableConfiguration Configuration { get; set; }
Property Value
| Type | Description |
|---|---|
| IReadableConfiguration | An instance of the Configuration |
ExceptionFactory
Provides a factory method hook for the creation of exceptions.
Declaration
public ExceptionFactory ExceptionFactory { get; set; }
Property Value
| Type | Description |
|---|---|
| ExceptionFactory |
Methods
View SourceCreateAlias(CreateAliasOptions, int)
Create an email alias. Must be verified by clicking link inside verification email that will be sent to the address. Once verified the alias will be active. Email aliases use a MailSlurp randomly generated email address (or a custom domain inbox that you provide) to mask or proxy a real email address. Emails sent to the alias address will be forwarded to the hidden email address it was created for. If you want to send a reply use the threadId attached
Declaration
public AliasDto CreateAlias(CreateAliasOptions createAliasOptions, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| CreateAliasOptions | createAliasOptions | |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| AliasDto | AliasDto |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
CreateAliasAsync(CreateAliasOptions, int, CancellationToken)
Create an email alias. Must be verified by clicking link inside verification email that will be sent to the address. Once verified the alias will be active. Email aliases use a MailSlurp randomly generated email address (or a custom domain inbox that you provide) to mask or proxy a real email address. Emails sent to the alias address will be forwarded to the hidden email address it was created for. If you want to send a reply use the threadId attached
Declaration
public Task<AliasDto> CreateAliasAsync(CreateAliasOptions createAliasOptions, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| CreateAliasOptions | createAliasOptions | |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<AliasDto> | Task of AliasDto |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
CreateAliasWithHttpInfo(CreateAliasOptions, int)
Create an email alias. Must be verified by clicking link inside verification email that will be sent to the address. Once verified the alias will be active. Email aliases use a MailSlurp randomly generated email address (or a custom domain inbox that you provide) to mask or proxy a real email address. Emails sent to the alias address will be forwarded to the hidden email address it was created for. If you want to send a reply use the threadId attached
Declaration
public ApiResponse<AliasDto> CreateAliasWithHttpInfo(CreateAliasOptions createAliasOptions, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| CreateAliasOptions | createAliasOptions | |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| ApiResponse<AliasDto> | ApiResponse of AliasDto |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
CreateAliasWithHttpInfoAsync(CreateAliasOptions, int, CancellationToken)
Create an email alias. Must be verified by clicking link inside verification email that will be sent to the address. Once verified the alias will be active. Email aliases use a MailSlurp randomly generated email address (or a custom domain inbox that you provide) to mask or proxy a real email address. Emails sent to the alias address will be forwarded to the hidden email address it was created for. If you want to send a reply use the threadId attached
Declaration
public Task<ApiResponse<AliasDto>> CreateAliasWithHttpInfoAsync(CreateAliasOptions createAliasOptions, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| CreateAliasOptions | createAliasOptions | |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<ApiResponse<AliasDto>> | Task of ApiResponse (AliasDto) |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
DeleteAlias(Guid, int)
Delete an email alias
Declaration
public void DeleteAlias(Guid aliasId, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| int | operationIndex | Index associated with the operation. |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
DeleteAliasAsync(Guid, int, CancellationToken)
Delete an email alias
Declaration
public Task DeleteAliasAsync(Guid aliasId, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task | Task of void |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
DeleteAliasWithHttpInfo(Guid, int)
Delete an email alias
Declaration
public ApiResponse<object> DeleteAliasWithHttpInfo(Guid aliasId, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| ApiResponse<object> | ApiResponse of Object(void) |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
DeleteAliasWithHttpInfoAsync(Guid, int, CancellationToken)
Delete an email alias
Declaration
public Task<ApiResponse<object>> DeleteAliasWithHttpInfoAsync(Guid aliasId, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<ApiResponse<object>> | Task of ApiResponse |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetAlias(Guid, int)
Get an email alias Get an email alias by ID
Declaration
public AliasDto GetAlias(Guid aliasId, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| AliasDto | AliasDto |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetAliasAsync(Guid, int, CancellationToken)
Get an email alias Get an email alias by ID
Declaration
public Task<AliasDto> GetAliasAsync(Guid aliasId, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<AliasDto> | Task of AliasDto |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetAliasEmails(Guid, int?, int?, string, DateTime?, DateTime?, int)
Get emails for an alias Get paginated emails for an alias by ID
Declaration
public PageEmailProjection GetAliasEmails(Guid aliasId, int? page = null, int? size = null, string sort = null, DateTime? since = null, DateTime? before = null, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| int? | page | Optional page index alias email list pagination (optional, default to 0) |
| int? | size | Optional page size alias email list pagination (optional, default to 20) |
| string | sort | Optional createdAt sort direction ASC or DESC (optional, default to ASC) |
| DateTime? | since | Optional filter by sent after given date time (optional) |
| DateTime? | before | Optional filter by sent before given date time (optional) |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| PageEmailProjection | PageEmailProjection |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetAliasEmailsAsync(Guid, int?, int?, string, DateTime?, DateTime?, int, CancellationToken)
Get emails for an alias Get paginated emails for an alias by ID
Declaration
public Task<PageEmailProjection> GetAliasEmailsAsync(Guid aliasId, int? page = null, int? size = null, string sort = null, DateTime? since = null, DateTime? before = null, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| int? | page | Optional page index alias email list pagination (optional, default to 0) |
| int? | size | Optional page size alias email list pagination (optional, default to 20) |
| string | sort | Optional createdAt sort direction ASC or DESC (optional, default to ASC) |
| DateTime? | since | Optional filter by sent after given date time (optional) |
| DateTime? | before | Optional filter by sent before given date time (optional) |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<PageEmailProjection> | Task of PageEmailProjection |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetAliasEmailsWithHttpInfo(Guid, int?, int?, string, DateTime?, DateTime?, int)
Get emails for an alias Get paginated emails for an alias by ID
Declaration
public ApiResponse<PageEmailProjection> GetAliasEmailsWithHttpInfo(Guid aliasId, int? page = null, int? size = null, string sort = null, DateTime? since = null, DateTime? before = null, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| int? | page | Optional page index alias email list pagination (optional, default to 0) |
| int? | size | Optional page size alias email list pagination (optional, default to 20) |
| string | sort | Optional createdAt sort direction ASC or DESC (optional, default to ASC) |
| DateTime? | since | Optional filter by sent after given date time (optional) |
| DateTime? | before | Optional filter by sent before given date time (optional) |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| ApiResponse<PageEmailProjection> | ApiResponse of PageEmailProjection |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetAliasEmailsWithHttpInfoAsync(Guid, int?, int?, string, DateTime?, DateTime?, int, CancellationToken)
Get emails for an alias Get paginated emails for an alias by ID
Declaration
public Task<ApiResponse<PageEmailProjection>> GetAliasEmailsWithHttpInfoAsync(Guid aliasId, int? page = null, int? size = null, string sort = null, DateTime? since = null, DateTime? before = null, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| int? | page | Optional page index alias email list pagination (optional, default to 0) |
| int? | size | Optional page size alias email list pagination (optional, default to 20) |
| string | sort | Optional createdAt sort direction ASC or DESC (optional, default to ASC) |
| DateTime? | since | Optional filter by sent after given date time (optional) |
| DateTime? | before | Optional filter by sent before given date time (optional) |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<ApiResponse<PageEmailProjection>> | Task of ApiResponse (PageEmailProjection) |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetAliases(int?, int?, string, DateTime?, DateTime?, int)
Get all email aliases you have created Get all email aliases in paginated form
Declaration
public PageAlias GetAliases(int? page = null, int? size = null, string sort = null, DateTime? since = null, DateTime? before = null, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| int? | page | Optional page index in alias list pagination (optional, default to 0) |
| int? | size | Optional page size in alias list pagination (optional, default to 20) |
| string | sort | Optional createdAt sort direction ASC or DESC (optional, default to ASC) |
| DateTime? | since | Filter by created at after the given timestamp (optional) |
| DateTime? | before | Filter by created at before the given timestamp (optional) |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| PageAlias | PageAlias |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetAliasesAsync(int?, int?, string, DateTime?, DateTime?, int, CancellationToken)
Get all email aliases you have created Get all email aliases in paginated form
Declaration
public Task<PageAlias> GetAliasesAsync(int? page = null, int? size = null, string sort = null, DateTime? since = null, DateTime? before = null, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| int? | page | Optional page index in alias list pagination (optional, default to 0) |
| int? | size | Optional page size in alias list pagination (optional, default to 20) |
| string | sort | Optional createdAt sort direction ASC or DESC (optional, default to ASC) |
| DateTime? | since | Filter by created at after the given timestamp (optional) |
| DateTime? | before | Filter by created at before the given timestamp (optional) |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<PageAlias> | Task of PageAlias |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetAliasesWithHttpInfo(int?, int?, string, DateTime?, DateTime?, int)
Get all email aliases you have created Get all email aliases in paginated form
Declaration
public ApiResponse<PageAlias> GetAliasesWithHttpInfo(int? page = null, int? size = null, string sort = null, DateTime? since = null, DateTime? before = null, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| int? | page | Optional page index in alias list pagination (optional, default to 0) |
| int? | size | Optional page size in alias list pagination (optional, default to 20) |
| string | sort | Optional createdAt sort direction ASC or DESC (optional, default to ASC) |
| DateTime? | since | Filter by created at after the given timestamp (optional) |
| DateTime? | before | Filter by created at before the given timestamp (optional) |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| ApiResponse<PageAlias> | ApiResponse of PageAlias |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetAliasesWithHttpInfoAsync(int?, int?, string, DateTime?, DateTime?, int, CancellationToken)
Get all email aliases you have created Get all email aliases in paginated form
Declaration
public Task<ApiResponse<PageAlias>> GetAliasesWithHttpInfoAsync(int? page = null, int? size = null, string sort = null, DateTime? since = null, DateTime? before = null, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| int? | page | Optional page index in alias list pagination (optional, default to 0) |
| int? | size | Optional page size in alias list pagination (optional, default to 20) |
| string | sort | Optional createdAt sort direction ASC or DESC (optional, default to ASC) |
| DateTime? | since | Filter by created at after the given timestamp (optional) |
| DateTime? | before | Filter by created at before the given timestamp (optional) |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<ApiResponse<PageAlias>> | Task of ApiResponse (PageAlias) |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetAliasThreads(Guid, int?, int?, string, DateTime?, DateTime?, int)
Get threads created for an alias Returns threads created for an email alias in paginated form
Declaration
public PageThreadProjection GetAliasThreads(Guid aliasId, int? page = null, int? size = null, string sort = null, DateTime? since = null, DateTime? before = null, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| int? | page | Optional page index in thread list pagination (optional, default to 0) |
| int? | size | Optional page size in thread list pagination (optional, default to 20) |
| string | sort | Optional createdAt sort direction ASC or DESC (optional, default to ASC) |
| DateTime? | since | Optional filter by sent after given date time (optional) |
| DateTime? | before | Optional filter by sent before given date time (optional) |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| PageThreadProjection | PageThreadProjection |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetAliasThreadsAsync(Guid, int?, int?, string, DateTime?, DateTime?, int, CancellationToken)
Get threads created for an alias Returns threads created for an email alias in paginated form
Declaration
public Task<PageThreadProjection> GetAliasThreadsAsync(Guid aliasId, int? page = null, int? size = null, string sort = null, DateTime? since = null, DateTime? before = null, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| int? | page | Optional page index in thread list pagination (optional, default to 0) |
| int? | size | Optional page size in thread list pagination (optional, default to 20) |
| string | sort | Optional createdAt sort direction ASC or DESC (optional, default to ASC) |
| DateTime? | since | Optional filter by sent after given date time (optional) |
| DateTime? | before | Optional filter by sent before given date time (optional) |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<PageThreadProjection> | Task of PageThreadProjection |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetAliasThreadsWithHttpInfo(Guid, int?, int?, string, DateTime?, DateTime?, int)
Get threads created for an alias Returns threads created for an email alias in paginated form
Declaration
public ApiResponse<PageThreadProjection> GetAliasThreadsWithHttpInfo(Guid aliasId, int? page = null, int? size = null, string sort = null, DateTime? since = null, DateTime? before = null, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| int? | page | Optional page index in thread list pagination (optional, default to 0) |
| int? | size | Optional page size in thread list pagination (optional, default to 20) |
| string | sort | Optional createdAt sort direction ASC or DESC (optional, default to ASC) |
| DateTime? | since | Optional filter by sent after given date time (optional) |
| DateTime? | before | Optional filter by sent before given date time (optional) |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| ApiResponse<PageThreadProjection> | ApiResponse of PageThreadProjection |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetAliasThreadsWithHttpInfoAsync(Guid, int?, int?, string, DateTime?, DateTime?, int, CancellationToken)
Get threads created for an alias Returns threads created for an email alias in paginated form
Declaration
public Task<ApiResponse<PageThreadProjection>> GetAliasThreadsWithHttpInfoAsync(Guid aliasId, int? page = null, int? size = null, string sort = null, DateTime? since = null, DateTime? before = null, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| int? | page | Optional page index in thread list pagination (optional, default to 0) |
| int? | size | Optional page size in thread list pagination (optional, default to 20) |
| string | sort | Optional createdAt sort direction ASC or DESC (optional, default to ASC) |
| DateTime? | since | Optional filter by sent after given date time (optional) |
| DateTime? | before | Optional filter by sent before given date time (optional) |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<ApiResponse<PageThreadProjection>> | Task of ApiResponse (PageThreadProjection) |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetAliasWithHttpInfo(Guid, int)
Get an email alias Get an email alias by ID
Declaration
public ApiResponse<AliasDto> GetAliasWithHttpInfo(Guid aliasId, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| ApiResponse<AliasDto> | ApiResponse of AliasDto |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetAliasWithHttpInfoAsync(Guid, int, CancellationToken)
Get an email alias Get an email alias by ID
Declaration
public Task<ApiResponse<AliasDto>> GetAliasWithHttpInfoAsync(Guid aliasId, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<ApiResponse<AliasDto>> | Task of ApiResponse (AliasDto) |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
GetBasePath()
Gets the base path of the API client.
Declaration
public string GetBasePath()
Returns
| Type | Description |
|---|---|
| string | The base path |
ReplyToAliasEmail(Guid, Guid, ReplyToAliasEmailOptions, int)
Reply to an email Send the reply to the email sender or reply-to and include same subject cc bcc etc. Reply to an email and the contents will be sent with the existing subject to the emails to
, cc
, and bcc
.
Declaration
public SentEmailDto ReplyToAliasEmail(Guid aliasId, Guid emailId, ReplyToAliasEmailOptions replyToAliasEmailOptions, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | ID of the alias that email belongs to |
| Guid | emailId | ID of the email that should be replied to |
| ReplyToAliasEmailOptions | replyToAliasEmailOptions | |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| SentEmailDto | SentEmailDto |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
ReplyToAliasEmailAsync(Guid, Guid, ReplyToAliasEmailOptions, int, CancellationToken)
Reply to an email Send the reply to the email sender or reply-to and include same subject cc bcc etc. Reply to an email and the contents will be sent with the existing subject to the emails to
, cc
, and bcc
.
Declaration
public Task<SentEmailDto> ReplyToAliasEmailAsync(Guid aliasId, Guid emailId, ReplyToAliasEmailOptions replyToAliasEmailOptions, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | ID of the alias that email belongs to |
| Guid | emailId | ID of the email that should be replied to |
| ReplyToAliasEmailOptions | replyToAliasEmailOptions | |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<SentEmailDto> | Task of SentEmailDto |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
ReplyToAliasEmailWithHttpInfo(Guid, Guid, ReplyToAliasEmailOptions, int)
Reply to an email Send the reply to the email sender or reply-to and include same subject cc bcc etc. Reply to an email and the contents will be sent with the existing subject to the emails to
, cc
, and bcc
.
Declaration
public ApiResponse<SentEmailDto> ReplyToAliasEmailWithHttpInfo(Guid aliasId, Guid emailId, ReplyToAliasEmailOptions replyToAliasEmailOptions, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | ID of the alias that email belongs to |
| Guid | emailId | ID of the email that should be replied to |
| ReplyToAliasEmailOptions | replyToAliasEmailOptions | |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| ApiResponse<SentEmailDto> | ApiResponse of SentEmailDto |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
ReplyToAliasEmailWithHttpInfoAsync(Guid, Guid, ReplyToAliasEmailOptions, int, CancellationToken)
Reply to an email Send the reply to the email sender or reply-to and include same subject cc bcc etc. Reply to an email and the contents will be sent with the existing subject to the emails to
, cc
, and bcc
.
Declaration
public Task<ApiResponse<SentEmailDto>> ReplyToAliasEmailWithHttpInfoAsync(Guid aliasId, Guid emailId, ReplyToAliasEmailOptions replyToAliasEmailOptions, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | ID of the alias that email belongs to |
| Guid | emailId | ID of the email that should be replied to |
| ReplyToAliasEmailOptions | replyToAliasEmailOptions | |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<ApiResponse<SentEmailDto>> | Task of ApiResponse (SentEmailDto) |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
SendAliasEmail(Guid, SendEmailOptions, int)
Send an email from an alias inbox Send an email from an alias. Replies to the email will be forwarded to the alias masked email address
Declaration
public SentEmailDto SendAliasEmail(Guid aliasId, SendEmailOptions sendEmailOptions, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| SendEmailOptions | sendEmailOptions | |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| SentEmailDto | SentEmailDto |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
SendAliasEmailAsync(Guid, SendEmailOptions, int, CancellationToken)
Send an email from an alias inbox Send an email from an alias. Replies to the email will be forwarded to the alias masked email address
Declaration
public Task<SentEmailDto> SendAliasEmailAsync(Guid aliasId, SendEmailOptions sendEmailOptions, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| SendEmailOptions | sendEmailOptions | |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<SentEmailDto> | Task of SentEmailDto |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
SendAliasEmailWithHttpInfo(Guid, SendEmailOptions, int)
Send an email from an alias inbox Send an email from an alias. Replies to the email will be forwarded to the alias masked email address
Declaration
public ApiResponse<SentEmailDto> SendAliasEmailWithHttpInfo(Guid aliasId, SendEmailOptions sendEmailOptions, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| SendEmailOptions | sendEmailOptions | |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| ApiResponse<SentEmailDto> | ApiResponse of SentEmailDto |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
SendAliasEmailWithHttpInfoAsync(Guid, SendEmailOptions, int, CancellationToken)
Send an email from an alias inbox Send an email from an alias. Replies to the email will be forwarded to the alias masked email address
Declaration
public Task<ApiResponse<SentEmailDto>> SendAliasEmailWithHttpInfoAsync(Guid aliasId, SendEmailOptions sendEmailOptions, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| SendEmailOptions | sendEmailOptions | |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<ApiResponse<SentEmailDto>> | Task of ApiResponse (SentEmailDto) |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
UpdateAlias(Guid, UpdateAliasOptions, int)
Update an email alias
Declaration
public AliasDto UpdateAlias(Guid aliasId, UpdateAliasOptions updateAliasOptions, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| UpdateAliasOptions | updateAliasOptions | |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| AliasDto | AliasDto |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
UpdateAliasAsync(Guid, UpdateAliasOptions, int, CancellationToken)
Update an email alias
Declaration
public Task<AliasDto> UpdateAliasAsync(Guid aliasId, UpdateAliasOptions updateAliasOptions, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| UpdateAliasOptions | updateAliasOptions | |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<AliasDto> | Task of AliasDto |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
UpdateAliasWithHttpInfo(Guid, UpdateAliasOptions, int)
Update an email alias
Declaration
public ApiResponse<AliasDto> UpdateAliasWithHttpInfo(Guid aliasId, UpdateAliasOptions updateAliasOptions, int operationIndex = 0)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| UpdateAliasOptions | updateAliasOptions | |
| int | operationIndex | Index associated with the operation. |
Returns
| Type | Description |
|---|---|
| ApiResponse<AliasDto> | ApiResponse of AliasDto |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |
UpdateAliasWithHttpInfoAsync(Guid, UpdateAliasOptions, int, CancellationToken)
Update an email alias
Declaration
public Task<ApiResponse<AliasDto>> UpdateAliasWithHttpInfoAsync(Guid aliasId, UpdateAliasOptions updateAliasOptions, int operationIndex = 0, CancellationToken cancellationToken = default)
Parameters
| Type | Name | Description |
|---|---|---|
| Guid | aliasId | |
| UpdateAliasOptions | updateAliasOptions | |
| int | operationIndex | Index associated with the operation. |
| CancellationToken | cancellationToken | Cancellation Token to cancel the request. |
Returns
| Type | Description |
|---|---|
| Task<ApiResponse<AliasDto>> | Task of ApiResponse (AliasDto) |
Exceptions
| Type | Condition |
|---|---|
| ApiException | Thrown when fails to make API call |


Training Location: {{ @SESSION.training_info['location'] }}
Application Deadline: {{ @SESSION.training_info['deadline'] }}
Training Schedule:
{{ @SESSION.training_info['date'] }}
{{ @SESSION.training_info['date2'] }}
NAMI Family Support Groups (FSG) are:
Local meetings of caregivers of
individuals with a mental illness where family members can talk frankly about their challenges and
help one another through their learned wisdom.
About This Training
Prospective facilitators must
have a family member or loved one living with mental illness, and be at least 18 years of age.
Participants learn to facilitate ongoing NAMI Family Support Groups for family
members/loved ones of someone living with a mental illness. The FSG model offers a set of key
structures and group processes for facilitators to use in common support group scenarios.
These structures come with clear guidelines to follow. Used together, they encourage full group
participation in support group meetings. These structures are comfortable for both seasoned and
less experienced facilitators because they help support group function well in most every situation.
By taking this facilitator
training you are committing to co-facilitate a support group for a minimum of two (2) years in
coordination with your local NAMI affiliate. You will be required to provide your affiliate with
specific attendance data for reporting to National NAMI Education Data tracking.
NAMI Washington will pay for meals, snacks, lodging and
all training materials. Your NAMI affiliate is asked to cover your travel and other expenses that
you may incur to attend this training. Lodging is at the Comfort Inn, and is double occupancy.
If you require single occupancy, arrangements will need to be made prior to attendance by the
attendee and there will be additional costs which will be the responsibility of the attendee.
In order to reserve a space at the training, a $50 refundable registration deposit from your
affiliate is required at the time of registration. If you need to cancel after being accepted,
notify Michelle Strait at the state office<PHONE_NUMBER> or<EMAIL_ADDRESS>no later than
January 7, 2019 so we can fill your spot, or your affiliate will lose its $50 registration deposit.
Cancelled spots are filled with applications from the waiting list for the class, not by sending another affiliate member.
Ready to start the application?
Start


Embracing Career Diversity
Things Are Different Now
Hello, first-blog-post-since-I-defended-my-Ph.D! It’s wild to think that after five or so years (between starting the the MSc. and the final Ph.D. defense), I am finally done with graduate school. There are no more exams, no more term deadlines, and no more giant documents to write. The last few months felt like quite the pressure cooker between writing everything up, flying back to defend, then doing a bit of travel. And now after the sprint at the end of the marathon, it’s finally over. It kind of feels like a scene out of a movie where the soundtrack builds to a climax, but then it all just goes silent. I feel a bit caught in suspended animation and have a lot of thoughts swirling around and no structure to place them within.
And what’s a boy with a lot of feelings in 2019 to do? Start a podcast.
Just kidding, the last thing the world needs is another dude telling you his opinions about the world on a podcast. I am not starting a podcast. But I do want to blog more. It’s something I personally find very helpful to do myself and have found reading other’s blogs to be very helpful. In this post, I want to do a bit of self-justification and mindless rambling.
bigsat
So as noted above, I’m finally done with the Ph.D. (Yippe!) It was a trudge to say the least. Not only was it a lot of work, but living in a work environment for a few years as an intellectual underling is not exactly great for your self esteem. The hours and pay were not great (if you think about the Ph.D. like a job), but more importantly, the grind of graduate school is not sustainable. The rate that I was working in the months leading up to my dissertation submission consumed every part of my life. Having spent so much time on my #bigsit and all the graduate school that lead up to that, I also was starting to feel a deeper dread that large portions of my life were passing me by and I was loosing time that I could not get back.1 The good news is that retrospectively I don’t regret any of it. As a result, I have a dissertation that I am very proud of on many levels. I’ll be blogging about that soon as well. But I also think that it is important to acknowledge all these thoughts and feelings and reflect on them. And one thing that really helped me while I was a graduate student was reading about others who seem to have similar feelings. So what I want to do here is explore those thoughts and feelings.
Thoughts and Feelings
What I am finding is there are a lot of those thoughts and feelings post-PhD. In drafting this post, I found that I wanted to talk about EVERYTHING. For this post alone, I thought about having sub-sections or digressions that talked about: finding personal validation through the structure of academia, feeling disconnected from academic peers as someone not going on to some fancy TT job this year, all the strange things people said at conferences last month, and this list goes on. And in starting to sketch out what each of those digressions might look like, I realized here I had mountains of thoughts and feelings I wanted to share. It was almost like that for every new fact I had learned in grad school, I was given two feelings to go along with it.
But given all these feelings, and no academic cohort anymore, who can I then share all these niche thoughts with? This question becomes even more important when you consider that you really only are who you think you are in relation to other people. I noticed this the most when I moved to London last year and didn’t have daily access to my cohort at Louisiana State Univeristy. You don’t realize that you’re the “that guy” of your group until you leave them. If you can’t define yourself as “the guy who really likes music theory and music cognition” in your new group, it’s like that part of you goes away as well. This is a pretty big deal, because for many aspiring academics like myself, this is a huge part of our identity.
Crescendo
And the grim truth about this is realization is that post-PhD, these feelings might only increase with more time away from academic settings.
In a few weeks I am sure my<EMAIL_ADDRESS>email address will be disconnected.
I’ll move further away in many respects because I’m not taking that next logical career step of doing a post-doc, a VAP, or taking a “job”2.
In taking another path for right now, I will drift a bit further away from the rhythm of the academic year.
And in many ways, I have already started to experience this.
In the past few Theory conferences I attended, the invevitalble “What are you doing next year?” question conversation always got a bit awkward when I told them that I didn’t have a “job” for next year. Many times I felt compelled that I had to add some sort of caveat to my response saying that I was planning on applying for more “job”s next year, but next time with greater effort! Though what made it the most weird, is that many people seemed almost not interested in what I was planning on doing this next year or, even worse, actually told me that if I did not take other work that was as close as possible no matter what to being a Music Theory professor, I was just shooting myself in the foot for the rest of my academic career. This was off putting to say the least, but talking about this sad state of affairs is not a digression worth going on.
Though this whole situation brings up quite the conundrum. As people move through the Ph.D system, not everyone who gets a Ph.D in [Insert Your Subject Here] is going to move on right away to a “job”. If they don’t, the way things are currently set up they will start to spin a bit more out of the central orbit of the field. At some point they might swing back in or they could drift off. But it brings up what I think is an important question:
What does the space look like for academics who are interested in all things academic, but don’t neatly fit into a comprehensible box of the current infrastructure?
Throughout my PhD, conversations about this really didn’t come up as the part of any formalized curriculum. And saw it coming. Yet here I am. Or more appropriately– here we are. This group of people is only an ever growing population. And will continue to be since it’s numerically impossible to place every person in a “job” each year.
My Answer
Of course, this is a very large question and problem that exists far beyond that of Music Theory. It might even be happening in Musicology as well.
But regardless, there ought to exist some sort of space for people who are card carrying academics without a clubhouse to return to. And I guess what I want to start thinking out-loud about is thinking about what this kind of career diversity looks like that is not just academic purgatory or a career waiting room. I want to try to think about establishing myself (and others) in this space. And not just talk about it so it’s a bit more normal, but also write about what it might look like to enjoy being in this space.
I don’t really know what that will look like right now. But in addition to all those thoughts and feelings that I want to talk about, I also have a lot of practical work I want to share. And I think my twitter feed and website might be a good place to still stay in the loop and document experiences here or there.
Drafting up what I want to talk about post-Ph.D (even if it’s just for me to be therapeutic thoughts) I want to blog about career diversity, life as a graduate student, computational musicology, music science, how music theory relates to everything, and a whole host of other things.
So who knows. I wanted to blog throughout much of my Ph.D, but just did not have the time. Now on other side, I really want to explore all the topics I couldn’t justify while a grad student and use the whole process of a way as continuing to express my academic identity.
Also add in a bit of fear that everyone that I talked to that left academia willingly said doing so was one of the best choices they’ve made in their life…↩
For my non-academic readers, the “job” refers to a tenure track (TT) job in North America at a decent school near a city that you could imagine asking your partner to uproot their entire life so you can be a professor↩


Software
Along with other things in life, software has become one of those essential things we can hardly live without. Software is literally everywhere. Wifi, smart phones, millions of apps, cars, traffic management systems, banking & financial systems, education & medical systems, webshops and what not is made of software. Software continues to grow and fill other aspects of our lives. In fact, some software is “so old” that many software systems must be replaced or re-written because they are not of this time anymore.
-Yosuf HaydaryMotivation, Organization and Innovation/Idea
Sharpness, fun, respect, and where needed, sarcasm. These are the qualities that I have seen in great teams where I have enjoyed work.
In the picture: Aritra and Martijn
Material Design by materializecss


CompressCSS is a free tool that you can use to minify your CSS files online. Smaller file size means less bandwidth consumption, so by compressing you're not only saving up money on hosting but you're also making your site load faster.
It works by removing unnecessary white-spaces, line breaks, indentations, comments, semicolons, quotes and by combining rules when possible. It can also optimize various properties, like converting rgb colors to shorthand hex equivalent resulting into shorter code. By the default, the compressor also removes all invalid CSS such as negative paddings and empty rules. These are just a few among many things that this tool can do.
CompressCSS uses a modified version of Clean-CSS for all CSS minification. Based on benchmarks, it is currently the best when it comes to reducing the file size of CSS files.
<style>
tags.You can use the comment tag with exclamation mark to keep an important comment or to ignore that part when compressing. To use, put the content between /*!
and */
.
/*! CompressCSS | MIT License | Do not remove */
CompressCSS compressor is fully compatible with Google Chrome, Firefox, Opera, Safari, IE 10+, Edge and other modern browsers as long as JavaScipt is enabled.


Russian bear orphanage weans its cubs with `tough love'
BUBONIDZE, Russia (AP) _ Bear hunting season in Russia opened
Aug. 1, and it might seem an inauspicious time to release two
motherless bear cubs into the wild.
But father-and-son gamekeepers Valentin and Sergei Pazhetnov are
former hunters, and they specialize in training bear orphans to
survive all the dangers of Russia's deep forests, especially
predators on two legs.
The sister cubs, Prima and Dina, were found by a game warden in
April.
For four months, they have lived at the bear orphanage that the
Pazhetnov family runs as part of an animal sanctuary in Bubonidze,
a remote settlement 450 kilometers (280 miles) west of Moscow.
With the help of international donations, the Pazhetnovs have
raised and released 64 bear orphans in the last eight years. The
facility is the only one of its type in Russia.
What sets it apart is that the regimen is not warm and friendly.
Here, the bears are taught with ``tough love,'' and contact with
humans is kept to a minimum. Any gesture of friendliness by the
bears is met with a swift slap on a tender nose.
The reason? Bear cubs raised by humans often become too
trusting, even running up to hunters as if to make friends. So
Valentin, who studied animal behavior at Moscow State University,
has developed a program to care for young bears without letting
them get too attached.
What they're doing is making sure these bears retain their
biological fear of humans,'' says Simon Pope of the Britain-based
International Fund for Animal Welfare, which helps finance the
orphanage.
However, affection flows freely in the other direction.
``It's exactly the same emotion as if our children had left
home,'' says Sergei. ``We looked after them for so long and now
we've released them. But I'm sure they'll survive.''
Bears are plentiful in Russia, and hunting is considered part of
the national heritage.
Soviet leaders like Nikita Khrushchev and Leonid Brezhnev showed
off their prowess with a hunting rifle in front of visiting
dignitaries. And there were only a few voices of protest last year
when then Prime Minister Viktor Chernomyrdin killed a bear and her
cubs on a hunting trip.
 Female bears tend to stay in their
lairs in January when nursing their cubs, making them sitting
targets.
Cubs younger than 3 months have little sight, hearing or sense
of smell, and they can live inside the wooden cottage with Valentin
and his wife, Svetlana.
But once their senses are active, they are moved to an enclosure
deep in an animal sanctuary where they can learn to climb trees,
dig dens and scavenge for food.
The Pazhetnovs provide food and veterinary care, but limit
contact as much as possible, touching the bears only with gloves
and rebuffing any overtures of friendship.
After four months, Valentin decided the cubs Prima and Dina were
ready to return to the woods. Even though bear season is open, most
hunters wait until winter when it's easier to find bears in their
dens. So the cubs will have a few months to get used to being on
their own, dig a den and settle in for winter.
The cubs, sedated for the car trip, are tagged on the ear and
then awakened when they reach an area near their former den. As
they amble off, they pause for a moment, their heads poking above
the tall grass, and look back toward the humans.
But just briefly. Within moments, their brown coats fade into
the darkness among the trees.


Bitcoin whale moves $310 million cryptocurrency fortune — for just $0.32
Take that, TransferWise!
by David CanellisA cryptocurrency whale has just moved a ball-busting 44,000 BTC (worth more than $310 million) — and they paid a minuscule $0.32 in Bitcoin BTC transaction fees to do so.
The hefty movement was detected by Twitter-based transaction monitor @whale_alert this afternoon. Bitcoin’s miners included it in block #605230.
According to Blockchain.com’s Bitcoin explorer, the fee paid was just 0.00004551 BTC ($0.32). This is incredibly low, especially when compared to large movements previously detected.
It’s even more impressive when you consider that whoever sent the Bitcoin had no need to request permission from any bank, financial regulator, or world government to send hundreds of millions of dollars worth of digital cash.
Unlike the traditional banking system, Bitcoin users are afforded the freedom to choose their own transaction fees.
Transactions with higher fees attached are generally processed quicker than those with smaller ones.
In July, one Bitcoin whale moved $450 million multiple times, paying roughly $400 in fees for each transaction.
As well, Hard Fork reported that another big player had shifted $1 billion worth of Bitcoin in September. They paid $700 in fees to the network.
Have the whales figured out they’ve been overpaying?


Hello!
I am a researcher, and public policy engineer. I was formerly a Associate Researcher for economics and technology policy at Microsoft corporation. I am currently a graduate student at the University of Massachusetts, Amherst.
My research interests and representative fields of work include:
- computer science (AI, HCI, networking)
- labor economics (industrial organization & online labor markets)
- development (ict4d)
- public policy (employment, education, privacy, civil + human rights)
Other adventures...
Prior to graduate school and working for Microsoft corporation, I was a public servant in Washington, D.C.
First, as a staff assistant for U.S. Senator Edward M. Kennedy (MA).
Later, as a Congressional Liaison for President Barack Hussein Obama at the U.S. Department of Labor.
Now, I am a human rights activist who advocates for the rights of workers in technology, and advancing the representation and numbers of persons from marginalized communities. I believe we are all born free and equal, and should be able to live our lives with equal dignity, autonomy, joy, and peace.
Human things...
I enjoy humor, traveling, playing soccer and learning foreign languages.
I am avid reader and dog-lover.


My name is Dustin and for the past few years I've worked in sales and project coordination for transportation company. Over the last few months I've been learning to write in HTML,CSS and JavaScript and plan on learnign all I need to know to build websites and applcations in a new career.
I enjoy writing code in the languages below:
<EMAIL_ADDRESS>out my LinkedIn Profile


The Bottle Room serves up culinary flare and rare craft beers off the eclectic Greenleaf Avenue in Uptown Whittier. The Bottle Room is also an established and extremely well-liked business, so extra care was given to tackling their digital re-brand and new website, staying true to what makes The Bottle Room great while opening the doors to a new generation of customers.
As part of The Bottle Room's rebrand we designed a new logo and typography system, various print collateral, package design and glasswear. We also built their new website and online menu system, while producing a ton of photography to showcase Chef Alcazar's delicious menu and craft-beer finds. Seasonally, we help The Bottle Room launch their new menu and the special events the restaurant hosts.


§78. Surveyor. That there shall be a surveyor, who shall have the powers and duties heretofore attached to the surveyor-general, except such as relate to the geodetic survey of the Hawaiian Islands.


Life is beautiful. Feel it. Live it. Don't waste it.
<EMAIL_ADDRESS>| Milwaukee, WI | Software Developer Intern
Have a great day!


As I laid down
Through the tunnels
There was a sea inside
I could see
And that was it -
For seeing
I hold myself
Everytime.
This life
This book
This world
Has no bondaries
Has no ends
A masterpiece in the details
Behind a simple smile and a kiss
Hiding rainbow treasures
And sunlight diamonds.
This glance
This sea
This universe
Is the one I see
But
Unlike others
My mind's my own
I see all the beauty
But bring my own
Together they can dance
The symphony of hearts
Which no storms can distort.
I have no rush
I have no fear
I have no bias
I trust my eyes
I know it has no limits
I don't need to make it a picture
I don't need to create patterns
I don't need to make shapes.
Without anything in mind
Seamlessly
Slowly
Gradually
I just open myself at heart
Through my hands
Bring the light to be seen
With all the time at hands
Explore the realest of spots
Unafraid of what's to see
Clear of my own fears.
And everyday
Everytime
Unaware sometimes
I find a new star
It may make me scared
Or shake
Or stumble
But I'm alive
Right in the middle of it
I make no frames
And everyday
The river of life
Flowing
Shows me the hidden light
Takes me back to the same stairs
Rightly
Steeply
To our castle
To our heaven
For our hearts.


| write_lines {brio} | R Documentation |
The text is converted to UTF-8 encoding before writing.
write_lines(text, path, eol = "\n")
text |
A character vector to write |
path |
A character string giving the file path to write to. |
eol |
The end of line characters to use between lines. |
The files are opened in binary mode, so they always use exactly the string
given in eol
as the line separator.
To write a file with windows line endings use write_lines(eol = "\r\n")
The UTF-8 encoded input text (invisibly).
tf <- tempfile() write_lines(rownames(mtcars), tf) # Write with Windows style line endings write_lines(rownames(mtcars), tf, eol = "\r\n") unlink(tf)


CSS Tables
Simple CSS for HTML Tables
Default Table
Add the yui3-table
classname to a table to style an HTML table similar to how a YUI3 Datatable would be styled. This class adds appropriate padding and borders to table elements, and increases the emphasis on the header.
| # |
Make |
Model |
Year |
| 1 |
Honda |
Accord |
2009 |
| 2 |
Toyota |
Camry |
2012 |
| 3 |
Hyundai |
Elantra |
2010 |
Table with Horizontal Borders
If you prefer to just have horizontal lines, add the yui3-table-horizontal
classname to the table
element.
| # |
Make |
Model |
Year |
| 1 |
Honda |
Accord |
2009 |
| 2 |
Toyota |
Camry |
2012 |
| 3 |
Hyundai |
Elantra |
2010 |
Bordered Table
| # |
Make |
Model |
Year |
| 1 |
Honda |
Accord |
2009 |
| 2 |
Toyota |
Camry |
2012 |
| 3 |
Hyundai |
Elantra |
2010 |
Striped Table
Large tables are easier to parse visually if rows are easily distinguishable. Adding the yui3-table-odd
class name to every other tr
element changes the background of the row and creates a zebra-styled effect.
| # |
Make |
Model |
Year |
| 1 |
Honda |
Accord |
2009 |
| 2 |
Toyota |
Camry |
2012 |
| 3 |
Hyundai |
Elantra |
2010 |
| 4 |
Ford |
Focus |
2008 |
| 5 |
Nissan |
Sentra |
2011 |
| 6 |
BMW |
M3 |
2009 |
| 7 |
Honda |
Civic |
2010 |
| 8 |
Kia |
Soul |
2010 |
Using with Datatable


Last updated: 11.10.2015.
Please read these Terms of Service ("Terms", "Terms of Service") carefully before using the http://pattr.me website (the "Service") operated by pattr ("us", "we", or "our").
Your access to and use of the Service is conditioned on your acceptance of and compliance with these Terms. These Terms apply to all visitors, users and others who access or use the Service. By accessing or using the Service you agree to be bound by these Terms. If you disagree with any part of the terms then you may not access the Service.
Termination
We may terminate or suspend access to our Service immediately, without prior notice or liability, for any reason whatsoever, including without limitation if you breach the Terms.
All provisions of the Terms which by their nature should survive termination shall survive termination, including, without limitation, ownership provisions, warranty disclaimers, indemnity and limitations of liability.
Links To Other Web Sites
Our Service may contain links to thirdparty web sites or services that are not owned or controlled by pattr.
Pattr has no control over, and assumes no responsibility for, the content, privacy policies, or practices of any third party web sites or services. You further acknowledge and agree that pattr. shall not be responsible or liable, directly or indirectly, for any damage or loss caused or alleged to be caused by or in connection with use of or reliance on any such content, goods or services available on or through any such web sites or services.
We strongly advise you to read the terms and conditions and privacy policies of any thirdparty web sites or services that you visit.
Governing Law
These Terms shall be governed and construed in accordance with the laws of U.S.A , without regard to its conflict of law provisions.
Our failure to enforce any right or provision of these Terms will not be considered a waiver of those rights. If any provision of these Terms is held to be invalid or unenforceable by a court, the remaining provisions of these Terms will remain in effect. These Terms constitute the entire agreement between us regarding our Service, and supersede and replace any prior agreements we might have between us regarding the Service.
Changes
We reserve the right, at our sole discretion, to modify or replace these Terms at any time. If a revision is material we will try to provide at least 30 days notice prior to any new terms taking effect. What constitutes a material change will be determined at our sole discretion.
By continuing to access or use our Service after those revisions become effective, you agree to be bound by the revised terms. If you do not agree to the new terms, please stop using the Service.
Contact Us
If you have any questions about these Terms, please contact us.


Provides common types of numbers most of them implementing the {@link org.jscience.mathematics.structure.Field field} interface.
Although numbers defined in this package are not as fast as primitives types
(e.g. int
or double
). They have many
advantages (such as arbitrary size for {@link org.jscience.mathematics.number.LargeInteger LargeInteger}
or precision for {@link org.jscience.mathematics.number.Real Real}) which
make them irreplaceable in some calculations. This can be illustrated with the following example:
double x = 10864; double y = 18817; double z = 9 * Math.pow(x, 4.0)- Math.pow(y, 4.0) + 2 * Math.pow(y, 2.0); System.out.println("Result : " + z); > Result : 2.0The mathematically correct value is z=1. However, Java compilers using ANSI/IEEE double precision numbers evaluate z=2. Not even the first digit is correct! This is due to a rounding error occurring when subtracting two nearly equal floating point numbers. Now, lets write the same formula using {@link org.jscience.mathematics.number.Real Real} numbers:
int accuracy = 20; // 20 decimal zeros for integer values. Real x = Real.valueOf(10864, accuracy); Real y = Real.valueOf(18817, accuracy); Real z = x.pow(4).times(9).plus(y.pow(4).opposite()).plus(y.pow(2).times(2)); System.out.println("Result : " + z); > Result : 1.00000Not only the correct result is returned, but this result is also guaranteed to be
1 ± 0.00001
.
Only exact digits are written out, for example the following displays the first exact
digits of sqrt(2)
: Real two = Real.valueOf(2, 100); // 2.0000..00 (100 zeros after decimal point). Real sqrt2 = two.sqrt(); System.out.println("sqrt(2) = " + sqrt2); System.out.println("Precision = " + sqrt2.getPrecision() + " digits."); > sqrt(2) = 1.414213562373095048801688724209698078569671875376948 > Precision = 53 digits.


is very important to all of us. It is the only key to success in personal and professional life. It provides us various types of knowledge and skills. It is a continuous, slow and secure process of learning which helps us in obtaining knowledge.
We will help you to know the happenings around you and help you find students who share the thoughts as same as you.


lchage
Section: User Commands (1)Updated: Jan 12 2005
Index Return to Main Contents
NAME
lchage - Display or change user password policySYNOPSIS
lchage [OPTION]... userDESCRIPTION
Displays or allows changing password policy of user.OPTIONS
- -d, --date=days
-
Set the date of last password change to days after Jan 1 1970.
- -E, --expire=days
-
Set the account expiration date to days after Jan 1 1970.
Set days to -1 to disable account expiration.
- -i, --interactive
-
Ask all questions when connecting to the user database,
even if default answers are set up in
libuser
configuration.
- -I, --inactive=days
-
Disable the account after days after password expires (after
the user user is required to change the password).
- -l, --list
-
Only list current user's policy and make no changes.
- -m, --mindays=days
-
Require at least days days between password changes.
Set days to 0 to disable this checking.
- -M, --maxdays=days
-
Require changing the password after days since last password change.
Set days to 99999 to disable this checking.
- -W, --warndays=days
-
Start warning the user days before password expires (before
the user is required to change the password).
EXIT STATUS
The exit status is 0 on success, nonzero on error.
Index
This document was created by man2html, using the manual pages.
Time: 05:29:05 GMT, December 24, 2015


We got platforms!
- strategize mission-critical initiatives
- cultivate one-to-one partnerships
- empower viral eyeballs
- leverage best-of-breed platforms
- enable customized bandwidth
- transition mission-critical action-items
- exploit granular supply-chains
- cultivate B2C portals
- facilitate virtual web services
- recontextualize 24/7 action-items
- scale distributed eyeballs


Thank you for your purchase. We hope you are happy with your purchase. However, if you are not completely satisfied with your purchase for any reason, you may return it to us for a full refund or an exchange. Please see below for more information on our return policy.
RETURNS
All returns must be postmarked within three (3) days of the purchase date. All returned items must be in new and unused condition, with all original tags and labels attached.
RETURN PROCESS
To return an item, please email customer service at<EMAIL_ADDRESS>to obtain a Return Merchandise Authorization (RMA) number. After receiving a RMA number, place the item securely in its original packaging and include your proof of purchase, and mail your return to the following address:
Kaustav Roy Media Works Pvt. Ltd.
Attn: Returns
RMA #
Tarakeswar , Westbengal , India
Tarakeswar, Westbengal 712414
India
Please note, you will be responsible for all return shipping charges. We strongly recommend that you use a trackable method to mail your return.
REFUNDS
After receiving your return and inspecting the condition of your item, we will process your return or exchange. Please allow at least seven (7) days from the receipt of your item to process your return or exchange. We will notify you by email when your return has been processed.
EXCEPTIONS
The following items cannot be returned or exchanged:
Any Photo Print
Any Plain Paper Print
For defective or damaged products, please contact us at the contact details below to arrange a refund or exchange.
Please Note
A 25% restocking fee will be charged for all returns.
QUESTIONS
If you have any questions concerning our return policy, please contact us at:


Type FieldOfView
Namespace RogueSharp
A class for performing field-of-view calculations to determine what is observable in a Map from a given Cell within a given light radius
Methods
Public instance methods
ReadOnlyCollection<ICell> AppendFov(int xOrigin, int yOrigin, int radius, bool lightWalls)
Performs a field-of-view calculation with the specified parameters and appends it any existing field-of-view calculations.
Field-of-view (FOV) is basically a calculation of what is observable in the Map from a given Cell with a given light radius.
Parameters
-
int
xOrigin - X location of the Cell to perform the field-of-view calculation with 0 as the farthest left
-
int
yOrigin - Y location of the Cell to perform the field-of-view calculation with 0 as the top
-
int
radius - The number of Cells in which the field-of-view extends from the origin Cell. Think of this as the intensity of the light source.
-
bool
lightWalls - True if walls should be included in the field-of-view when they are within the radius of the light source. False excludes walls even when they are within range.
Returns
-
ReadOnlyCollection<ICell>
- List of Cells representing what is observable in the Map based on the specified parameters
Show Example
When a character is holding a light source in a large area that also has several other sources of light such as torches along the walls ComputeFov could first be called for the character and then AppendFov could be called for each torch to give us the final combined FOV given all the light sources
FieldOfView Clone()
Create and return a deep copy of an existing FieldOfView class
Returns
-
FieldOfView
- A deep copy of an existing FieldOfViewClass
ReadOnlyCollection<ICell> ComputeFov(int xOrigin, int yOrigin, int radius, bool lightWalls)
Performs a field-of-view calculation with the specified parameters.
Field-of-view (FOV) is basically a calculation of what is observable in the Map from a given Cell with a given light radius.
Any existing field-of-view calculations will be overwritten when calling this method.
Parameters
-
int
xOrigin - X location of the Cell to perform the field-of-view calculation with 0 as the farthest left
-
int
yOrigin - Y location of the Cell to perform the field-of-view calculation with 0 as the top
-
int
radius - The number of Cells in which the field-of-view extends from the origin Cell. Think of this as the intensity of the light source.
-
bool
lightWalls - True if walls should be included in the field-of-view when they are within the radius of the light source. False excludes walls even when they are within range.
Returns
-
ReadOnlyCollection<ICell>
- List of Cells representing what is observable in the Map based on the specified parameters
bool IsInFov(int x, int y)
Check if the Cell is in the currently computed field-of-view
Field-of-view must first be calculated by calling ComputeFov and/or AppendFov
Field-of-view (FOV) is basically a calculation of what is observable in the Map from a given Cell with a given light radius
Parameters
-
int
x - X location of the Cell to check starting with 0 as the farthest left
-
int
y - Y location of the Cell to check, starting with 0 as the top
Returns
-
bool
- True if the Cell is in the currently computed field-of-view, false otherwise
Show Example
Field-of-view can be used to simulate a character holding a light source and exploring a Map representing a dark cavern Any Cells within the FOV would be what the character could see from their current location and lighting conditions


dolphin
KDE's file manager to manage files and directories.
More information: home page
- Launch the file manager:
dolphin
- Open specific directories:
dolphin path/to/directory1 path/to/directory2 ...
- Open with specific files or directories selected:
dolphin --select path/to/file_or_directory1 path/to/file_or_directory2 ...
- Open a new window:
dolphin --new-window
- Open specific directories in split view:
dolphin --split path/to/directory1 path/to/directory2
- Launch the daemon (only required to use the DBus interface):
dolphin --daemon
- Display help:
dolphin --help


Brett Zamir
on 2012-09-18 16:12:50
@Thomas: Fixed in Git, thanks!
Thomas
on 2012-09-18 04:11:49
var pos = 0 is initialized but never used.
formal shirts
on 2012-05-15 10:12:29
This is s good looping code and is working as it is being told in here. Happy to learn some basics of the coding language.
jimmyfreaky
on 2012-05-14 13:37:22
that was amazing guyz it s very informative code i like it...
jimmyfreaky
on 2012-05-14 13:36:12
Hot fix rhinestones are the latest beads and fashion accessories, which are very prominent among the ladies, this is the fashion accessory that comes in the range of every woman, and its unique design makes it beautiful and stylish. wholesale hot fix rhinestones
Jeremy
on 2012-04-24 19:42:46
I must say, useful information for users especailly for website designers.
saraanderson
on 2012-04-24 08:33:39
Really your post is really very good and I appreciate it. It’s hard to sort the good from the bad sometimes, but I think you’ve nailed it. You write very well which is amazing. I really impressed by your post.
????? ????? ????
on 2012-04-18 10:17:38
This is a very informative article. I was looking for these things and here I found it. I am doing a project and this information is very useful me. Some things in here I have not thought about before
Rafal
on 2011-10-06 15:54:33
Great!
Świetne, bardzo mi się przydało.
Greetings from Poland - Rafal
Robert Eisele
on 2011-09-05 00:04:57
What about this optimization?
function substr_count(haystack, needle, offset, length) {
haystack+= "";
needle+= "";
if (isNaN(offset)) {
offset = 0;
}
if (isNaN(length)) {
length = haystack.length - offset;
}
haystack = haystack.substr(offset, length);
return (haystack.length - haystack.replace(new RegExp(needle, 'g'), "").length) / needle.length;
}
Kevin van Zonneveld
on 2009-07-24 12:07:57
@ Shock: I think I would have to make the same point as here:
http://phpjs.org/functions/substr_count:559#comment_626
Don't you agree?
Shock
on 2009-07-20 01:26:41
// Maybe something like that?
function substr_count( haystack, needle, offset, length ) {
if (isNaN(offset)) {
offset = 0;
}
if (isNaN(length)) {
length = haystack.length - offset;
}
if (length <= 0 || (length + offset) > haystack) {
return false
} else {
return haystack.substr(offset,length).split(needle).length - 1;
}
}
sorry for doublePost
Shock
on 2009-07-20 01:25:28
// Maybe something like that?
function substr_count( haystack, needle, offset, length ) {
if (isNaN(offset)) {
offset = 0;
}
if (isNaN(length)) {
length = haystack.length - offset;
}
if (length <= 0 || (length + offset) > haystack) {
return false
} else {
return haystack.substr(offset,length).split(needle).length - 1;
}
}[/CODE
Kevin van Zonneveld
on 2009-01-25 13:48:59
Well we could benchmark it of course. But I think that when your doing this on really large strings, you also end up with really large arrays, that you really don't need. So my guess is that your approach will be more memory intensive don't you agree?
antimatter15
on 2009-01-18 14:21:35
Wouldn't it be faster to just use split().length-1?
function substr_count( haystack, needle, offset, length ) {
if(!isNaN(offset)){
if(!isNaN(length)){
haystack=haystack.substr(offset,length);
}else haystack = haystack.substr(offset)
}
haystack = haystack.split(needle).length-1
return haystack<0?false:haystack;
}


Man admits role in Debenham Co-op ram raid
by Michael StewardA man has admitted his role in a JCB ram raid on a Suffolk Co-op which saw a cash machine ripped from the wall of the store and a defibrillator destroyed.
Jesse Gatehouse, 30, of Defoe Crescent, Colchester, appeared before magistrates in Ipswich yesterday via video link and pleaded guilty to burglary of the Debenham Co-op.
Police were called around 3.30am on Tuesday following reports that a stolen JCB Teleporter had been used to smash the front of the village store in Chancery Lane.
Two more stolen vehicles - a white Ford Transit van, which had its roof cut off, and a red Audi S4 - were also used in the raid, with the ATM placed in the Transit van after it had been dragged from the store.
The whole incident was captured on CCTV, the court heard.
The Audi fled the scene but the ATM had a tracker fitted and was traced to a disused barn in Syleham, around 13 miles away, where the door had been forced.
MORE: Ram raid will have 'dramatic impact' on villagers, say locals
As officers made their way to the scene, around 4.20am, they encountered a red Audi driving towards them on Syleham Road.
Magistrates heard that as the car tried to avoid police by performing a u-turn in the narrow road, it ended up half in a ditch.
Two men got out of the Audi and despite a large-scale search, involving the police dog unit, they currently remain at large.
Gatehouse was sat in the back of the Audi and was arrested by police at the scene.
He offered no comment in police interview.
The ATM and its contents were recovered still inside the van at the barn, the court heard.
Gatehouse was committed to Ipswich Crown Court for sentencing at a date to be fixed.
No bail application was made and he was remanded in custody.
The JCB was discovered to have been stolen from a farm in Debenham and the Ford Transit was stolen from an address in Bures St Mary.
The red Audi had been reported as stolen from an address in Danbury near Chelmsford, between October 29 and October 30.
Detectives said yesterday they are exploring whether the Debenham incident is linked to a similar ram raid on the Spar store in Glemsford on November 4.
In that incident, a Land Rover Defender was reversed into the store, causing extensive damage although nothing was stolen.


Huawei Mate 30 Pro 5G Used to Play a Concert in Real-Time Through 5G - Gizchina.com
by PierreHuawei Mate 30 Pro 5G Used to Play a Concert in Real-Time Through 5G
3.7 (73.33%) 3 votes
The three movies shot on the Huawei Mate 30 series we talked about in this article aren’t the only great feat achieved by the device in the past couple days. The smartphone was indeed the star of another event: a concert.
Huawei Mate 30 Pro 5G Used to Play a Concert in Real-Time Through 5G
How did it work? Well it’s quite “simple”. A Huawei Mate 30 Pro 5G was set in the main venue in Hubei and the concert was carried out by the Hubei Provincial Museum Bell Orchestra, while the other identical device was in the Shandong Museum where we find the Tianfeng Haitao Guqin from the prosperous Tang Dynasty.
Then, through a 5G connection, the two parts of the “band” were synced together. This resulted in a full-on real concert experience for the people who attended the event.
Obviously, the level of synchronization achieved couldn’t have happened without 5G. The next generation cellular network technology has indeed the lowest latency we’ve ever seen on a mobile network; along with the fastest speeds.
The Huawei Mate 30 Pro 5G, as the name suggests, clearly supports the tech. As a matter of fact, Huawei’s latest flagship is actually the best 5G phone according to China Mobile. The device did indeed win different awards at the internet provider’s conference which took place yesterday.
Huawei’s Mate 30 Pro 5G also got a five-star evaluation for video quality and a five-star evaluation for the camera department in general. Finally, the device also earned 5 stars for its gaming capabilities.
Other specs on the Mate 30 Pro 5G include a Huawei Kirin 990 CPU, a 6.53-inch FHD+ display (2400 x 1176), at least 8GB of RAM and 128GB/256GB of internal storage, a nano-SD card slot and four cameras. These include a 40MP ultra wide-angle + 40MP wide-angle + 8MP telephoto + 3D depth sensor. In addition, these sensors support 3x optical zoom, 5x hybrid zoom, and 30x digital zoom. On the front, there is a 32MP selfie shooter which supports 3D face unlock.