UNPKG

@secrethub/ngx-stripe

Version:

The core package for ngx-stripe, for using stripe.js in your application

419 lines 33.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { filter, first } from 'rxjs/operators'; import { StripeLoader } from './stripe-loader.service'; import * as i0 from "@angular/core"; import * as i1 from "./stripe-loader.service"; var StripeService = /** @class */ (function () { /** * Lazy load the StripeJS javascript file on first usage of the service * @param loader - The loader that should be used for loading StripeJS */ function StripeService(loader) { var _this = this; this.loader = loader; /** * A BehaviorSubject containing the StripeJS object * * Since the script is loaded Async we need an options for all our functions * to wait for stripe to have been loaded */ this.stripe$ = new BehaviorSubject(null); loader.loadScript() .subscribe(function (stripe) { return _this.stripe$.next(stripe); }, function () { throw new Error('Stripe could not be loaded!'); }); } /** * Creates a new stripe instance with the given key * @param key - The public key that should be used to communicate with Stripe * @param options - Any options to configure StripeJS */ /** * Creates a new stripe instance with the given key * @param {?} key - The public key that should be used to communicate with Stripe * @param {?=} options - Any options to configure StripeJS * @return {?} */ StripeService.prototype.changeKey = /** * Creates a new stripe instance with the given key * @param {?} key - The public key that should be used to communicate with Stripe * @param {?=} options - Any options to configure StripeJS * @return {?} */ function (key, options) { this.stripe$.next(StripeLoader.getStripeInstance(key, options)); }; /** * Configures the `Elements` object from StripeJS with the given options * @see https://stripe.com/docs/stripe-js/elements/quickstart#create-form * @param [options] - Any configuration options for the Elements object * @param [isIETFLocaleTag] - Whether or not the options `locale` is formatted as a IETFLocaleTag. * If true the locale will be formatted by this function * * @return Observable that resolves in an StripeJS ElementsCreator */ /** * Configures the `Elements` object from StripeJS with the given options * @see https://stripe.com/docs/stripe-js/elements/quickstart#create-form * @param {?=} options * @param {?=} isIETFLocaleTag * @return {?} Observable that resolves in an StripeJS ElementsCreator */ StripeService.prototype.getElementFactory = /** * Configures the `Elements` object from StripeJS with the given options * @see https://stripe.com/docs/stripe-js/elements/quickstart#create-form * @param {?=} options * @param {?=} isIETFLocaleTag * @return {?} Observable that resolves in an StripeJS ElementsCreator */ function (options, isIETFLocaleTag) { if (isIETFLocaleTag === void 0) { isIETFLocaleTag = false; } return tslib_1.__awaiter(this, void 0, void 0, function () { var stripe; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (isIETFLocaleTag && options && options.locale) { options.locale = options.locale.split('-')[0]; // Only use the first part of the locale 'en' for example } return [4 /*yield*/, this.getStripe()]; case 1: stripe = _a.sent(); return [2 /*return*/, stripe.elements(options)]; } }); }); }; /** * Create a payment request * NOTE: This is NOT supported for Firefox * @see https://stripe.com/docs/payment-request-api * * @param options - Payment information that should be used by Stripe * * @return the created request */ /** * Create a payment request * NOTE: This is NOT supported for Firefox * @see https://stripe.com/docs/payment-request-api * * @param {?} options - Payment information that should be used by Stripe * * @return {?} the created request */ StripeService.prototype.makePaymentRequest = /** * Create a payment request * NOTE: This is NOT supported for Firefox * @see https://stripe.com/docs/payment-request-api * * @param {?} options - Payment information that should be used by Stripe * * @return {?} the created request */ function (options) { return tslib_1.__awaiter(this, void 0, void 0, function () { var stripe; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getStripe()]; case 1: stripe = _a.sent(); return [2 /*return*/, stripe.paymentRequest(options)]; } }); }); }; /** * Creates a token from the given element * * @param element - The element from which the data needs to be extracted * @param [data] - an object containing additional payment information you might have collected * * @return A promise that resolves in a token or a rejection if the creation of the token failed */ /** * Creates a token from the given element * * @param {?} element - The element from which the data needs to be extracted * @param {?=} data * @return {?} A promise that resolves in a token or a rejection if the creation of the token failed */ StripeService.prototype.createTokenFromElement = /** * Creates a token from the given element * * @param {?} element - The element from which the data needs to be extracted * @param {?=} data * @return {?} A promise that resolves in a token or a rejection if the creation of the token failed */ function (element, data) { return tslib_1.__awaiter(this, void 0, void 0, function () { var stripe; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getStripe()]; case 1: stripe = _a.sent(); return [2 /*return*/, stripe.createToken(element, data).then(function (result) { if (result.error) { Promise.reject(result.error); } return result.token; })]; } }); }); }; /** * Creates a token from a bank account * * @param data - The data from the bank account that should be used for the token * * @return A promise that resolves in a token or a rejection if the creation of the token failed */ /** * Creates a token from a bank account * * @param {?} data - The data from the bank account that should be used for the token * * @return {?} A promise that resolves in a token or a rejection if the creation of the token failed */ StripeService.prototype.createTokenFromBankAccount = /** * Creates a token from a bank account * * @param {?} data - The data from the bank account that should be used for the token * * @return {?} A promise that resolves in a token or a rejection if the creation of the token failed */ function (data) { return tslib_1.__awaiter(this, void 0, void 0, function () { var stripe; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getStripe()]; case 1: stripe = _a.sent(); return [2 /*return*/, stripe.createToken('bank_account', data).then(function (result) { if (result.error) { Promise.reject(result.error); } return result.token; })]; } }); }); }; /** * Creates a token from the personal information of a customer * * @param data - The personal information that should be used for the creation of the token * * @return A promise that resolves in a token or a rejection if the creation of the token failed */ /** * Creates a token from the personal information of a customer * * @param {?} data - The personal information that should be used for the creation of the token * * @return {?} A promise that resolves in a token or a rejection if the creation of the token failed */ StripeService.prototype.createTokenFromPii = /** * Creates a token from the personal information of a customer * * @param {?} data - The personal information that should be used for the creation of the token * * @return {?} A promise that resolves in a token or a rejection if the creation of the token failed */ function (data) { return tslib_1.__awaiter(this, void 0, void 0, function () { var stripe; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getStripe()]; case 1: stripe = _a.sent(); return [2 /*return*/, stripe.createToken('pii', data).then(function (result) { if (result.error) { Promise.reject(result.error); } return result.token; })]; } }); }); }; /** * Creates a source object from the given element and data * * @param element - The element from which the data needs to be extracted * @param data - An object containing the type of Source you want to create and any additional payment source information * * @return A promise that resolves in a source object or a rejection if the creation of the source failed */ /** * Creates a source object from the given element and data * * @param {?} element - The element from which the data needs to be extracted * @param {?} data - An object containing the type of Source you want to create and any additional payment source information * * @return {?} A promise that resolves in a source object or a rejection if the creation of the source failed */ StripeService.prototype.createSourceFromElement = /** * Creates a source object from the given element and data * * @param {?} element - The element from which the data needs to be extracted * @param {?} data - An object containing the type of Source you want to create and any additional payment source information * * @return {?} A promise that resolves in a source object or a rejection if the creation of the source failed */ function (element, data) { return tslib_1.__awaiter(this, void 0, void 0, function () { var stripe; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getStripe()]; case 1: stripe = _a.sent(); return [2 /*return*/, stripe.createSource(element, data).then(function (result) { if (result.error) { Promise.reject(result.error); } return result.source; })]; } }); }); }; /** * Creates a source object from only data * * @param data - The data that should be used for the creation of the source object * * @return A promise that resolves in a source object or a rejection if the creation of the source failed */ /** * Creates a source object from only data * * @param {?} data - The data that should be used for the creation of the source object * * @return {?} A promise that resolves in a source object or a rejection if the creation of the source failed */ StripeService.prototype.createSourceFromData = /** * Creates a source object from only data * * @param {?} data - The data that should be used for the creation of the source object * * @return {?} A promise that resolves in a source object or a rejection if the creation of the source failed */ function (data) { return tslib_1.__awaiter(this, void 0, void 0, function () { var stripe; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getStripe()]; case 1: stripe = _a.sent(); return [2 /*return*/, stripe.createSource(data).then(function (result) { if (result.error) { Promise.reject(result.error); } return result.source; })]; } }); }); }; /** * Fetches an existing source based on the given parameters * * @param id - The unique identifier of the source * @param client_secret - A secret available to the web client that created the Source * * @return A promise that resolves in a source object or a rejection if the creation of the source failed */ /** * Fetches an existing source based on the given parameters * * @param {?} id - The unique identifier of the source * @param {?} client_secret - A secret available to the web client that created the Source * * @return {?} A promise that resolves in a source object or a rejection if the creation of the source failed */ StripeService.prototype.getSource = /** * Fetches an existing source based on the given parameters * * @param {?} id - The unique identifier of the source * @param {?} client_secret - A secret available to the web client that created the Source * * @return {?} A promise that resolves in a source object or a rejection if the creation of the source failed */ function (id, client_secret) { return tslib_1.__awaiter(this, void 0, void 0, function () { var stripe; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getStripe()]; case 1: stripe = _a.sent(); return [2 /*return*/, stripe.retrieveSource({ id: id, client_secret: client_secret }).then(function (result) { if (result.error) { Promise.reject(result.error); } return result.source; })]; } }); }); }; /** * Fetches the StripeJS instance * NOTE: Use the instance for token generation * * @return The StripeJS instance when it is available (since StripeJS is loaded Async) */ /** * Fetches the StripeJS instance * NOTE: Use the instance for token generation * * @return {?} The StripeJS instance when it is available (since StripeJS is loaded Async) */ StripeService.prototype.getStripe = /** * Fetches the StripeJS instance * NOTE: Use the instance for token generation * * @return {?} The StripeJS instance when it is available (since StripeJS is loaded Async) */ function () { return this.stripe$.pipe(filter(function (stripe) { return !!stripe; }), first()).toPromise().then(function (stripe) { return stripe; }); }; StripeService.decorators = [ { type: Injectable, args: [{ providedIn: 'root', },] } ]; StripeService.ctorParameters = function () { return [ { type: StripeLoader } ]; }; /** @nocollapse */ StripeService.ngInjectableDef = i0.defineInjectable({ factory: function StripeService_Factory() { return new StripeService(i0.inject(i1.StripeLoader)); }, token: StripeService, providedIn: "root" }); return StripeService; }()); export { StripeService }; if (false) { /** * A BehaviorSubject containing the StripeJS object * * Since the script is loaded Async we need an options for all our functions * to wait for stripe to have been loaded * @type {?} */ StripeService.prototype.stripe$; /** @type {?} */ StripeService.prototype.loader; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaXBlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VjcmV0aHViL25neC1zdHJpcGUvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvc3RyaXBlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBTXpDLE9BQU8sRUFBQyxlQUFlLEVBQWEsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0seUJBQXlCLENBQUM7OztBQUVyRDtJQVlFOzs7T0FHRztJQUNILHVCQUFvQixNQUFvQjtRQUF4QyxpQkFRQztRQVJtQixXQUFNLEdBQU4sTUFBTSxDQUFjO1FBWnhDOzs7OztXQUtHO1FBQ0ssWUFBTyxHQUFHLElBQUksZUFBZSxDQUFrQixJQUFJLENBQUMsQ0FBQztRQU8zRCxNQUFNLENBQUMsVUFBVSxFQUFFO2FBQ2hCLFNBQVMsQ0FDUixVQUFDLE1BQWdCLElBQUssT0FBQSxLQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBekIsQ0FBeUIsRUFDL0M7WUFDRSxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUNGLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7T0FJRzs7Ozs7OztJQUNJLGlDQUFTOzs7Ozs7SUFBaEIsVUFBaUIsR0FBVyxFQUFFLE9BQTZCO1FBQ3pELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7Ozs7Ozs7O0lBQ1UseUNBQWlCOzs7Ozs7O0lBQTlCLFVBQStCLE9BQStCLEVBQUUsZUFBdUI7UUFB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Ozs7SUFBakI7UUFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN0QixNQUFNLENBQUMsVUFBQyxNQUF1QixJQUFLLE9BQUEsQ0FBQyxDQUFDLE1BQU0sRUFBUixDQUFRLENBQUMsRUFDN0MsS0FBSyxFQUFFLENBQ1IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBQyxNQUFnQixJQUFLLE9BQUEsTUFBTSxFQUFOLENBQU0sQ0FBQyxDQUFDO0lBQ25ELENBQUM7O2dCQXZMRixVQUFVLFNBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzs7Z0JBSk8sWUFBWTs7O3dCQVJwQjtDQWtNQyxBQXhMRCxJQXdMQztTQXJMWSxhQUFhOzs7Ozs7Ozs7SUFPeEIsZ0NBQTZEOztJQU1qRCwrQkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1N0cmlwZUpTLCBTdHJpcGVDb25maWdPcHRpb25zfSBmcm9tICdzdHJpcGVqcyc7XHJcbmltcG9ydCB7U3RyaXBlRWxlbWVudCwgRWxlbWVudEZhY3RvcnksIEVsZW1lbnRDcmVhdG9yT3B0aW9uc30gZnJvbSAnc3RyaXBlanMvZWxlbWVudCc7XHJcbmltcG9ydCB7U3RyaXBlUGF5bWVudE9wdGlvbnMsIFN0cmlwZVBheW1lbnRSZXF1ZXN0fSBmcm9tICdzdHJpcGVqcy9wYXltZW50JztcclxuaW1wb3J0IHtCYW5rVG9rZW5EYXRhLCBJQkFOVG9rZW5EYXRhLCBQaWlUb2tlbkRhdGEsIFRva2VuLCBUb2tlbkRhdGEsIFRva2VuUmVzdWx0fSBmcm9tICdzdHJpcGVqcy90b2tlbic7XHJcbmltcG9ydCB7U291cmNlLCBTb3VyY2VEYXRhLCBTb3VyY2VSZXN1bHR9IGZyb20gJ3N0cmlwZWpzL3NvdXJjZSc7XHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtmaWx0ZXIsIGZpcnN0fSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7U3RyaXBlTG9hZGVyfSBmcm9tICcuL3N0cmlwZS1sb2FkZXIuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3RyaXBlU2VydmljZSB7XHJcbiAgLyoqXHJcbiAgICogQSBCZWhhdmlvclN1YmplY3QgY29udGFpbmluZyB0aGUgU3RyaXBlSlMgb2JqZWN0XHJcbiAgICpcclxuICAgKiBTaW5jZSB0aGUgc2NyaXB0IGlzIGxvYWRlZCBBc3luYyB3ZSBuZWVkIGFuIG9wdGlvbnMgZm9yIGFsbCBvdXIgZnVuY3Rpb25zXHJcbiAgICogdG8gd2FpdCBmb3Igc3RyaXBlIHRvIGhhdmUgYmVlbiBsb2FkZWRcclxuICAgKi9cclxuICBwcml2YXRlIHN0cmlwZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFN0cmlwZUpTIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIExhenkgbG9hZCB0aGUgU3RyaXBlSlMgamF2YXNjcmlwdCBmaWxlIG9uIGZpcnN0IHVzYWdlIG9mIHRoZSBzZXJ2aWNlXHJcbiAgICogQHBhcmFtIGxvYWRlciAtIFRoZSBsb2FkZXIgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgbG9hZGluZyBTdHJpcGVKU1xyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9hZGVyOiBTdHJpcGVMb2FkZXIpIHtcclxuICAgIGxvYWRlci5sb2FkU2NyaXB0KClcclxuICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAoc3RyaXBlOiBTdHJpcGVKUykgPT4gdGhpcy5zdHJpcGUkLm5leHQoc3RyaXBlKSxcclxuICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0cmlwZSBjb3VsZCBub3QgYmUgbG9hZGVkIScpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgbmV3IHN0cmlwZSBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBrZXlcclxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIHB1YmxpYyBrZXkgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIFN0cmlwZVxyXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQW55IG9wdGlvbnMgdG8gY29uZmlndXJlIFN0cmlwZUpTXHJcbiAgICovXHJcbiAgcHVibGljIGNoYW5nZUtleShrZXk6IHN0cmluZywgb3B0aW9ucz86IFN0cmlwZUNvbmZpZ09wdGlvbnMpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RyaXBlJC5uZXh0KFN0cmlwZUxvYWRlci5nZXRTdHJpcGVJbnN0YW5jZShrZXksIG9wdGlvbnMpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbmZpZ3VyZXMgdGhlIGBFbGVtZW50c2Agb2JqZWN0IGZyb20gU3RyaXBlSlMgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9uc1xyXG4gICAqIEBzZWUgaHR0cHM6Ly9zdHJpcGUuY29tL2RvY3Mvc3RyaXBlLWpzL2VsZW1lbnRzL3F1aWNrc3RhcnQjY3JlYXRlLWZvcm1cclxuICAgKiBAcGFyYW0gW29wdGlvbnNdIC0gQW55IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEVsZW1lbnRzIG9iamVjdFxyXG4gICAqIEBwYXJhbSBbaXNJRVRGTG9jYWxlVGFnXSAtIFdoZXRoZXIgb3Igbm90IHRoZSBvcHRpb25zIGBsb2NhbGVgIGlzIGZvcm1hdHRlZCBhcyBhIElFVEZMb2NhbGVUYWcuXHJcbiAgICogSWYgdHJ1ZSB0aGUgbG9jYWxlIHdpbGwgYmUgZm9ybWF0dGVkIGJ5IHRoaXMgZnVuY3Rpb25cclxuICAgKlxyXG4gICAqIEByZXR1cm4gT2JzZXJ2YWJsZSB0aGF0IHJlc29sdmVzIGluIGFuIFN0cmlwZUpTIEVsZW1lbnRzQ3JlYXRvclxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBnZXRFbGVtZW50RmFjdG9yeShvcHRpb25zPzogRWxlbWVudENyZWF0b3JPcHRpb25zLCBpc0lFVEZMb2NhbGVUYWcgPSBmYWxzZSk6IFByb21pc2U8RWxlbWVudEZhY3Rvcnk+IHtcclxuICAgIGlmIChpc0lFVEZMb2NhbGVUYWcgJiYgb3B0aW9ucyAmJiBvcHRpb25zLmxvY2FsZSkge1xyXG4gICAgICBvcHRpb25zLmxvY2FsZSA9IG9wdGlvbnMubG9jYWxlLnNwbGl0KCctJylbMF07IC8vIE9ubHkgdXNlIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBsb2NhbGUgJ2VuJyBmb3IgZXhhbXBsZVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN0cmlwZSA9IGF3YWl0IHRoaXMuZ2V0U3RyaXBlKCk7XHJcbiAgICByZXR1cm4gc3RyaXBlLmVsZW1lbnRzKG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgcGF5bWVudCByZXF1ZXN0XHJcbiAgICogTk9URTogVGhpcyBpcyBOT1Qgc3VwcG9ydGVkIGZvciBGaXJlZm94XHJcbiAgICogQHNlZSBodHRwczovL3N0cmlwZS5jb20vZG9jcy9wYXltZW50LXJlcXVlc3QtYXBpXHJcbiAgICpcclxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFBheW1lbnQgaW5mb3JtYXRpb24gdGhhdCBzaG91bGQgYmUgdXNlZCBieSBTdHJpcGVcclxuICAgKlxyXG4gICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgcmVxdWVzdFxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBtYWtlUGF5bWVudFJlcXVlc3Qob3B0aW9uczogU3RyaXBlUGF5bWVudE9wdGlvbnMpOiBQcm9taXNlPFN0cmlwZVBheW1lbnRSZXF1ZXN0PiB7XHJcbiAgICBjb25zdCBzdHJpcGUgPSBhd2FpdCB0aGlzLmdldFN0cmlwZSgpO1xyXG4gICAgcmV0dXJuIHN0cmlwZS5wYXltZW50UmVxdWVzdChvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSB0b2tlbiBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XHJcbiAgICpcclxuICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBlbGVtZW50IGZyb20gd2hpY2ggdGhlIGRhdGEgbmVlZHMgdG8gYmUgZXh0cmFjdGVkXHJcbiAgICogQHBhcmFtIFtkYXRhXSAtIGFuIG9iamVjdCBjb250YWluaW5nIGFkZGl0aW9uYWwgcGF5bWVudCBpbmZvcm1hdGlvbiB5b3UgbWlnaHQgaGF2ZSBjb2xsZWN0ZWRcclxuICAgKlxyXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgaW4gYSB0b2tlbiBvciBhIHJlamVjdGlvbiBpZiB0aGUgY3JlYXRpb24gb2YgdGhlIHRva2VuIGZhaWxlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVUb2tlbkZyb21FbGVtZW50KGVsZW1lbnQ6IFN0cmlwZUVsZW1lbnQsIGRhdGE/OiBUb2tlbkRhdGEgfCBJQkFOVG9rZW5EYXRhKTogUHJvbWlzZTxUb2tlbj4ge1xyXG4gICAgY29uc3Qgc3RyaXBlID0gYXdhaXQgdGhpcy5nZXRTdHJpcGUoKTtcclxuICAgIHJldHVybiBzdHJpcGUuY3JlYXRlVG9rZW4oZWxlbWVudCwgZGF0YSkudGhlbigocmVzdWx0OiBUb2tlblJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB7XHJcbiAgICAgICAgUHJvbWlzZS5yZWplY3QocmVzdWx0LmVycm9yKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0LnRva2VuO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgdG9rZW4gZnJvbSBhIGJhbmsgYWNjb3VudFxyXG4gICAqXHJcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgZGF0YSBmcm9tIHRoZSBiYW5rIGFjY291bnQgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHRva2VuXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGluIGEgdG9rZW4gb3IgYSByZWplY3Rpb24gaWYgdGhlIGNyZWF0aW9uIG9mIHRoZSB0b2tlbiBmYWlsZWRcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgY3JlYXRlVG9rZW5Gcm9tQmFua0FjY291bnQoZGF0YTogQmFua1Rva2VuRGF0YSk6IFByb21pc2U8VG9rZW4+IHtcclxuICAgIGNvbnN0IHN0cmlwZSA9IGF3YWl0IHRoaXMuZ2V0U3RyaXBlKCk7XHJcbiAgICByZXR1cm4gc3RyaXBlLmNyZWF0ZVRva2VuKCdiYW5rX2FjY291bnQnLCBkYXRhKS50aGVuKChyZXN1bHQ6IFRva2VuUmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcclxuICAgICAgICBQcm9taXNlLnJlamVjdChyZXN1bHQuZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQudG9rZW47XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSB0b2tlbiBmcm9tIHRoZSBwZXJzb25hbCBpbmZvcm1hdGlvbiBvZiBhIGN1c3RvbWVyXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBwZXJzb25hbCBpbmZvcm1hdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHRva2VuXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGluIGEgdG9rZW4gb3IgYSByZWplY3Rpb24gaWYgdGhlIGNyZWF0aW9uIG9mIHRoZSB0b2tlbiBmYWlsZWRcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgY3JlYXRlVG9rZW5Gcm9tUGlpKGRhdGE6IFBpaVRva2VuRGF0YSk6IFByb21pc2U8VG9rZW4+IHtcclxuICAgIGNvbnN0IHN0cmlwZSA9IGF3YWl0IHRoaXMuZ2V0U3RyaXBlKCk7XHJcbiAgICByZXR1cm4gc3RyaXBlLmNyZWF0ZVRva2VuKCdwaWknLCBkYXRhKS50aGVuKChyZXN1bHQ6IFRva2VuUmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcclxuICAgICAgICBQcm9taXNlLnJlamVjdChyZXN1bHQuZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQudG9rZW47XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBzb3VyY2Ugb2JqZWN0IGZyb20gdGhlIGdpdmVuIGVsZW1lbnQgYW5kIGRhdGFcclxuICAgKlxyXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZnJvbSB3aGljaCB0aGUgZGF0YSBuZWVkcyB0byBiZSBleHRyYWN0ZWRcclxuICAgKiBAcGFyYW0gZGF0YSAtIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0eXBlIG9mIFNvdXJjZSB5b3Ugd2FudCB0byBjcmVhdGUgYW5kIGFueSBhZGRpdGlvbmFsIHBheW1lbnQgc291cmNlIGluZm9ybWF0aW9uXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGluIGEgc291cmNlIG9iamVjdCBvciBhIHJlamVjdGlvbiBpZiB0aGUgY3JlYXRpb24gb2YgdGhlIHNvdXJjZSBmYWlsZWRcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgY3JlYXRlU291cmNlRnJvbUVsZW1lbnQoZWxlbWVudDogU3RyaXBlRWxlbWVudCwgZGF0YTogU291cmNlRGF0YSk6IFByb21pc2U8U291cmNlPiB7XHJcbiAgICBjb25zdCBzdHJpcGUgPSBhd2FpdCB0aGlzLmdldFN0cmlwZSgpO1xyXG4gICAgcmV0dXJuIHN0cmlwZS5jcmVhdGVTb3VyY2UoZWxlbWVudCwgZGF0YSkudGhlbigocmVzdWx0OiBTb3VyY2VSZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xyXG4gICAgICAgIFByb21pc2UucmVqZWN0KHJlc3VsdC5lcnJvcik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdC5zb3VyY2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBzb3VyY2Ugb2JqZWN0IGZyb20gb25seSBkYXRhXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBkYXRhIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgc291cmNlIG9iamVjdFxyXG4gICAqXHJcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBpbiBhIHNvdXJjZSBvYmplY3Qgb3IgYSByZWplY3Rpb24gaWYgdGhlIGNyZWF0aW9uIG9mIHRoZSBzb3VyY2UgZmFpbGVkXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGNyZWF0ZVNvdXJjZUZyb21EYXRhKGRhdGE6IFNvdXJjZURhdGEpOiBQcm9taXNlPFNvdXJjZT4ge1xyXG4gICAgY29uc3Qgc3RyaXBlID0gYXdhaXQgdGhpcy5nZXRTdHJpcGUoKTtcclxuICAgIHJldHVybiBzdHJpcGUuY3JlYXRlU291cmNlKGRhdGEpLnRoZW4oKHJlc3VsdDogU291cmNlUmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcclxuICAgICAgICBQcm9taXNlLnJlamVjdChyZXN1bHQuZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQuc291cmNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIGFuIGV4aXN0aW5nIHNvdXJjZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gcGFyYW1ldGVyc1xyXG4gICAqXHJcbiAgICogQHBhcmFtIGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBzb3VyY2VcclxuICAgKiBAcGFyYW0gY2xpZW50X3NlY3JldCAtIEEgc2VjcmV0IGF2YWlsYWJsZSB0byB0aGUgd2ViIGNsaWVudCB0aGF0IGNyZWF0ZWQgdGhlIFNvdXJjZVxyXG4gICAqXHJcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBpbiBhIHNvdXJjZSBvYmplY3Qgb3IgYSByZWplY3Rpb24gaWYgdGhlIGNyZWF0aW9uIG9mIHRoZSBzb3VyY2UgZmFpbGVkXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGdldFNvdXJjZShpZDogc3RyaW5nLCBjbGllbnRfc2VjcmV0OiBzdHJpbmcpOiBQcm9taXNlPFNvdXJjZT4ge1xyXG4gICAgY29uc3Qgc3RyaXBlID0gYXdhaXQgdGhpcy5nZXRTdHJpcGUoKTtcclxuICAgIHJldHVybiBzdHJpcGUucmV0cmlldmVTb3VyY2Uoe2lkLCBjbGllbnRfc2VjcmV0fSkudGhlbigocmVzdWx0OiBTb3VyY2VSZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xyXG4gICAgICAgIFByb21pc2UucmVqZWN0KHJlc3VsdC5lcnJvcik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdC5zb3VyY2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgdGhlIFN0cmlwZUpTIGluc3RhbmNlXHJcbiAgICogTk9URTogVXNlIHRoZSBpbnN0YW5jZSBmb3IgdG9rZW4gZ2VuZXJhdGlvblxyXG4gICAqXHJcbiAgICogQHJldHVybiBUaGUgU3RyaXBlSlMgaW5zdGFuY2Ugd2hlbiBpdCBpcyBhdmFpbGFibGUgKHNpbmNlIFN0cmlwZUpTIGlzIGxvYWRlZCBBc3luYylcclxuICAgKi9cclxuICBwcml2YXRlIGdldFN0cmlwZSgpOiBQcm9taXNlPFN0cmlwZUpTPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdHJpcGUkLnBpcGUoXHJcbiAgICAgIGZpbHRlcigoc3RyaXBlOiBTdHJpcGVKUyB8IG51bGwpID0+ICEhc3RyaXBlKSxcclxuICAgICAgZmlyc3QoKSxcclxuICAgICkudG9Qcm9taXNlKCkudGhlbigoc3RyaXBlOiBTdHJpcGVKUykgPT4gc3RyaXBlKTtcclxuICB9XHJcbn1cclxuIl19